#ifdef AIX @PROCESS ALIAS_SIZE(805306368) #endif module dlnd_comp_mod 1,12 ! !USES: use shr_sys_mod use shr_kind_mod , only: IN=>SHR_KIND_IN, R8=>SHR_KIND_R8, & CS=>SHR_KIND_CS, CL=>SHR_KIND_CL use shr_file_mod , only: shr_file_getunit, shr_file_getlogunit, shr_file_getloglevel, & shr_file_setlogunit, shr_file_setloglevel, shr_file_setio, & shr_file_freeunit use shr_mpi_mod , only: shr_mpi_bcast use mct_mod use esmf_mod use perf_mod use shr_strdata_mod use shr_dmodel_mod use seq_cdata_mod use seq_infodata_mod use seq_timemgr_mod use seq_flds_indices , only: nflds_l2x, & nflds_x2l, & nflds_r2x, & nflds_x2s, & nflds_s2x use seq_flds_mod , only: seq_flds_l2x_fields, & seq_flds_x2l_fields, & seq_flds_r2x_fields, & seq_flds_x2s_fields, & seq_flds_s2x_fields ! ! !PUBLIC TYPES: implicit none private ! except !-------------------------------------------------------------------------- ! Public interfaces !-------------------------------------------------------------------------- public :: dlnd_comp_init public :: dlnd_comp_run public :: dlnd_comp_final !-------------------------------------------------------------------------- ! Private data !-------------------------------------------------------------------------- !--- other --- character(CS) :: myModelName = 'lnd' ! user defined model name integer(IN) :: mpicom integer(IN) :: my_task ! my task in mpi communicator mpicom integer(IN) :: npes ! total number of tasks integer(IN),parameter :: master_task=0 ! task number of master task integer(IN) :: logunit ! logging unit number character(CL) :: lnd_mode character(CL) :: rof_mode character(CL) :: sno_mode integer(IN) :: dbug = 0 ! debug level (higher is more) logical :: scmMode = .false. ! single column mode real(R8) :: scmLat = shr_const_SPVAL ! single column lat real(R8) :: scmLon = shr_const_SPVAL ! single column lon logical :: read_restart ! start from restart character(len=*),parameter :: rpfile = 'rpointer.lnd' character(len=*),parameter :: nullstr = 'undefined' type(shr_strdata_type),save :: SDLND type(shr_strdata_type),save :: SDROF type(shr_strdata_type),save :: SDSNO type(mct_rearr) :: rearr_l type(mct_rearr) :: rearr_r type(mct_rearr) :: rearr_s integer(IN),parameter :: ktrans = 24 character(12),parameter :: avofld(1:ktrans) = & (/ "Forr_roff ","Forr_ioff ", & "Sl_t ","Sl_tref ","Sl_qref ","Sl_avsdr ","Sl_anidr ", & "Sl_avsdf ","Sl_anidf ","Sl_snowh ","Fall_taux ","Fall_tauy ", & "Fall_lat ","Fall_sen ","Fall_lwup ","Fall_evap ","Fall_swnet ", & "Sl_landfrac ","Sl_fv ","Sl_ram1 ", & "Fall_flxdst1","Fall_flxdst2","Fall_flxdst3","Fall_flxdst4" /) character(12),parameter :: avifld(1:ktrans) = & (/ "roff ","ioff ", & "t ","tref ","qref ","avsdr ","anidr ", & "avsdf ","anidf ","snowh ","taux ","tauy ", & "lat ","sen ","lwup ","evap ","swnet ", & "lfrac ","fv ","ram1 ", & "flddst1 ","flxdst2 ","flxdst3 ","flxdst4 " /) !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ CONTAINS !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ !=============================================================================== !BOP =========================================================================== ! ! !IROUTINE: dlnd_comp_init ! ! !DESCRIPTION: ! initialize data lnd model ! ! !REVISION HISTORY: ! ! !INTERFACE: ------------------------------------------------------------------ subroutine dlnd_comp_init( EClock, cdata_l, x2l, l2x, cdata_r, r2x, & 2,52 cdata_s, x2s, s2x, NLFilename ) implicit none ! !INPUT/OUTPUT PARAMETERS: type(ESMF_Clock) , intent(in) :: EClock type(seq_cdata) , intent(inout) :: cdata_l type(mct_aVect) , intent(inout) :: x2l, l2x type(seq_cdata) , intent(inout) :: cdata_r type(mct_aVect) , intent(inout) :: r2x type(seq_cdata) , intent(inout) :: cdata_s type(mct_aVect) , intent(inout) :: x2s, s2x character(len=*), optional , intent(in) :: NLFilename ! Namelist filename !EOP !--- local variables --- integer(IN) :: n,k ! generic counters integer(IN) :: ierr ! error code integer(IN) :: COMPID ! comp id integer(IN) :: gsize ! global size integer(IN) :: lsize_l, lsize_r, lsize_s ! local size integer(IN) :: shrlogunit, shrloglev ! original log unit and level integer(IN) :: nunit ! unit number logical :: lnd_present ! flag logical :: lnd_prognostic ! flag logical :: rof_present ! flag logical :: sno_present ! flag logical :: sno_prognostic ! flag type(seq_infodata_type), pointer :: infodata type(mct_gsMap) , pointer :: gsMap_l type(mct_gGrid) , pointer :: dom_l type(mct_gsMap) , pointer :: gsMap_r type(mct_gGrid) , pointer :: dom_r type(mct_gsMap) , pointer :: gsMap_s type(mct_gGrid) , pointer :: dom_s character(CL) :: filePath ! generic file path character(CL) :: fileName ! generic file name character(CS) :: timeName ! domain file: time variable name character(CS) :: lonName ! domain file: lon variable name character(CS) :: latName ! domain file: lat variable name character(CS) :: maskName ! domain file: mask variable name character(CS) :: areaName ! domain file: area variable name integer(IN) :: yearFirst ! first year to use in data stream integer(IN) :: yearLast ! last year to use in data stream integer(IN) :: yearAlign ! data year that aligns with yearFirst character(CL) :: lnd_in ! dshr lnd namelist character(CL) :: rof_in ! dshr rof namelist character(CL) :: sno_in ! dshr sno namelist character(CL) :: decomp ! decomp strategy character(CL) :: rest_file ! restart filename character(CL) :: rest_file_strm_l ! restart filename for stream character(CL) :: rest_file_strm_r ! restart filename for stream character(CL) :: rest_file_strm_s ! restart filename for stream character(CL) :: restfilm ! model restart file namelist character(CL) :: restfilsl ! stream restart file namelist character(CL) :: restfilsr ! stream restart file namelist character(CL) :: restfilss ! stream restart file namelist logical :: exists ! file existance logical logical :: exists_l ! file existance logical logical :: exists_r ! file existance logical logical :: exists_s ! file existance logical integer(IN) :: nu ! unit number !----- define namelist ----- namelist / dlnd_nml / & lnd_in, rof_in, sno_in, decomp, restfilm, restfilsl, restfilsr, restfilss !--- formats --- character(*), parameter :: F00 = "('(dlnd_comp_init) ',8a)" character(*), parameter :: F01 = "('(dlnd_comp_init) ',a,5i8)" character(*), parameter :: F02 = "('(dlnd_comp_init) ',a,4es13.6)" character(*), parameter :: F03 = "('(dlnd_comp_init) ',a,i8,a)" character(*), parameter :: F05 = "('(dlnd_comp_init) ',a,2f10.4)" character(*), parameter :: F90 = "('(dlnd_comp_init) ',73('='))" character(*), parameter :: F91 = "('(dlnd_comp_init) ',73('-'))" character(*), parameter :: subName = "(dlnd_comp_init) " !------------------------------------------------------------------------------- call t_startf('DLND_INIT') ! Set cdata pointers call seq_cdata_setptrs(cdata_l, ID=COMPID, mpicom=mpicom, & gsMap=gsMap_l, dom=dom_l, infodata=infodata) call seq_cdata_setptrs(cdata_r, & gsMap=gsMap_r, dom=dom_r) call seq_cdata_setptrs(cdata_s, & gsMap=gsMap_s, dom=dom_s) ! Determine communicator groups and sizes call mpi_comm_rank(mpicom, my_task, ierr) call mpi_comm_size(mpicom, npes, ierr) !--- open log file --- if (my_task == master_task) then logUnit = shr_file_getUnit() call shr_file_setIO('lnd_modelio.nml',logUnit) else logUnit = 6 endif !---------------------------------------------------------------------------- ! Reset shr logging to my log file !---------------------------------------------------------------------------- call shr_file_getLogUnit (shrlogunit) call shr_file_getLogLevel(shrloglev) call shr_file_setLogUnit (logUnit) !---------------------------------------------------------------------------- ! Set a Few Defaults !---------------------------------------------------------------------------- call seq_infodata_getData(infodata,single_column=scmMode, & & scmlat=scmlat, scmlon=scmLon) lnd_present = .false. lnd_prognostic = .false. rof_present = .false. sno_present = .false. sno_prognostic = .false. call seq_infodata_GetData(infodata,read_restart=read_restart) !---------------------------------------------------------------------------- ! Read dlnd_in !---------------------------------------------------------------------------- call t_startf('dlnd_readnml') filename = "dlnd_in" lnd_in = "unset" rof_in = "unset" sno_in = "unset" decomp = "1d" restfilm = trim(nullstr) restfilsl = trim(nullstr) restfilsr = trim(nullstr) restfilss = trim(nullstr) if (my_task == master_task) then nunit = shr_file_getUnit() ! get unused unit number open (nunit,file=trim(filename),status="old",action="read") read (nunit,nml=dlnd_nml,iostat=ierr) close(nunit) call shr_file_freeUnit(nunit) if (ierr > 0) then write(logunit,F01) 'ERROR: reading input namelist, '//trim(filename)//' iostat=',ierr call shr_sys_abort(subName//': namelist read error '//trim(filename)) end if write(logunit,F00)' lnd_in = ',trim(lnd_in) write(logunit,F00)' rof_in = ',trim(rof_in) write(logunit,F00)' sno_in = ',trim(sno_in) write(logunit,F00)' decomp = ',trim(decomp) write(logunit,F00)' restfilm = ',trim(restfilm) write(logunit,F00)' restfilsl = ',trim(restfilsl) write(logunit,F00)' restfilsr = ',trim(restfilsr) write(logunit,F00)' restfilss = ',trim(restfilss) endif call shr_mpi_bcast(lnd_in,mpicom,'lnd_in') call shr_mpi_bcast(rof_in,mpicom,'rof_in') call shr_mpi_bcast(sno_in,mpicom,'sno_in') call shr_mpi_bcast(decomp,mpicom,'decomp') call shr_mpi_bcast(restfilm,mpicom,'restfilm') call shr_mpi_bcast(restfilsl,mpicom,'restfilsl') call shr_mpi_bcast(restfilsr,mpicom,'restfilsr') call shr_mpi_bcast(restfilss,mpicom,'restfilss') rest_file = trim(restfilm) rest_file_strm_l = trim(restfilsl) rest_file_strm_r = trim(restfilsr) rest_file_strm_s = trim(restfilss) !---------------------------------------------------------------------------- ! Read dshr namelist !---------------------------------------------------------------------------- call shr_strdata_readnml(SDLND,trim(lnd_in),mpicom=mpicom) call shr_strdata_readnml(SDROF,trim(rof_in),mpicom=mpicom) call shr_strdata_readnml(SDSNO,trim(sno_in),mpicom=mpicom) !---------------------------------------------------------------------------- ! Validate mode !---------------------------------------------------------------------------- lnd_mode = trim(SDLND%dataMode) rof_mode = trim(SDROF%dataMode) sno_mode = trim(SDSNO%dataMode) ! check that we know how to handle the mode if (trim(lnd_mode) == 'NULL' .or. & trim(lnd_mode) == 'CPLHIST') then if (my_task == master_task) & write(logunit,F00) ' lnd mode = ',trim(lnd_mode) else write(logunit,F00) ' ERROR illegal lnd mode = ',trim(lnd_mode) call shr_sys_abort() endif if (trim(rof_mode) == 'NULL' .or. & trim(rof_mode) == 'CPLHIST' .or. & trim(rof_mode) == 'RX1') then if (my_task == master_task) & write(logunit,F00) ' rof mode = ',trim(rof_mode) else write(logunit,F00) ' ERROR illegal rof mode = ',trim(rof_mode) call shr_sys_abort() endif if (trim(sno_mode) == 'NULL') then if (my_task == master_task) & write(logunit,F00) ' sno mode = ',trim(sno_mode) else write(logunit,F00) ' ERROR illegal sno mode = ',trim(sno_mode) call shr_sys_abort() endif call t_stopf('dlnd_readnml') !---------------------------------------------------------------------------- ! Initialize datasets !---------------------------------------------------------------------------- call t_startf('dlnd_strdata_init') if (trim(lnd_mode) /= 'NULL') then lnd_present = .true. if (scmmode) then if (my_task == master_task) & write(logunit,F05) ' scm lon lat = ',scmlon,scmlat call shr_strdata_init(SDLND,mpicom,compid,name='lnd', & scmmode=scmmode,scmlon=scmlon,scmlat=scmlat) else call shr_strdata_init(SDLND,mpicom,compid,name='lnd') endif endif if (trim(rof_mode) /= 'NULL') then rof_present = .true. if (scmmode) then call shr_strdata_init(SDROF,mpicom,compid,name='rof', & scmmode=scmmode,scmlon=scmlon,scmlat=scmlat) else call shr_strdata_init(SDROF,mpicom,compid,name='rof') endif endif if (trim(sno_mode) /= 'NULL') then sno_present = .true. if (scmmode) then call shr_strdata_init(SDSNO,mpicom,compid,name='sno', & scmmode=scmmode,scmlon=scmlon,scmlat=scmlat) else call shr_strdata_init(SDSNO,mpicom,compid,name='sno') endif endif if (my_task == master_task) then call shr_strdata_print(SDLND,'SDLND data') call shr_strdata_print(SDROF,'SDROF data') call shr_strdata_print(SDSNO,'SDSNO data') endif call t_stopf('dlnd_strdata_init') !---------------------------------------------------------------------------- ! Set flag to specify data components !---------------------------------------------------------------------------- call seq_infodata_PutData(infodata, & lnd_present=lnd_present, lnd_prognostic=lnd_prognostic, & rof_present=rof_present, sno_present=sno_present, sno_prognostic=sno_prognostic, & lnd_nx=SDLND%nxg, lnd_ny=SDLND%nyg, rof_nx=SDROF%nxg, rof_ny=SDROF%nyg, & sno_nx=SDSNO%nxg, sno_ny=SDSNO%nyg) !---------------------------------------------------------------------------- ! Initialize MCT global seg map, 1d decomp !---------------------------------------------------------------------------- call t_startf('dlnd_initgsmaps') if (my_task == master_task) write(logunit,F00) ' initialize gsmaps' call shr_sys_flush(logunit) call shr_dmodel_gsmapcreate(gsmap_l,SDLND%nxg*SDLND%nyg,compid,mpicom,decomp) call shr_dmodel_gsmapcreate(gsmap_r,SDROF%nxg*SDROF%nyg,compid,mpicom,decomp) call shr_dmodel_gsmapcreate(gsmap_s,SDSNO%nxg*SDSNO%nyg,compid,mpicom,decomp) lsize_l = mct_gsmap_lsize(gsmap_l,mpicom) lsize_r = mct_gsmap_lsize(gsmap_r,mpicom) lsize_s = mct_gsmap_lsize(gsmap_s,mpicom) if (lnd_present) then call mct_rearr_init(SDLND%gsmap,gsmap_l,mpicom,rearr_l) endif if (rof_present) then call mct_rearr_init(SDROF%gsmap,gsmap_r,mpicom,rearr_r) endif if (sno_present) then call mct_rearr_init(SDSNO%gsmap,gsmap_s,mpicom,rearr_s) endif call t_stopf('dlnd_initgsmaps') !---------------------------------------------------------------------------- ! Initialize MCT domain !---------------------------------------------------------------------------- call t_startf('dlnd_initmctdom') if (my_task == master_task) write(logunit,F00) 'copy domains' call shr_sys_flush(logunit) if (lnd_present) call shr_dmodel_rearrGGrid(SDLND%grid, dom_l, gsmap_l, rearr_l, mpicom) if (rof_present) call shr_dmodel_rearrGGrid(SDROF%grid, dom_r, gsmap_r, rearr_r, mpicom) if (sno_present) call shr_dmodel_rearrGGrid(SDSNO%grid, dom_s, gsmap_s, rearr_s, mpicom) call t_stopf('dlnd_initmctdom') !---------------------------------------------------------------------------- ! Initialize MCT attribute vectors !---------------------------------------------------------------------------- call t_startf('dlnd_initmctavs') if (my_task == master_task) write(logunit,F00) 'allocate AVs' call shr_sys_flush(logunit) call mct_aVect_init(l2x, rList=seq_flds_l2x_fields, lsize=lsize_l) call mct_aVect_zero(l2x) call mct_aVect_init(x2l, rList=seq_flds_x2l_fields, lsize=lsize_l) call mct_aVect_zero(x2l) call mct_aVect_init(r2x, rList=seq_flds_r2x_fields, lsize=lsize_r) call mct_aVect_zero(r2x) call mct_aVect_init(x2s, rList=seq_flds_x2s_fields, lsize=lsize_s) call mct_aVect_zero(x2s) call mct_aVect_init(s2x, rList=seq_flds_s2x_fields, lsize=lsize_s) call mct_aVect_zero(s2x) call t_stopf('dlnd_initmctavs') !---------------------------------------------------------------------------- ! Read restart !---------------------------------------------------------------------------- if (read_restart) then if (trim(rest_file) == trim(nullstr) .and. & trim(rest_file_strm_l) == trim(nullstr) .and. & trim(rest_file_strm_r) == trim(nullstr) .and. & trim(rest_file_strm_s) == trim(nullstr)) then if (my_task == master_task) then write(logunit,F00) ' restart filenames from rpointer' call shr_sys_flush(logunit) inquire(file=trim(rpfile),exist=exists) if (.not.exists) then write(logunit,F00) ' ERROR: rpointer file does not exist' call shr_sys_abort(trim(subname)//' ERROR: rpointer file missing') endif nu = shr_file_getUnit() open(nu,file=trim(rpfile),form='formatted') read(nu,'(a)') rest_file read(nu,'(a)') rest_file_strm_l read(nu,'(a)') rest_file_strm_r read(nu,'(a)') rest_file_strm_s close(nu) call shr_file_freeUnit(nu) inquire(file=trim(rest_file_strm_l),exist=exists_l) inquire(file=trim(rest_file_strm_r),exist=exists_r) inquire(file=trim(rest_file_strm_s),exist=exists_s) endif call shr_mpi_bcast(rest_file,mpicom,'rest_file') call shr_mpi_bcast(rest_file_strm_l,mpicom,'rest_file_strm_l') call shr_mpi_bcast(rest_file_strm_r,mpicom,'rest_file_strm_r') call shr_mpi_bcast(rest_file_strm_s,mpicom,'rest_file_strm_s') else ! use namelist already read if (my_task == master_task) then write(logunit,F00) ' restart filenames from namelist ' call shr_sys_flush(logunit) inquire(file=trim(rest_file_strm_l),exist=exists_l) inquire(file=trim(rest_file_strm_r),exist=exists_r) inquire(file=trim(rest_file_strm_s),exist=exists_s) endif endif call shr_mpi_bcast(exists_l,mpicom,'exists_l') call shr_mpi_bcast(exists_r,mpicom,'exists_r') call shr_mpi_bcast(exists_s,mpicom,'exists_s') ! if (my_task == master_task) write(logunit,F00) ' reading ',trim(rest_file) ! call shr_pcdf_readwrite('read',trim(rest_file),mpicom,gsmap,rf1=somtp,rf1n='somtp') if (exists_l) then if (my_task == master_task) write(logunit,F00) ' reading ',trim(rest_file_strm_l) call shr_strdata_restRead(trim(rest_file_strm_l),SDLND,mpicom) else if (my_task == master_task) write(logunit,F00) ' file not found, skipping ',trim(rest_file_strm_l) endif if (exists_r) then if (my_task == master_task) write(logunit,F00) ' reading ',trim(rest_file_strm_r) call shr_strdata_restRead(trim(rest_file_strm_r),SDROF,mpicom) else if (my_task == master_task) write(logunit,F00) ' file not found, skipping ',trim(rest_file_strm_r) endif if (exists_s) then if (my_task == master_task) write(logunit,F00) ' reading ',trim(rest_file_strm_s) call shr_strdata_restRead(trim(rest_file_strm_s),SDSNO,mpicom) else if (my_task == master_task) write(logunit,F00) ' file not found, skipping ',trim(rest_file_strm_s) endif call shr_sys_flush(logunit) endif !---------------------------------------------------------------------------- ! Set initial lnd state, needed for CCSM atm initialization !---------------------------------------------------------------------------- call t_adj_detailf(+2) call dlnd_comp_run( EClock, cdata_l, x2l, l2x, cdata_r, r2x, cdata_s, x2s, s2x) call t_adj_detailf(-2) !---------------------------------------------------------------------------- ! Reset shr logging to original values !---------------------------------------------------------------------------- if (my_task == master_task) write(logunit,F00) 'dlnd_comp_init done' call shr_sys_flush(logunit) call shr_file_setLogUnit (shrlogunit) call shr_file_setLogLevel(shrloglev) call shr_sys_flush(logunit) call t_stopf('DLND_INIT') end subroutine dlnd_comp_init !=============================================================================== !BOP =========================================================================== ! ! !IROUTINE: dlnd_comp_run ! ! !DESCRIPTION: ! run method for dead lnd model ! ! !REVISION HISTORY: ! ! !INTERFACE: ------------------------------------------------------------------ subroutine dlnd_comp_run( EClock, cdata_l, x2l, l2x, cdata_r, r2x, cdata_s, x2s, s2x) 2,28 implicit none ! !INPUT/OUTPUT PARAMETERS: type(ESMF_Clock) ,intent(in) :: EClock type(seq_cdata) ,intent(inout) :: cdata_l type(mct_aVect) ,intent(inout) :: x2l ! driver -> dead type(mct_aVect) ,intent(inout) :: l2x ! dead -> driver type(seq_cdata) ,intent(in) :: cdata_r type(mct_aVect) ,intent(inout) :: r2x type(seq_cdata) ,intent(inout) :: cdata_s type(mct_aVect) ,intent(inout) :: x2s type(mct_aVect) ,intent(inout) :: s2x !EOP !--- local --- type(mct_gsMap) , pointer :: gsMap_l type(mct_gGrid) , pointer :: dom_l type(mct_gsMap) , pointer :: gsMap_r type(mct_gGrid) , pointer :: dom_r type(mct_gsMap) , pointer :: gsMap_s type(mct_gGrid) , pointer :: dom_s integer(IN) :: CurrentYMD ! model date integer(IN) :: CurrentTOD ! model sec into model date integer(IN) :: yy,mm,dd ! year month day integer(IN) :: n ! indices integer(IN) :: nf ! fields loop index integer(IN) :: nl ! land frac index integer(IN) :: kl ! index of landfrac integer(IN) :: lsize_l,lsize_r,lsize_s ! size of attr vect integer(IN) :: shrlogunit, shrloglev ! original log unit and level logical :: glcrun_alarm ! is glc going to run now logical :: newdata ! has newdata been read logical :: mssrmlf ! remove old data logical :: write_restart ! restart now character(CL) :: case_name ! case name character(CL) :: rest_file ! restart_file character(CL) :: rest_file_strm_l ! restart_file for stream character(CL) :: rest_file_strm_r ! restart_file for stream character(CL) :: rest_file_strm_s ! restart_file for stream integer(IN) :: nu ! unit number type(seq_infodata_type), pointer :: infodata character(*), parameter :: F00 = "('(dlnd_comp_run) ',8a)" character(*), parameter :: F04 = "('(dlnd_comp_run) ',2a,2i8,'s')" character(*), parameter :: subName = "(dlnd_comp_run) " !------------------------------------------------------------------------------- call t_startf('DLND_RUN') call t_startf('dlnd_run1') !---------------------------------------------------------------------------- ! Reset shr logging to my log file !---------------------------------------------------------------------------- call shr_file_getLogUnit (shrlogunit) call shr_file_getLogLevel(shrloglev) call shr_file_setLogUnit (logUnit) call seq_cdata_setptrs(cdata_l, gsMap=gsMap_l, dom=dom_l) call seq_cdata_setptrs(cdata_r, gsMap=gsMap_r, dom=dom_r) call seq_cdata_setptrs(cdata_s, gsMap=gsMap_s, dom=dom_s) call seq_cdata_setptrs(cdata_l, infodata=infodata) call seq_infodata_getData(infodata, glcrun_alarm=glcrun_alarm) call seq_timemgr_EClockGetData( EClock, curr_ymd=CurrentYMD, curr_tod=CurrentTOD) call seq_timemgr_EClockGetData( EClock, curr_yr=yy, curr_mon=mm, curr_day=dd) write_restart = seq_timemgr_RestartAlarmIsOn(EClock) lsize_l = mct_avect_lsize(x2l) lsize_r = mct_avect_lsize(r2x) lsize_s = mct_avect_lsize(x2s) call t_stopf('dlnd_run1') !-------------------- ! UNPACK !-------------------- call t_startf('dlnd_unpack') ! do nf=1,nflds_x2l ! do n=1,lsize_l ! ?? = x2l%rAttr(nf,n) ! enddo ! enddo ! do nf=1,nflds_x2s ! do n=1,lsize_s ! ?? = x2s%rAttr(nf,n) ! enddo ! enddo call t_stopf('dlnd_unpack') !-------------------- ! ADVANCE LAND !-------------------- call t_barrierf('dlnd_l_BARRIER',mpicom) call t_startf('dlnd_l') if (trim(lnd_mode) /= 'NULL') then call t_startf('dlnd_l_strdata_advance') call shr_strdata_advance(SDLND,currentYMD,currentTOD,mpicom,'dlnd_l') call t_stopf('dlnd_l_strdata_advance') call t_barrierf('dlnd_l_scatter_BARRIER',mpicom) call t_startf('dlnd_l_scatter') do n = 1,SDLND%nstreams call shr_dmodel_translateAV(SDLND%avs(n),l2x,avifld,avofld,rearr_l) enddo call t_stopf('dlnd_l_scatter') else call mct_aVect_zero(l2x) endif call t_stopf('dlnd_l') !-------------------- ! ADVANCE ROF !-------------------- call t_barrierf('dlnd_r_BARRIER',mpicom) call t_startf('dlnd_r') if (trim(rof_mode) /= 'NULL') then call t_startf('dlnd_r_strdata_advance') call shr_strdata_advance(SDROF,currentYMD,currentTOD,mpicom,'dlnd_r') call t_stopf('dlnd_r_strdata_advance') call t_barrierf('dlnd_r_scatter_BARRIER',mpicom) call t_startf('dlnd_r_scatter') do n = 1,SDROF%nstreams call shr_dmodel_translateAV(SDROF%avs(n),r2x,avifld,avofld,rearr_r) enddo call t_stopf('dlnd_r_scatter') ! zero out "special values" do nf=1,nflds_r2x do n=1,lsize_r if (abs(r2x%rAttr(nf,n)) > 1.0e28) r2x%rAttr(nf,n) = 0.0_r8 enddo enddo else call mct_aVect_zero(r2x) endif call t_stopf('dlnd_r') !-------------------- ! ADVANCE SNO !-------------------- call t_barrierf('dlnd_s_BARRIER',mpicom) call t_startf('dlnd_s') if (glcrun_alarm) then if (trim(sno_mode) /= 'NULL') then call t_startf('dlnd_s_strdata_advance') call shr_strdata_advance(SDSNO,currentYMD,currentTOD,mpicom,'dlnd_s') call t_stopf('dlnd_s_strdata_advance') call t_barrierf('dlnd_s_scatter_BARRIER',mpicom) call t_startf('dlnd_s_scatter') do n = 1,SDSNO%nstreams call shr_dmodel_translateAV(SDSNO%avs(n),s2x,avifld,avofld,rearr_s) enddo call t_stopf('dlnd_s_scatter') else call mct_aVect_zero(s2x) endif endif call t_stopf('dlnd_s') if (write_restart) then call t_startf('dlnd_restart') call seq_infodata_GetData( infodata, case_name=case_name) write(rest_file,"(2a,i4.4,a,i2.2,a,i2.2,a,i5.5,a)") & trim(case_name), '.dlnd.r.', yy,'-',mm,'-',dd,'-',currentTOD,'.nc' write(rest_file_strm_l,"(2a,i4.4,a,i2.2,a,i2.2,a,i5.5,a)") & trim(case_name), '.dlnd.rs1.', yy,'-',mm,'-',dd,'-',currentTOD,'.bin' write(rest_file_strm_r,"(2a,i4.4,a,i2.2,a,i2.2,a,i5.5,a)") & trim(case_name), '.dlnd.rs2.', yy,'-',mm,'-',dd,'-',currentTOD,'.bin' write(rest_file_strm_s,"(2a,i4.4,a,i2.2,a,i2.2,a,i5.5,a)") & trim(case_name), '.dlnd.rs3.', yy,'-',mm,'-',dd,'-',currentTOD,'.bin' if (my_task == master_task) then nu = shr_file_getUnit() open(nu,file=trim(rpfile),form='formatted') write(nu,'(a)') rest_file write(nu,'(a)') rest_file_strm_l write(nu,'(a)') rest_file_strm_r write(nu,'(a)') rest_file_strm_s close(nu) call shr_file_freeUnit(nu) endif ! if (my_task == master_task) write(logunit,F04) ' writing ',trim(rest_file),currentYMD,currentTOD ! call shr_pcdf_readwrite('write',trim(rest_file),mpicom,gsmap,clobber=.true., & ! rf1=somtp,rf1n='somtp') if (my_task == master_task) write(logunit,F04) ' writing ',trim(rest_file_strm_l),currentYMD,currentTOD call shr_strdata_restWrite(trim(rest_file_strm_l),SDLND,mpicom,trim(case_name),'SDLND strdata') if (my_task == master_task) write(logunit,F04) ' writing ',trim(rest_file_strm_r),currentYMD,currentTOD call shr_strdata_restWrite(trim(rest_file_strm_r),SDROF,mpicom,trim(case_name),'SDROF strdata') if (my_task == master_task) write(logunit,F04) ' writing ',trim(rest_file_strm_s),currentYMD,currentTOD call shr_strdata_restWrite(trim(rest_file_strm_s),SDSNO,mpicom,trim(case_name),'SDSNO strdata') call shr_sys_flush(logunit) call t_stopf('dlnd_restart') endif !---------------------------------------------------------------------------- ! Log output for model date ! Reset shr logging to original values !---------------------------------------------------------------------------- call t_startf('dlnd_run2') if (my_task == master_task) then write(logunit,F04) trim(myModelName),': model date ', CurrentYMD,CurrentTOD call shr_sys_flush(logunit) end if call shr_file_setLogUnit (shrlogunit) call shr_file_setLogLevel(shrloglev) call shr_sys_flush(logunit) call t_stopf('dlnd_run2') call t_stopf('DLND_RUN') end subroutine dlnd_comp_run !=============================================================================== !BOP =========================================================================== ! ! !IROUTINE: dlnd_comp_final ! ! !DESCRIPTION: ! finalize method for dead lnd model ! ! !REVISION HISTORY: ! ! !INTERFACE: ------------------------------------------------------------------ ! subroutine dlnd_comp_final() 1 implicit none !EOP !--- formats --- character(*), parameter :: F00 = "('(dlnd_comp_final) ',8a)" character(*), parameter :: F91 = "('(dlnd_comp_final) ',73('-'))" character(*), parameter :: subName = "(dlnd_comp_final) " !------------------------------------------------------------------------------- ! !------------------------------------------------------------------------------- call t_startf('DLND_FINAL') if (my_task == master_task) then write(logunit,F91) write(logunit,F00) trim(myModelName),': end of main integration loop' write(logunit,F91) end if call t_stopf('DLND_FINAL') end subroutine dlnd_comp_final !=============================================================================== !=============================================================================== end module dlnd_comp_mod