From 69a3a6156a574d9686be1953243872d564c17acb Mon Sep 17 00:00:00 2001 From: Jun Wang <37633869+junwang-noaa@users.noreply.github.com> Date: Wed, 14 Apr 2021 16:29:37 -0400 Subject: [PATCH] remove FoX depdencies (#17) * remove FoX depdencies * remove fox submodule * update streamfilename Co-authored-by: Jun Wang --- .gitmodules | 3 - datm/atm_comp_nuopc.F90 | 11 +- dice/ice_comp_nuopc.F90 | 11 +- dlnd/lnd_comp_nuopc.F90 | 11 +- docn/ocn_comp_nuopc.F90 | 11 +- drof/rof_comp_nuopc.F90 | 11 +- dshr/dshr_mod.F90 | 2 +- dwav/wav_comp_nuopc.F90 | 11 +- fox | 1 - streams/dshr_strdata_mod.F90 | 22 ++-- streams/dshr_stream_mod.F90 | 205 ++++++++++++++++++++++++++++++++++- 11 files changed, 259 insertions(+), 40 deletions(-) delete mode 160000 fox diff --git a/.gitmodules b/.gitmodules index eff7950f..e69de29b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +0,0 @@ -[submodule "fox"] - path = fox - url = https://github.com/ESMCI/fox.git diff --git a/datm/atm_comp_nuopc.F90 b/datm/atm_comp_nuopc.F90 index c53b1464..0e896454 100644 --- a/datm/atm_comp_nuopc.F90 +++ b/datm/atm_comp_nuopc.F90 @@ -26,7 +26,7 @@ module atm_comp_nuopc use shr_cal_mod , only : shr_cal_ymd2date, shr_cal_ymd2julian, shr_cal_date2julian use shr_mpi_mod , only : shr_mpi_bcast use dshr_methods_mod , only : dshr_state_diagnose, chkerr, memcheck - use dshr_strdata_mod , only : shr_strdata_type, shr_strdata_init_from_xml, shr_strdata_advance + use dshr_strdata_mod , only : shr_strdata_type, shr_strdata_init_from_config, shr_strdata_advance use dshr_strdata_mod , only : shr_strdata_get_stream_pointer, shr_strdata_setOrbs use dshr_mod , only : dshr_model_initphase, dshr_init use dshr_mod , only : dshr_state_setscalar, dshr_set_runclock, dshr_log_clock_advance @@ -111,7 +111,7 @@ module atm_comp_nuopc ! datm_in namelist input character(CL) :: nlfilename = nullstr ! filename to obtain namelist info from - character(CL) :: xmlfilename = nullstr ! filename to obtain namelist info from + character(CL) :: streamfilename = nullstr ! filename to obtain stream info from character(CL) :: dataMode = nullstr ! flags physics options wrt input data character(CL) :: model_meshfile = nullstr ! full pathname to model meshfile character(CL) :: model_maskfile = nullstr ! full pathname to obtain mask from @@ -392,8 +392,11 @@ subroutine InitializeRealize(gcomp, importState, exportState, clock, rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return ! Initialize stream data type - xmlfilename = 'datm.streams'//trim(inst_suffix)//'.xml' - call shr_strdata_init_from_xml(sdat, xmlfilename, model_mesh, clock, 'ATM', logunit, rc=rc) + streamfilename = 'datm.streams'//trim(inst_suffix) +#ifndef DISABLE_FoX + streamfilename = trim(streamfilename)//'.xml' +#endif + call shr_strdata_init_from_config(sdat, streamfilename, model_mesh, clock, 'ATM', logunit, rc=rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return call ESMF_TraceRegionExit('datm_strdata_init') diff --git a/dice/ice_comp_nuopc.F90 b/dice/ice_comp_nuopc.F90 index 4fd0fa5f..2ebe8458 100644 --- a/dice/ice_comp_nuopc.F90 +++ b/dice/ice_comp_nuopc.F90 @@ -27,7 +27,7 @@ module ice_comp_nuopc use dshr_mod , only : dshr_model_initphase, dshr_init, dshr_mesh_init use dshr_mod , only : dshr_state_setscalar, dshr_set_runclock, dshr_log_clock_advance use dshr_methods_mod , only : dshr_state_diagnose, chkerr, memcheck - use dshr_strdata_mod , only : shr_strdata_type, shr_strdata_init_from_xml, shr_strdata_advance + use dshr_strdata_mod , only : shr_strdata_type, shr_strdata_init_from_config, shr_strdata_advance use dshr_dfield_mod , only : dfield_type, dshr_dfield_add, dshr_dfield_copy use dshr_fldlist_mod , only : fldlist_type, dshr_fldlist_add, dshr_fldlist_realize @@ -68,7 +68,7 @@ module ice_comp_nuopc character(*) , parameter :: nullstr = 'null' ! dice_in namelist input - character(CL) :: xmlfilename = nullstr ! filename to obtain namelist info from + character(CL) :: streamfilename = nullstr ! filename to obtain stream info from character(CL) :: nlfilename = nullstr ! filename to obtain namelist info from character(CL) :: dataMode ! flags physics options wrt input data character(CL) :: model_meshfile = nullstr ! full pathname to model meshfile @@ -307,8 +307,11 @@ subroutine InitializeRealize(gcomp, importState, exportState, clock, rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return ! Initialize stream data type - xmlfilename = 'dice.streams'//trim(inst_suffix)//'.xml' - call shr_strdata_init_from_xml(sdat, xmlfilename, model_mesh, clock, 'ICE', logunit, rc=rc) + streamfilename = 'dice.streams'//trim(inst_suffix) +#ifndef DISABLE_FoX + streamfilename = trim(streamfilename)//'.xml' +#endif + call shr_strdata_init_from_config(sdat, streamfilename, model_mesh, clock, 'ICE', logunit, rc=rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return call ESMF_TraceRegionExit('dice_strdata_init') diff --git a/dlnd/lnd_comp_nuopc.F90 b/dlnd/lnd_comp_nuopc.F90 index 5e0cc6c9..f863e2c8 100644 --- a/dlnd/lnd_comp_nuopc.F90 +++ b/dlnd/lnd_comp_nuopc.F90 @@ -24,7 +24,7 @@ module lnd_comp_nuopc use shr_mpi_mod , only : shr_mpi_bcast use dshr_methods_mod , only : dshr_state_getfldptr, dshr_state_diagnose, chkerr, memcheck use dshr_strdata_mod , only : shr_strdata_type, shr_strdata_advance, shr_strdata_get_stream_domain - use dshr_strdata_mod , only : shr_strdata_init_from_xml + use dshr_strdata_mod , only : shr_strdata_init_from_config use dshr_mod , only : dshr_model_initphase, dshr_init use dshr_mod , only : dshr_state_setscalar, dshr_set_runclock, dshr_log_clock_advance use dshr_mod , only : dshr_restart_read, dshr_restart_write, dshr_mesh_init @@ -70,7 +70,7 @@ module lnd_comp_nuopc character(CL) :: model_meshfile = nullstr ! full pathname to model meshfile character(CL) :: model_maskfile = nullstr ! full pathname to obtain mask from character(CL) :: model_createmesh_fromfile = nullstr ! full pathname to obtain mask from - character(CL) :: xmlfilename ! filename to obtain stream info from + character(CL) :: streamfilename ! filename to obtain stream info from character(CL) :: nlfilename = nullstr ! filename to obtain namelist info from logical :: force_prognostic_true = .false. ! if true set prognostic true character(CL) :: restfilm = nullstr ! model restart file namelist @@ -287,8 +287,11 @@ subroutine InitializeRealize(gcomp, importState, exportState, clock, rc) model_mask, model_frac, restart_read, rc=rc) ! Initialize stream data type - xmlfilename = 'dlnd.streams'//trim(inst_suffix)//'.xml' - call shr_strdata_init_from_xml(sdat, xmlfilename, model_mesh, clock, 'LND', logunit, rc=rc) + streamfilename = 'dlnd.streams'//trim(inst_suffix) +#ifndef DISABLE_FoX + streamfilename = trim(streamfilename)'.xml' +#endif + call shr_strdata_init_from_config(sdat, streamfilename, model_mesh, clock, 'LND', logunit, rc=rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return call ESMF_TraceRegionExit('dlnd_strdata_init') diff --git a/docn/ocn_comp_nuopc.F90 b/docn/ocn_comp_nuopc.F90 index b6c3b15e..86ad49a7 100644 --- a/docn/ocn_comp_nuopc.F90 +++ b/docn/ocn_comp_nuopc.F90 @@ -23,7 +23,7 @@ module ocn_comp_nuopc use shr_cal_mod , only : shr_cal_ymd2date use shr_mpi_mod , only : shr_mpi_bcast use dshr_methods_mod , only : dshr_state_diagnose, chkerr, memcheck - use dshr_strdata_mod , only : shr_strdata_type, shr_strdata_advance, shr_strdata_init_from_xml + use dshr_strdata_mod , only : shr_strdata_type, shr_strdata_advance, shr_strdata_init_from_config use dshr_mod , only : dshr_model_initphase, dshr_init, dshr_mesh_init use dshr_mod , only : dshr_state_setscalar, dshr_set_runclock use dshr_dfield_mod , only : dfield_type, dshr_dfield_add, dshr_dfield_copy @@ -81,7 +81,7 @@ module ocn_comp_nuopc character(*) , parameter :: nullstr = 'null' ! docn_in namelist input - character(CL) :: xmlfilename = nullstr ! filename to obtain namelist info from + character(CL) :: streamfilename = nullstr ! filename to obtain stream info from character(CL) :: nlfilename = nullstr ! filename to obtain namelist info from character(CL) :: datamode = nullstr ! flags physics options wrt input data character(CL) :: model_meshfile = nullstr ! full pathname to model meshfile @@ -329,8 +329,11 @@ subroutine InitializeRealize(gcomp, importState, exportState, clock, rc) ! Initialize stream data type if not aqua planet if (.not. aquaplanet) then - xmlfilename = trim(modelname)//'.streams'//trim(inst_suffix)//'.xml' - call shr_strdata_init_from_xml(sdat, xmlfilename, model_mesh, clock, 'OCN', logunit, rc=rc) + streamfilename = trim(modelname)//'.streams'//trim(inst_suffix) +#ifndef DISABLE_FoX + streamfilename = trim(streamfilename)//'.xml' +#endif + call shr_strdata_init_from_config(sdat, streamfilename, model_mesh, clock, 'OCN', logunit, rc=rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return end if call ESMF_TraceRegionExit('docn_strdata_init') diff --git a/drof/rof_comp_nuopc.F90 b/drof/rof_comp_nuopc.F90 index 27c0139d..a9937f1a 100644 --- a/drof/rof_comp_nuopc.F90 +++ b/drof/rof_comp_nuopc.F90 @@ -25,7 +25,7 @@ module rof_comp_nuopc use shr_mpi_mod , only : shr_mpi_bcast use dshr_methods_mod , only : dshr_state_getfldptr, dshr_state_diagnose, chkerr, memcheck use dshr_strdata_mod , only : shr_strdata_type, shr_strdata_advance, shr_strdata_get_stream_domain - use dshr_strdata_mod , only : shr_strdata_init_from_xml + use dshr_strdata_mod , only : shr_strdata_init_from_config use dshr_mod , only : dshr_model_initphase, dshr_init use dshr_mod , only : dshr_state_setscalar, dshr_set_runclock use dshr_mod , only : dshr_restart_read, dshr_restart_write, dshr_mesh_init @@ -61,7 +61,7 @@ module rof_comp_nuopc character(CL) :: case_name ! case name character(*) , parameter :: nullstr = 'null' ! drof_in namelist input - character(CL) :: xmlfilename = nullstr ! filename to obtain namelist info from + character(CL) :: streamfilename = nullstr ! filename to obtain stream info from character(CL) :: nlfilename = nullstr ! filename to obtain namelist info from character(CL) :: dataMode = nullstr ! flags physics options wrt input data character(CL) :: model_meshfile = nullstr ! full pathname to model meshfile @@ -285,8 +285,11 @@ subroutine InitializeRealize(gcomp, importState, exportState, clock, rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return ! Initialize stream data type - xmlfilename = 'drof.streams'//trim(inst_suffix)//'.xml' - call shr_strdata_init_from_xml(sdat, xmlfilename, model_mesh, clock, 'ROF', logunit, rc=rc) + streamfilename = 'drof.streams'//trim(inst_suffix) +#ifndef DISABLE_FOX + streamfilename = trim(streamfilename)//'.xml' +#endif + call shr_strdata_init_from_config(sdat, streamfilename, model_mesh, clock, 'ROF', logunit, rc=rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return call ESMF_TraceRegionExit('drof_strdata_init') diff --git a/dshr/dshr_mod.F90 b/dshr/dshr_mod.F90 index 0ad235a1..72969d48 100644 --- a/dshr/dshr_mod.F90 +++ b/dshr/dshr_mod.F90 @@ -41,7 +41,7 @@ module dshr_mod #ifdef CESMCOUPLED use shr_pio_mod , only : shr_pio_getiosys, shr_pio_getiotype, shr_pio_getioformat #endif - use dshr_strdata_mod , only : shr_strdata_type, shr_strdata_init_from_xml, SHR_STRDATA_GET_STREAM_COUNT + use dshr_strdata_mod , only : shr_strdata_type, SHR_STRDATA_GET_STREAM_COUNT use dshr_methods_mod , only : chkerr use pio diff --git a/dwav/wav_comp_nuopc.F90 b/dwav/wav_comp_nuopc.F90 index 70f360d4..2159a8c1 100644 --- a/dwav/wav_comp_nuopc.F90 +++ b/dwav/wav_comp_nuopc.F90 @@ -24,7 +24,7 @@ module wav_comp_nuopc use shr_mpi_mod , only : shr_mpi_bcast use dshr_methods_mod , only : dshr_state_getfldptr, chkerr, memcheck, dshr_state_diagnose use dshr_strdata_mod , only : shr_strdata_type, shr_strdata_advance - use dshr_strdata_mod , only : shr_strdata_init_from_xml + use dshr_strdata_mod , only : shr_strdata_init_from_config use dshr_mod , only : dshr_model_initphase, dshr_init use dshr_mod , only : dshr_state_setscalar, dshr_set_runclock, dshr_log_clock_advance use dshr_mod , only : dshr_restart_read, dshr_restart_write, dshr_mesh_init @@ -64,7 +64,7 @@ module wav_comp_nuopc character(*) , parameter :: nullstr = 'null' ! dwav_in namelist input - character(CL) :: xmlfilename = nullstr ! filename to obtain namelist info from + character(CL) :: streamfilename = nullstr ! filename to obtain stream info from character(CL) :: nlfilename = nullstr ! filename to obtain namelist info from character(CL) :: dataMode = nullstr ! flags physics options wrt input data character(CL) :: model_meshfile = nullstr ! full pathname to model meshfile @@ -273,8 +273,11 @@ subroutine InitializeRealize(gcomp, importState, exportState, clock, rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return ! Initialize stream data type if not aqua planet - xmlfilename = 'dwav.streams'//trim(inst_suffix)//'.xml' - call shr_strdata_init_from_xml(sdat, xmlfilename, model_mesh, clock, 'WAV', logunit, rc=rc) + streamfilename = 'dwav.streams'//trim(inst_suffix) +#ifndef DISABLE_FoX + streamfilename = trim(streamfilename)//'.xml' +#endif + call shr_strdata_init_from_config(sdat, streamfilename, model_mesh, clock, 'WAV', logunit, rc=rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return call ESMF_TraceRegionExit('dwav_strdata_init') diff --git a/fox b/fox deleted file mode 160000 index 7b948844..00000000 --- a/fox +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 7b9488446b193192dd3f0378541e71099cb4e8a8 diff --git a/streams/dshr_strdata_mod.F90 b/streams/dshr_strdata_mod.F90 index 305d161e..653524ea 100644 --- a/streams/dshr_strdata_mod.F90 +++ b/streams/dshr_strdata_mod.F90 @@ -34,7 +34,10 @@ module dshr_strdata_mod use dshr_stream_mod , only : shr_stream_streamtype, shr_stream_getModelFieldList, shr_stream_getStreamFieldList use dshr_stream_mod , only : shr_stream_taxis_cycle, shr_stream_taxis_extend, shr_stream_findBounds use dshr_stream_mod , only : shr_stream_getCurrFile, shr_stream_setCurrFile, shr_stream_getMeshFilename - use dshr_stream_mod , only : shr_stream_init_from_xml, shr_stream_init_from_inline + use dshr_stream_mod , only : shr_stream_init_from_inline, shr_stream_init_from_esmfconfig +#ifndef DISABLE_FoX + use dshr_stream_mod , only : shr_stream_init_from_xml +#endif use dshr_stream_mod , only : shr_stream_getnextfilename, shr_stream_getprevfilename, shr_stream_getData use dshr_tinterp_mod , only : shr_tInterp_getCosz, shr_tInterp_getAvgCosz, shr_tInterp_getFactors use dshr_methods_mod , only : dshr_fldbun_getfldptr, dshr_fldbun_getfieldN, dshr_fldbun_fldchk, chkerr @@ -53,7 +56,7 @@ module dshr_strdata_mod private public :: shr_strdata_type - public :: shr_strdata_init_from_xml + public :: shr_strdata_init_from_config public :: shr_strdata_init_from_inline public :: shr_strdata_setOrbs public :: shr_strdata_advance @@ -173,11 +176,11 @@ type(ESMF_FieldBundle) function shr_strdata_get_stream_fieldbundle(sdat, ns, nam end function shr_strdata_get_stream_fieldbundle !=============================================================================== - subroutine shr_strdata_init_from_xml(sdat, xmlfilename, model_mesh, clock, compname, logunit, rc) + subroutine shr_strdata_init_from_config(sdat, streamfilename, model_mesh, clock, compname, logunit, rc) ! input/output variables type(shr_strdata_type) , intent(inout) :: sdat - character(len=*) , intent(in) :: xmlfilename + character(len=*) , intent(in) :: streamfilename type(ESMF_Mesh) , intent(in) :: model_mesh type(ESMF_Clock) , intent(in) :: clock character(len=*) , intent(in) :: compname @@ -187,7 +190,7 @@ subroutine shr_strdata_init_from_xml(sdat, xmlfilename, model_mesh, clock, compn ! local variables type(ESMF_VM) :: vm integer :: i, localPet - character(len=*), parameter :: subname='(shr_strdata_init_from_xml)' + character(len=*), parameter :: subname='(shr_strdata_init_from_config)' ! ---------------------------------------------- rc = ESMF_SUCCESS call ESMF_LogWrite(subname//' called', ESMF_LOGMSG_INFO) @@ -210,8 +213,13 @@ subroutine shr_strdata_init_from_xml(sdat, xmlfilename, model_mesh, clock, compn ! Initialize sdat streams (read xml file for streams) sdat%masterproc = (localPet == master_task) - call shr_stream_init_from_xml(xmlfilename, sdat%stream, sdat%masterproc, sdat%logunit, & +#ifdef DISABLE_FoX + call shr_stream_init_from_esmfconfig(streamfilename, sdat%stream, sdat%logunit, & + sdat%pio_subsystem, sdat%io_type, sdat%io_format, rc=rc) +#else + call shr_stream_init_from_xml(streamfilename, sdat%stream, sdat%masterproc, sdat%logunit, & sdat%pio_subsystem, sdat%io_type, sdat%io_format, trim(compname), rc=rc) +#endif allocate(sdat%pstrm(shr_strdata_get_stream_count(sdat))) @@ -224,7 +232,7 @@ subroutine shr_strdata_init_from_xml(sdat, xmlfilename, model_mesh, clock, compn call shr_strdata_init(sdat, clock, rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return - end subroutine shr_strdata_init_from_xml + end subroutine shr_strdata_init_from_config !=============================================================================== subroutine shr_strdata_init_from_inline(sdat, my_task, logunit, compname, & diff --git a/streams/dshr_stream_mod.F90 b/streams/dshr_stream_mod.F90 index 39fa7d1d..dd0410b4 100644 --- a/streams/dshr_stream_mod.F90 +++ b/streams/dshr_stream_mod.F90 @@ -41,7 +41,10 @@ module dshr_stream_mod public :: shr_stream_streamType ! stream data type with private components ! !PUBLIC MEMBER FUNCTIONS: + public :: shr_stream_init_from_esmfconfig +#ifndef DISABLE_FoX public :: shr_stream_init_from_xml +#endif public :: shr_stream_init_from_inline ! initial stream type public :: shr_stream_findBounds ! return lower/upper bounding date info public :: shr_stream_getMeshFileName ! return stream filename @@ -122,7 +125,8 @@ module dshr_stream_mod contains !=============================================================================== - subroutine shr_stream_init_from_xml(xmlfilename, streamdat, isroot_task, logunit, & +#ifndef DISABLE_FoX + subroutine shr_stream_init_from_xml(streamfilename, streamdat, isroot_task, logunit, & pio_subsystem, io_type, io_format, compname, rc) use FoX_DOM, only : extractDataContent, destroy, Node, NodeList, parseFile, getElementsByTagname use FoX_DOM, only : getLength, item @@ -156,7 +160,7 @@ subroutine shr_stream_init_from_xml(xmlfilename, streamdat, isroot_task, logunit ! --------------------------------------------------------------------- ! input/output variables - character(len=*), optional , intent(in) :: xmlfilename + character(len=*), optional , intent(in) :: streamfilename type(shr_stream_streamType) , intent(inout), pointer :: streamdat(:) logical , intent(in) :: isroot_task integer , intent(in) :: logunit @@ -184,9 +188,9 @@ subroutine shr_stream_init_from_xml(xmlfilename, streamdat, isroot_task, logunit if (isroot_task) then - Sdoc => parseFile(xmlfilename, iostat=status) + Sdoc => parseFile(streamfilename, iostat=status) if (status /= 0) then - call shr_sys_abort("Could not parse file "//trim(xmlfilename)) + call shr_sys_abort("Could not parse file "//trim(streamfilename)) endif streamlist => getElementsByTagname(Sdoc, "stream_info") nstrms = getLength(streamlist) @@ -376,6 +380,8 @@ subroutine shr_stream_init_from_xml(xmlfilename, streamdat, isroot_task, logunit end subroutine shr_stream_init_from_xml +#endif + !=============================================================================== subroutine shr_stream_init_from_inline(streamdat, & @@ -479,6 +485,197 @@ subroutine shr_stream_init_from_inline(streamdat, & end subroutine shr_stream_init_from_inline + !=============================================================================== + subroutine shr_stream_init_from_esmfconfig(streamfilename, streamdat, logunit, & + pio_subsystem, io_type, io_format, rc) + + use esmf , only : ESMF_VM, ESMF_VMGetCurrent, ESMF_VMBroadCast + use esmf , only : ESMF_SUCCESS, ESMF_ConfigCreate, ESMF_ConfigLoadFile + use esmf , only : ESMF_ConfigGetLen, ESMF_ConfigGetAttribute + use esmf , only : ESMF_Config, ESMF_MAXSTR + + !!--------------------------------------------------------------------- + !! The configuration file is a text file that can have following entries + !! file_id: "stream" + !! file_version: 1.0 + !! stream_info: 1 + !! taxmode: + !! tInterpAlgo: + !! readMode: + !! mapalgo: + !! dtlimit: + !! yearFirst: + !! yearLast: + !! yearAlign: + !! stream_vectors: + !! stream_mesh_file: + !! stream_lev_dimname: + !! stream_data_files: + !! stream_data_variables: + !! stream_offset: + !!--------------------------------------------------------------------- + + ! input/output variables + character(len=*), optional , intent(in) :: streamfilename + type(shr_stream_streamType) , intent(inout), pointer :: streamdat(:) + integer , intent(in) :: logunit + type(iosystem_desc_t) , intent(in), pointer :: pio_subsystem + integer , intent(in) :: io_type + integer , intent(in) :: io_format + integer , intent(out) :: rc + + ! local variables + type(ESMF_VM) :: vm + type(ESMF_Config) :: cf + integer :: i, n, nstrms + character(2) :: mystrm + character(*),parameter :: subName = '(shr_stream_init_from_esmfconfig)' + character(len=ESMF_MAXSTR), allocatable :: strm_tmpstrings(:) + character(*) , parameter :: u_FILE_u = __FILE__ + + ! --------------------------------------------------------------------- + + rc = ESMF_SUCCESS + + nstrms = 0 + + ! allocate streamdat instance on all tasks + call ESMF_VMGetCurrent(vm, rc=rc) + if (ChkErr(rc,__LINE__,u_FILE_u)) return + + ! set ESMF config + cf = ESMF_ConfigCreate(rc=RC) + call ESMF_ConfigLoadFile(config=CF ,filename=trim(streamfilename), rc=rc) + if (ChkErr(rc,__LINE__,u_FILE_u)) return + + + ! get number of streams + nstrms = ESMF_ConfigGetLen(config=CF, label='stream_info:', rc=rc) + if (ChkErr(rc,__LINE__,u_FILE_u)) return + + ! allocate an array of shr_stream_streamtype objects on just isroot_task + if( nstrms > 0 ) then + allocate(streamdat(nstrms)) + else + call shr_sys_abort("no stream_info in config file "//trim(streamfilename)) + endif + + ! fill in non-default values for the streamdat attributes + do i=1, nstrms + if( nstrms == 1 ) then + mystrm='' + else + write(mystrm,'("I2")') i + endif + call ESMF_ConfigGetAttribute(CF,value=streamdat(i)%taxmode,label="taxmode"//mystrm, rc=rc) + if (ChkErr(rc,__LINE__,u_FILE_u)) return + + call ESMF_ConfigGetAttribute(CF,value=streamdat(i)%mapalgo,label="mapalgo"//mystrm, rc=rc) + if (ChkErr(rc,__LINE__,u_FILE_u)) return + + call ESMF_ConfigGetAttribute(CF,value=streamdat(i)%tInterpAlgo,label="tInterpAlgo"//mystrm, rc=rc) + if (ChkErr(rc,__LINE__,u_FILE_u)) return + + call ESMF_ConfigGetAttribute(CF,value=streamdat(i)%readMode,label="readMode"//mystrm, rc=rc) + if (ChkErr(rc,__LINE__,u_FILE_u)) return + + if( ESMF_ConfigGetLen(config=CF, label="yearFirst"//mystrm, rc=rc) > 0 ) then + call ESMF_ConfigGetAttribute(CF,value=streamdat(i)%yearFirst,label="yearFirst"//mystrm, rc=rc) + if (ChkErr(rc,__LINE__,u_FILE_u)) return + else + call shr_sys_abort("yearFirst must be provided") + endif + + if( ESMF_ConfigGetLen(config=CF, label="yearLast"//mystrm, rc=rc) > 0 ) then + call ESMF_ConfigGetAttribute(CF,value=streamdat(i)%yearLast,label="yearLast"//mystrm, rc=rc) + if (ChkErr(rc,__LINE__,u_FILE_u)) return + else + call shr_sys_abort("yearLast must be provided") + endif + + if( ESMF_ConfigGetLen(config=CF, label="yearAlign"//mystrm, rc=rc) > 0 ) then + call ESMF_ConfigGetAttribute(CF,value=streamdat(i)%yearAlign,label="yearAlign"//mystrm, rc=rc) + if (ChkErr(rc,__LINE__,u_FILE_u)) return + else + call shr_sys_abort("yearAlign must be provided") + endif + + call ESMF_ConfigGetAttribute(CF,value=streamdat(i)%dtlimit,label="dtlimit"//mystrm, rc=rc) + if (ChkErr(rc,__LINE__,u_FILE_u)) return + + call ESMF_ConfigGetAttribute(CF,value=streamdat(i)%offset,label="stream_offset"//mystrm, rc=rc) + if (ChkErr(rc,__LINE__,u_FILE_u)) return + + if( ESMF_ConfigGetLen(config=CF, label="stream_mesh_file"//mystrm, rc=rc) > 0 ) then + call ESMF_ConfigGetAttribute(CF,value=streamdat(i)%meshfile,label="stream_mesh_file"//mystrm, rc=rc) + if (ChkErr(rc,__LINE__,u_FILE_u)) return + else + call shr_sys_abort("stream_mesh_file must be provided") + endif + + if( ESMF_ConfigGetLen(config=CF, label="stream_vectors"//mystrm, rc=rc) > 0 ) then + call ESMF_ConfigGetAttribute(CF,value=streamdat(i)%stream_vectors,label="stream_vectors"//mystrm, rc=rc) + if (ChkErr(rc,__LINE__,u_FILE_u)) return + else + call shr_sys_abort("stream_vectors must be provided") + endif + + if( ESMF_ConfigGetLen(config=CF, label="stream_lev_dimname"//mystrm, rc=rc) > 0 ) then + call ESMF_ConfigGetAttribute(CF,value=streamdat(i)%lev_dimname,label="stream_lev_dimname"//mystrm, rc=rc) + if (ChkErr(rc,__LINE__,u_FILE_u)) return + else + call shr_sys_abort("stream_lev_dimname must be provided") + endif + + ! Get a list of stream file names + streamdat(i)%nfiles = ESMF_ConfigGetLen(config=CF, label="stream_data_files"//mystrm, rc=rc) + if( streamdat(i)%nfiles > 0) then + allocate(streamdat(i)%file( streamdat(i)%nfiles)) + allocate(strm_tmpstrings(streamdat(i)%nfiles)) + call ESMF_ConfigGetAttribute(CF,valueList=strm_tmpstrings, label="stream_data_files"//mystrm, rc=rc) + if (ChkErr(rc,__LINE__,u_FILE_u)) return + do n=1,streamdat(i)%nfiles + streamdat(i)%file(n)%name = trim(strm_tmpstrings(i)) + enddo + deallocate(strm_tmpstrings) + else + call shr_sys_abort("stream data files must be provided") + endif + + ! Get name of stream variables in file and model + streamdat(i)%nvars = ESMF_ConfigGetLen(config=CF, label="stream_data_variables"//mystrm, rc=rc) + if( streamdat(i)%nvars > 0) then + allocate(streamdat(i)%varlist(streamdat(i)%nvars)) + allocate(strm_tmpstrings(streamdat(i)%nvars)) + call ESMF_ConfigGetAttribute(CF,valueList=strm_tmpstrings,label="stream_data_variables"//mystrm, rc=rc) + do n=1, streamdat(i)%nvars + streamdat(i)%varlist(n)%nameinfile = strm_tmpstrings(n)(1:index(trim(strm_tmpstrings(n)), " ")) + streamdat(i)%varlist(n)%nameinmodel = strm_tmpstrings(n)(index(trim(strm_tmpstrings(n)), " ", .true.)+1:) + enddo + else + call shr_sys_abort("stream data variables must be provided") + endif + + ! Initialize stream pio + streamdat(i)%pio_subsystem => pio_subsystem + streamdat(i)%pio_iotype = io_type + streamdat(i)%pio_ioformat = io_format + call shr_stream_getCalendar(streamdat(i), 1, streamdat(i)%calendar) + + ! Error check + if (trim(streamdat(i)%taxmode) == shr_stream_taxis_extend .and. streamdat(i)%dtlimit < 1.e10) then + call shr_sys_abort(trim(subName)//" ERROR: if taxmode value is extend set dtlimit to 1.e30") + end if + + enddo ! end loop nstrm + + ! Set logunit + streamdat(:)%logunit = logunit + + ! initialize flag that stream has been set + streamdat(:)%init = .true. + + end subroutine shr_stream_init_from_esmfconfig !=============================================================================== subroutine shr_stream_findBounds(strm, mDateIn, secIn, isroot_task, & mDateLB, dDateLB, secLB, n_lb, fileLB, mDateUB, dDateUB, secUB, n_ub, fileUB)