diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
index 438a2f450..f3d2d933a 100644
--- a/.github/pull_request_template.md
+++ b/.github/pull_request_template.md
@@ -11,39 +11,6 @@ Are changes expected to change answers? (specify if bfb, different at roundoff,
Any User Interface Changes (namelist or namelist defaults changes)?
### Testing performed
+Please describe the tests along with the target model and machine(s)
+If possible, please also added hashes that were used in the testing
-Testing performed if application target is CESM:
-- [ ] (recommended) CIME_DRIVER=nuopc scripts_regression_tests.py
- - machines:
- - details (e.g. failed tests):
-- [ ] (recommended) CESM testlist_drv.xml
- - machines and compilers:
- - details (e.g. failed tests):
-- [ ] (optional) CESM prealpha test
- - machines and compilers
- - details (e.g. failed tests):
-- [ ] (other) please described in detail
- - machines and compilers
- - details (e.g. failed tests):
-
-Testing performed if application target is UFS-coupled:
-- [ ] (recommended) UFS-coupled testing
- - description:
- - details (e.g. failed tests):
-
-Testing performed if application target is UFS-HAFS:
-- [ ] (recommended) UFS-HAFS testing
- - description:
- - details (e.g. failed tests):
-
-### Hashes used for testing:
-
-- [ ] CESM:
- - repository to check out: https://github.com/ESCOMP/CESM.git
- - branch/hash:
-- [ ] UFS-coupled, then umbrella repostiory to check out and associated hash:
- - repository to check out:
- - branch/hash:
-- [ ] UFS-HAFS, then umbrella repostiory to check out and associated hash:
- - repository to check out:
- - branch/hash:
diff --git a/.github/workflows/extbuild.yml b/.github/workflows/extbuild.yml
index fafc46f46..6e26b40a5 100644
--- a/.github/workflows/extbuild.yml
+++ b/.github/workflows/extbuild.yml
@@ -18,11 +18,13 @@ jobs:
FC: mpifort
CXX: mpicxx
CPPFLAGS: "-I/usr/include -I/usr/local/include"
+
# Versions of all dependencies can be updated here
- ESMF_VERSION: v8.4.0
+ ESMF_VERSION: v8.4.2
PNETCDF_VERSION: checkpoint.1.12.3
NETCDF_FORTRAN_VERSION: v4.6.0
- PIO_VERSION: pio2_5_10
+ PIO_VERSION: pio2_6_0
+ CDEPS_VERSION: cdeps1.0.15
steps:
- uses: actions/checkout@v3
# Build the ESMF library, if the cache contains a previous build
@@ -50,14 +52,14 @@ jobs:
key: ${{ runner.os }}-${{ env.PIO_VERSION }}.pio
- name: Build ParallelIO
if: steps.cache-ParallelIO.outputs.cache-hit != 'true'
- uses: NCAR/ParallelIO/.github/actions/parallelio_cmake@9390e30e29d4ebbfbef0fc72162cacd9e8f25e4e
+ uses: NCAR/ParallelIO/.github/actions/parallelio_cmake@pio2_6_0
with:
parallelio_version: ${{ env.ParallelIO_VERSION }}
enable_fortran: True
install_prefix: $HOME/pio
- name: Build ESMF
if: steps.cache-esmf.outputs.cache-hit != 'true'
- uses: ESCOMP/CDEPS/.github/actions/buildesmf@e06246b560d3132170bb1a5443fa3d65dfbd2040
+ uses: ESCOMP/CDEPS/.github/actions/buildesmf@cdeps1.0.15
with:
esmf_version: ${{ env.ESMF_VERSION }}
esmf_bopt: g
@@ -67,12 +69,39 @@ jobs:
netcdf_fortran_path: /usr
pnetcdf_path: /usr
parallelio_path: $HOME/pio
+ - name: Cache CDEPS
+ id: cache-cdeps
+ uses: actions/cache@v3
+ with:
+ path: $HOME/cdeps
+ key: ${{ runner.os }}-${{ env.CDEPS_VERSION }}.cdeps
+
+ - name: checkout CDEPS
+ uses: actions/checkout@v3
+ with:
+ repository: ESCOMP/CDEPS
+ path: cdeps-src
+ ref: ${{ env.CDEPS_VERSION }}
+ - name: Build CDEPS
+ if: steps.cache-cdeps.outputs.cache-hit != 'true'
+ uses: ESCOMP/CDEPS/.github/actions/buildcdeps@cdeps1.0.15
+ with:
+ esmfmkfile: $HOME/ESMF/lib/libg/Linux.gfortran.64.openmpi.default/esmf.mk
+ pio_path: $HOME/pio
+ src_root: ${GITHUB_WORKSPACE}/cdeps-src
+ cmake_flags: " -Wno-dev -DCMAKE_BUILD_TYPE=DEBUG -DWERROR=ON -DCMAKE_Fortran_FLAGS=\"-DCPRGNU -g -Wall \
+ -ffree-form -ffree-line-length-none -fallow-argument-mismatch \""
+
- name: Build CMEPS
run: |
export ESMFMKFILE=$HOME/ESMF/lib/libg/Linux.gfortran.64.openmpi.default/esmf.mk
export PIO=$HOME/pio
mkdir build-cmeps
pushd build-cmeps
- cmake -DCMAKE_BUILD_TYPE=DEBUG -DCMAKE_Fortran_FLAGS="-g -Wall -Werror -ffree-form -ffree-line-length-none -Wno-unused-dummy-argument" ../
+ cmake -DCMAKE_BUILD_TYPE=DEBUG -DCMAKE_Fortran_FLAGS="-g -Wall -Werror -ffree-form -ffree-line-length-none -Wno-unused-dummy-argument -I /home/runner/work/CMEPS/CMEPS/build-cdeps/share" ../
make VERBOSE=1
popd
+
+ - name: Setup tmate session
+ if: ${{ failure() }}
+ uses: mxschmitt/action-tmate@v3
diff --git a/.github/workflows/srt.yml b/.github/workflows/srt.yml
index 39526be99..34252cb63 100644
--- a/.github/workflows/srt.yml
+++ b/.github/workflows/srt.yml
@@ -26,8 +26,8 @@ jobs:
CPPFLAGS: "-I/usr/include -I/usr/local/include "
LDFLAGS: "-L/usr/lib/x86_64-linux-gnu -lnetcdf -lnetcdff -lpnetcdf"
# Versions of all dependencies can be updated here
- ESMF_VERSION: v8.4.0
- PARALLELIO_VERSION: pio2_5_10
+ ESMF_VERSION: v8.5.0
+ PARALLELIO_VERSION: pio2_6_0
CIME_MODEL: cesm
CIME_DRIVER: nuopc
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -153,6 +153,7 @@ jobs:
mkdir -p $HOME/cesm/scratch
mkdir -p $HOME/cesm/inputdata
pushd $GITHUB_WORKSPACE/cesm/cime/CIME/tests
+ export SRCROOT=$GITHUB_WORKSPACE/cesm/
export CIME_TEST_PLATFORM=ubuntu-latest
export PIO_INCDIR=$HOME/pio/include
export PIO_LIBDIR=$HOME/pio/lib
@@ -175,6 +176,6 @@ jobs:
popd
# the following can be used by developers to login to the github server in case of errors
# see https://github.com/marketplace/actions/debugging-with-tmate for further details
-# - name: Setup tmate session
-# if: ${{ failure() }}
-# uses: mxschmitt/action-tmate@v3
+ - name: Setup tmate session
+ if: ${{ failure() }}
+ uses: mxschmitt/action-tmate@v3
diff --git a/cesm/driver/ensemble_driver.F90 b/cesm/driver/ensemble_driver.F90
index 39fc5ded2..cfe18e4e4 100644
--- a/cesm/driver/ensemble_driver.F90
+++ b/cesm/driver/ensemble_driver.F90
@@ -340,6 +340,9 @@ subroutine SetModelServices(ensemble_driver, rc)
else
inst_suffix = ''
endif
+ ! CESM does not use this ESMF feature and at large processor counts it can be expensive to have it on.
+ call NUOPC_CompAttributeSet(driver, name="HierarchyProtocol", value="off", rc=rc)
+ if (chkerr(rc,__LINE__,u_FILE_u)) return
! Set the driver instance attributes
call NUOPC_CompAttributeAdd(driver, attrList=(/'read_restart'/), rc=rc)
@@ -375,7 +378,7 @@ subroutine SetModelServices(ensemble_driver, rc)
call shr_log_setLogUnit (logunit)
! Create a clock for each driver instance
- call esm_time_clockInit(ensemble_driver, driver, logunit, maintask, rc)
+ call esm_time_clockInit(ensemble_driver, driver, logunit, localpet==petList(1), rc)
if (chkerr(rc,__LINE__,u_FILE_u)) return
enddo
diff --git a/cesm/driver/esm.F90 b/cesm/driver/esm.F90
index 5e5899d5e..22a84cde6 100644
--- a/cesm/driver/esm.F90
+++ b/cesm/driver/esm.F90
@@ -796,8 +796,7 @@ subroutine esm_init_pelayout(driver, maxthreads, rc)
#ifndef NO_MPI2
use mpi , only : MPI_COMM_NULL, mpi_comm_size
#endif
- use mct_mod , only : mct_world_init
- use driver_pio_mod , only : driver_pio_init, driver_pio_component_init
+ use m_MCTWorld , only : mct_world_init => init
#ifdef MED_PRESENT
use med_internalstate_mod , only : med_id
diff --git a/cesm/driver/esmApp.F90 b/cesm/driver/esmApp.F90
index 12cf1537d..5215ea2aa 100644
--- a/cesm/driver/esmApp.F90
+++ b/cesm/driver/esmApp.F90
@@ -139,7 +139,7 @@ program esmApp
! Call Run for the ensemble driver
!-----------------------------------------------------------------------------
call ESMF_GridCompRun(ensemble_driver_comp, userRc=urc, rc=rc)
- if (ESMF_LogFoundError(rcToCheck=urc, msg=ESMF_LOGERR_PASSTHRU, &
+ if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
line=__LINE__, &
file=__FILE__)) &
call ESMF_Finalize(endflag=ESMF_END_ABORT)
diff --git a/cesm/flux_atmocn/shr_flux_mod.F90 b/cesm/flux_atmocn/shr_flux_mod.F90
index 9ec558737..741447d93 100644
--- a/cesm/flux_atmocn/shr_flux_mod.F90
+++ b/cesm/flux_atmocn/shr_flux_mod.F90
@@ -259,7 +259,17 @@ SUBROUTINE flux_atmOcn(logunit, nMax ,zbot ,ubot ,vbot ,thbot , &
qsat(Tk) = 640380.0_R8 / exp(5107.4_R8/Tk)
- cdn(Umps) = 0.0027_R8 / Umps + 0.000142_R8 + 0.0000764_R8 * Umps
+
+ ! Large and Yeager 2009
+ cdn(Umps) = 0.0027_R8 / min(33.0000_R8,Umps) + 0.000142_R8 + &
+ 0.0000764_R8 * min(33.0000_R8,Umps) - 3.14807e-13_r8 * min(33.0000_R8,Umps)**6
+ ! Capped Large and Pond by wind
+ ! cdn(Umps) = 0.0027_R8 / min(30.0_R8,Umps) + 0.000142_R8 + 0.0000764_R8 * min(30.0_R8,Umps)
+ ! Capped Large and Pond by Cd
+ ! cdn(Umps) = min(0.0025_R8, (0.0027_R8 / Umps + 0.000142_R8 + 0.0000764_R8 * Umps ))
+ ! Large and Pond
+ ! cdn(Umps) = 0.0027_R8 / Umps + 0.000142_R8 + 0.0000764_R8 * Umps
+
psimhu(xd) = log((1.0_R8+xd*(2.0_R8+xd))*(1.0_R8+xd*xd)/8.0_R8) - 2.0_R8*atan(xd) + 1.571_R8
psixhu(xd) = 2.0_R8 * log((1.0_R8 + xd*xd)/2.0_R8)
diff --git a/cesm/nuopc_cap_share/shr_lightning_coupling_mod.F90 b/cesm/nuopc_cap_share/shr_lightning_coupling_mod.F90
new file mode 100644
index 000000000..3b4e260d8
--- /dev/null
+++ b/cesm/nuopc_cap_share/shr_lightning_coupling_mod.F90
@@ -0,0 +1,112 @@
+module shr_lightning_coupling_mod
+
+ !========================================================================
+ ! Module for handling namelist variables related to lightning coupling
+ !========================================================================
+
+ use ESMF , only : ESMF_VMGetCurrent, ESMF_VM, ESMF_VMGet
+ use ESMF , only : ESMF_LOGERR_PASSTHRU, ESMF_SUCCESS
+ use ESMF , only : ESMF_VMBroadCast, ESMF_Logical, assignment(=)
+ use shr_sys_mod , only : shr_sys_abort
+ use shr_log_mod , only : shr_log_getLogUnit
+ use shr_nl_mod , only : shr_nl_find_group_name
+ use nuopc_shr_methods, only : chkerr
+
+ implicit none
+ private
+
+ ! !PUBLIC MEMBER FUNCTIONS
+ public shr_lightning_coupling_readnl ! Read namelist
+
+ character(len=*), parameter :: &
+ u_FILE_u=__FILE__
+
+ !====================================================================================
+CONTAINS
+ !====================================================================================
+
+ subroutine shr_lightning_coupling_readnl(NLFilename, atm_provides_lightning_out)
+
+ !========================================================================
+ ! reads lightning_coupling_nl namelist and returns a variable specifying
+ ! if atmosphere model provides lightning flash frequency field to mediator
+ !========================================================================
+
+ ! input/output variables
+ character(len=*), intent(in) :: NLFilename ! Namelist filename
+ logical, intent(out) :: atm_provides_lightning_out ! if TRUE atm will provide lightning flash frequency
+
+ !----- local -----
+ logical :: atm_provides_lightning
+ type(ESMF_VM) :: vm
+ integer :: unitn ! namelist unit number
+ integer :: ierr ! error code
+ logical :: exists ! if file exists or not
+ type(ESMF_Logical):: ltmp(1)
+ integer :: rc
+ integer :: localpet
+ integer :: mpicom
+ integer :: s_logunit
+ character(len=*), parameter :: atm_ozone_frequency_not_present = 'NOT_PRESENT'
+ character(len=*), parameter :: subname = '(shr_lightning_coupling_readnl) '
+ ! ------------------------------------------------------------------
+
+ namelist /lightning_coupling_nl/ atm_provides_lightning
+
+ rc = ESMF_SUCCESS
+
+ atm_provides_lightning_out = .false.
+ ltmp(1) = .false.
+
+ !--- Open and read namelist ---
+ if ( len_trim(NLFilename) == 0 ) then
+ call shr_sys_abort( subname//'ERROR: nlfilename not set' )
+ end if
+ call shr_log_getLogUnit(s_logunit)
+ call ESMF_VMGetCurrent(vm, rc=rc)
+ if (chkerr(rc,__LINE__,u_FILE_u)) return
+
+ call ESMF_VMGet(vm, localPet=localpet, mpiCommunicator=mpicom, rc=rc)
+ if (chkerr(rc,__LINE__,u_FILE_u)) return
+
+ if (localpet==0) then
+ ! ------------------------------------------------------------------------
+ ! Set default values in case namelist file doesn't exist, lightning_coupling_nl group
+ ! doesn't exist within the file, or a given variable isn't present in the namelist
+ ! group in the file.
+ ! ------------------------------------------------------------------------
+ atm_provides_lightning = .false.
+
+ ! ------------------------------------------------------------------------
+ ! Read namelist file
+ ! ------------------------------------------------------------------------
+ inquire( file=trim(NLFileName), exist=exists)
+ if ( exists ) then
+ open(newunit=unitn, file=trim(NLFilename), status='old' )
+ write(s_logunit,'(a)') subname,'Read in lightning_coupling_nl namelist from: ', trim(NLFilename)
+ call shr_nl_find_group_name(unitn, 'lightning_coupling_nl', ierr)
+ if (ierr == 0) then
+ ! Note that ierr /= 0 means no namelist is present.
+ read(unitn, lightning_coupling_nl, iostat=ierr)
+ if (ierr > 0) then
+ call shr_sys_abort(subname//'problem reading lightning_coupling_nl')
+ end if
+ end if
+ close( unitn )
+ end if
+
+ ltmp(1) = atm_provides_lightning
+
+ end if
+
+ ! ------------------------------------------------------------------------
+ ! Broadcast values to all tasks
+ ! ------------------------------------------------------------------------
+ call ESMF_VMBroadcast(vm, ltmp, count=1, rootPet=0, rc=rc)
+ if (chkerr(rc,__LINE__,u_FILE_u)) return
+
+ atm_provides_lightning_out = ltmp(1)
+
+ end subroutine shr_lightning_coupling_readnl
+
+end module shr_lightning_coupling_mod
diff --git a/cime_config/buildexe b/cime_config/buildexe
index 406f660a3..1d7366718 100755
--- a/cime_config/buildexe
+++ b/cime_config/buildexe
@@ -38,6 +38,7 @@ def _main_func():
num_esp = case.get_value("NUM_COMP_INST_ESP")
ocn_model = case.get_value("COMP_OCN")
gmake_args = get_standard_makefile_args(case)
+ link_libs = case.get_value("CAM_LINKED_LIBS", subgroup="build_component_cam")
esmf_aware_threading = case.get_value("ESMF_AWARE_THREADING")
# Determine valid components
@@ -65,6 +66,9 @@ def _main_func():
if ocn_model == 'mom':
gmake_args += "USE_FMS=TRUE"
+ if link_libs is not None:
+ gmake_args += 'USER_SLIBS="{}"'.format(link_libs)
+
comp_classes = case.get_values("COMP_CLASSES")
for comp in comp_classes:
model = case.get_value("COMP_{}".format(comp))
diff --git a/cime_config/buildnml b/cime_config/buildnml
index 6b76da004..32be8ead4 100755
--- a/cime_config/buildnml
+++ b/cime_config/buildnml
@@ -125,17 +125,13 @@ def _create_drv_namelists(case, infile, confdir, nmlgen, files):
elif case.get_value("RUN_TYPE") == "branch":
config["run_type"] = "branch"
+ config['wav_ice_coupling'] = config['COMP_WAV'] == 'ww3dev' and config['COMP_ICE'] == 'cice'
+
# ----------------------------------------------------
# Initialize namelist defaults
# ----------------------------------------------------
nmlgen.init_defaults(infile, config, skip_default_for_groups=["modelio"])
- # --------------------------------
- # Set default wav-ice coupling (assumes cice6 as the ice component
- # --------------------------------
- if case.get_value("COMP_WAV") == "ww3dev" and case.get_value("COMP_ICE") == "cice":
- nmlgen.add_default("wavice_coupling", value=".true.")
-
# --------------------------------
# Overwrite: set brnch_retain_casename
# --------------------------------
@@ -620,14 +616,7 @@ def buildnml(case, caseroot, component):
major = line[-2] if "MAJOR" in line else major
minor = line[-2] if "MINOR" in line else minor
logger.debug("ESMF version major {} minor {}".format(major, minor))
- expect(int(major) >= 8, "ESMF version should be 8.1 or newer")
- if esmf_aware_threading:
- expect(
- int(minor) >= 2,
- "ESMF version should be 8.2.0 or newer when using ESMF_AWARE_THREADING",
- )
- else:
- expect(int(minor) >= 1, "ESMF version should be 8.1.0 or newer")
+ expect(int(major) >= 8 and int(minor) >=4, "ESMF version should be 8.4.1 or newer")
confdir = os.path.join(case.get_value("CASEBUILD"), "cplconf")
if not os.path.isdir(confdir):
diff --git a/cime_config/config_component.xml b/cime_config/config_component.xml
index 7f9bac96e..d73964961 100644
--- a/cime_config/config_component.xml
+++ b/cime_config/config_component.xml
@@ -534,6 +534,15 @@
List of job ids for most recent case.submit
+
+ char
+ regular
+ regular,premium,economy
+ run_begin_stop_restart
+ env_run.xml
+ job priority for systems supporting this option
+
+
@@ -784,6 +793,34 @@
If TRUE, the component libraries are always built with OpenMP capability.
+
+ char
+
+
+ build_def
+ env_build.xml
+ If set will compile and submit with this gpu type enabled
+
+
+
+ char
+
+
+ build_def
+ env_build.xml
+ If set will compile and submit with this gpu offload method enabled
+
+
+
+ char
+
+
+ build_def
+ env_build.xml
+ If set will attach this script to the MPI run command, mapping
+ different MPI ranks to different GPUs within the same compute node
+
+
logical
TRUE,FALSE
@@ -1361,87 +1398,6 @@
-
-
-
- char
- idmap
- run_domain
- env_run.xml
- atm2ocn flux mapping file
-
-
-
- char
- idmap
- run_domain
- env_run.xml
- atm2ocn state mapping file
-
-
-
- char
- idmap
- run_domain
- env_run.xml
- atm2ocn vector mapping file
-
-
-
- char
- idmap
- run_domain
- env_run.xml
- atm2lnd flux mapping file
-
-
-
- char
- idmap
- run_domain
- env_run.xml
- atm2lnd state mapping file
-
-
-
- char
- idmap
- run_domain
- env_run.xml
- atm2wav state mapping file
-
-
-
- char
- idmap
- run_domain
- env_run.xml
- ocn2atm flux mapping file
-
-
-
- char
- idmap
- run_domain
- env_run.xml
- ocn2atm state mapping file
-
-
-
- char
- idmap
- run_domain
- env_run.xml
- lnd2atm flux mapping file
-
-
-
- char
- idmap
- run_domain
- env_run.xml
- lnd2atm state mapping file
-
char
@@ -1879,12 +1835,22 @@
pes or cores per node for accounting purposes
+
+ integer
+ 0
+
+ 1
+
+ mach_pes_last
+ env_mach_pes.xml
+ Number of CPU cores per GPU node used for simulation
+
+
integer
0
- 1
- 1
+ 1
mach_pes
env_mach_pes.xml
diff --git a/cime_config/config_component_cesm.xml b/cime_config/config_component_cesm.xml
index 8542fd519..9cd09641c 100644
--- a/cime_config/config_component_cesm.xml
+++ b/cime_config/config_component_cesm.xml
@@ -108,12 +108,15 @@
CO2A
none
CO2A
+ CO2A
CO2A
CO2A
CO2A
CO2A
CO2C
CO2C
+ CO2A
+ CO2A
run_coupling
env_run.xml
@@ -232,6 +235,11 @@
1
+
+
+
+ 24
+ 48
run_coupling
env_run.xml
diff --git a/cime_config/namelist_definition_drv.xml b/cime_config/namelist_definition_drv.xml
index fdc53d43b..dec6868f1 100644
--- a/cime_config/namelist_definition_drv.xml
+++ b/cime_config/namelist_definition_drv.xml
@@ -716,6 +716,17 @@
$ESMF_VERBOSITY_LEVEL
+
+ logical
+ performance
+ MED_attributes
+
+ Check for NaN values in fields returned from mediator to components. This has a small performance impact.
+
+
+ .true.
+
+
integer
control
@@ -924,7 +935,7 @@
ogrid,agrid,xgrid
Grid for atm ocn flux calc
- default: xgrid
+ default: ogrid
ogrid
@@ -1235,7 +1246,7 @@
-
+
logical
aux_hist
@@ -1264,10 +1275,10 @@
- char
+ integer
aux_hist
MED_attributes
- history option type
+ history option span
1
@@ -1294,13 +1305,13 @@
integer
aux_hist
MED_attributes
- Number of time sames per file.
+ Number of time samples per file.
24
-
+
logical
aux_hist
@@ -1329,10 +1340,10 @@
- char
+ integer
aux_hist
MED_attributes
- history option type
+ history option span
1
@@ -1347,10 +1358,10 @@
- char
+ integer
aux_hist
MED_attributes
- Number of time sames per file.
+ Number of time samples per file.
24
@@ -1365,7 +1376,7 @@
-
+
logical
aux_hist
@@ -1381,7 +1392,7 @@
char
aux_hist
MED_attributes
- Auxiliary mediator atm2med precipitation history output every 3 hours
+ Auxiliary mediator atm2med precipitation fields history output every 3 hours
Faxa_rainc:Faxa_rainl:Faxa_snowc:Faxa_snowl
@@ -1396,10 +1407,10 @@
- char
+ integer
aux_hist
MED_attributes
- history option type
+ history option span
3
@@ -1414,10 +1425,10 @@
- char
+ integer
aux_hist
MED_attributes
- Number of time sames per file.
+ Number of time samples per file.
8
@@ -1432,13 +1443,13 @@
-
+
logical
aux_hist
MED_attributes
- Auxiliary mediator a2x precipitation history output every 3 hours
+ Auxiliary mediator a2x dynamic, radiation, and precipitation history output every 3 hours
.false.
@@ -1449,7 +1460,7 @@
aux_hist
MED_attributes
- Auxiliary mediator a2x precipitation history output every 3 hours
+ Auxiliary mediator a2x dynamic, radiation, and precipitation fields history output every 3 hours
Sa_z:Sa_topo:Sa_u:Sa_v:Sa_tbot:Sa_ptem:Sa_shum:Sa_dens:Sa_pbot:Sa_pslv:Faxa_lwdn:Faxa_rainc:Faxa_rainl:Faxa_snowc:Faxa_snowl:Faxa_swndr:Faxa_swvdr:Faxa_swndf:Faxa_swvdf:Sa_co2diag:Sa_co2prog
@@ -1465,10 +1476,10 @@
- char
+ integer
aux_hist
MED_attributes
- history option type
+ history option span
3
@@ -1483,10 +1494,10 @@
- char
+ integer
aux_hist
MED_attributes
- Number of time sames per file.
+ Number of time samples per file.
8
@@ -1501,12 +1512,12 @@
-
+
logical
aux_hist
MED_attributes
- Auxiliary mediator a2x precipitation history output every 3 hours
+ Auxiliary mediator a2x aerosol and ghg history output daily or endofrun
.false.
@@ -1515,7 +1526,7 @@
char
aux_hist
MED_attributes
- Auxiliary mediator a2x precipitation history output every 3 hours
+ Auxiliary mediator a2x aerosol and ghg history output daily or endofrun
Faxa_bcph:Faxa_ocph:Faxa_dstwet:Faxa_dstdry:Sa_co2prog:Sa_co2diag
@@ -1526,16 +1537,16 @@
MED_attributes
history option type
- ndays
+ nhours
- char
+ integer
aux_hist
MED_attributes
- history option type
+ history option span
- 1
+ 3
@@ -1548,12 +1559,12 @@
- char
+ integer
aux_hist
MED_attributes
- Number of time sames per file.
+ Number of time samples per file.
- 1
+ 2
@@ -1748,7 +1759,7 @@
- char
+ integer
aux_hist
MED_attributes
history option type
@@ -1766,10 +1777,10 @@
- char
+ integer
aux_hist
MED_attributes
- Number of time sames per file.
+ Number of time samples per file.
1
@@ -1801,7 +1812,7 @@
-
+
logical
aux_hist
@@ -1830,7 +1841,7 @@
- char
+ integer
aux_hist
MED_attributes
history option type
@@ -1860,7 +1871,7 @@
integer
aux_hist
MED_attributes
- Number of time sames per file.
+ Number of time samples per file.
30
@@ -1978,7 +1989,7 @@
char
aux_hist
MED_attributes
- Auxiliary mediator rof2med precipitation history output.
+ Auxiliary mediator rof2med precipitation fields history output.
all
@@ -1989,16 +2000,16 @@
MED_attributes
history option type
- ndays
+ nhours
- char
+ integer
aux_hist
MED_attributes
- history option type
+ history option span
- 1
+ 3
@@ -2011,12 +2022,12 @@
- char
+ integer
aux_hist
MED_attributes
- Number of time sames per file.
+ Number of time samples per file.
- 1
+ 2
@@ -2156,25 +2167,25 @@
idmap
-
+
char
mapping
abs
MED_attributes
- lnd to rof mapping, 'unset' or 'idmap' are normal possible values
+ lnd to rof mapping, 'unset' or 'idmap' are normal possible values (mapping file given for mizuRoute grids)
- unset
+ $LND2ROF_FMAPNAME
idmap
-
+
char
mapping
abs
MED_attributes
- rof to lnd mapping, 'unset' or 'idmap' are normal possible values
+ rof to lnd mapping, 'unset' or 'idmap' are normal possible values (mapping file given for mizuRoute grids)
- unset
+ $ROF2LND_FMAPNAME
idmap
@@ -2371,6 +2382,7 @@
4
+ 4
0
@@ -3899,7 +3911,7 @@
-
+
logical
expdef
ALLCOMP_attributes
@@ -3908,6 +3920,8 @@
.false.
+
+
diff --git a/cime_config/namelist_definition_drv_flds.xml b/cime_config/namelist_definition_drv_flds.xml
index b8d96bcd6..03b6b7c6d 100644
--- a/cime_config/namelist_definition_drv_flds.xml
+++ b/cime_config/namelist_definition_drv_flds.xml
@@ -142,7 +142,7 @@
-
+
@@ -157,4 +157,17 @@
+
+
+
+
+
+ logical
+ lightning_coupling
+ lightning_coupling_nl
+
+ If TRUE atmosphere model will provide prognosed lightning flash frequency (flashes per minute).
+
+
+
diff --git a/cime_config/testdefs/testlist_drv.xml b/cime_config/testdefs/testlist_drv.xml
index ec86e5989..985bd6ce9 100644
--- a/cime_config/testdefs/testlist_drv.xml
+++ b/cime_config/testdefs/testlist_drv.xml
@@ -189,7 +189,7 @@
-
+
diff --git a/mediator/esmFldsExchange_cesm_mod.F90 b/mediator/esmFldsExchange_cesm_mod.F90
index 851855aed..31b54437e 100644
--- a/mediator/esmFldsExchange_cesm_mod.F90
+++ b/mediator/esmFldsExchange_cesm_mod.F90
@@ -96,16 +96,16 @@ subroutine esmFldsExchange_cesm(gcomp, phase, rc)
type(InternalState) :: is_local
integer :: n, ns
character(len=CL) :: cvalue
- logical :: wavice_coupling
+ logical :: wav_coupling_to_cice
logical :: ocn2glc_coupling
character(len=*) , parameter :: subname=' (esmFldsExchange_cesm) '
!--------------------------------------
rc = ESMF_SUCCESS
- call NUOPC_CompAttributeGet(gcomp, name='wavice_coupling', value=cvalue, rc=rc)
+ call NUOPC_CompAttributeGet(gcomp, name='wav_coupling_to_cice', value=cvalue, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
- read(cvalue,*) wavice_coupling
+ read(cvalue,*) wav_coupling_to_cice
call NUOPC_CompAttributeGet(gcomp, name='ocn2glc_coupling', value=cvalue, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
@@ -399,6 +399,19 @@ subroutine esmFldsExchange_cesm(gcomp, phase, rc)
end if
end if
! ---------------------------------------------------------------------
+ ! to lnd: cld to grnd lightning flash freq
+ ! ---------------------------------------------------------------------
+ if (phase == 'advertise') then
+ call addfld_from(compatm, 'Sa_lightning')
+ call addfld_to(complnd, 'Sa_lightning')
+ else
+ if ( fldchk(is_local%wrap%FBexp(complnd) , 'Sa_lightning', rc=rc) .and. &
+ fldchk(is_local%wrap%FBImp(compatm,compatm ), 'Sa_lightning', rc=rc)) then
+ call addmap_from(compatm, 'Sa_lightning', complnd, mapbilnr, 'one', atm2lnd_map)
+ call addmrg_to(complnd, 'Sa_lightning', mrg_from=compatm, mrg_fld='Sa_lightning', mrg_type='copy')
+ end if
+ end if
+ ! ---------------------------------------------------------------------
! to lnd: temperature at the lowest model level from atm
! ---------------------------------------------------------------------
if (phase == 'advertise') then
@@ -1961,6 +1974,17 @@ subroutine esmFldsExchange_cesm(gcomp, phase, rc)
mrg_from=compatm, mrg_fld='Faxa_dstdry', mrg_type='copy_with_weights', mrg_fracname='ofrac')
end if
end if
+ if (phase == 'advertise') then
+ call addfld_to(compocn, 'Faxa_ndep')
+ call addfld_from(compatm, 'Faxa_ndep')
+ else
+ if ( fldchk(is_local%wrap%FBImp(compatm,compatm), 'Faxa_ndep', rc=rc) .and. &
+ fldchk(is_local%wrap%FBExp(compocn) , 'Faxa_ndep', rc=rc)) then
+ call addmap_from(compatm, 'Faxa_ndep', compocn, mapconsf, 'one', atm2ocn_map)
+ call addmrg_to(compocn, 'Faxa_ndep', &
+ mrg_from=compatm, mrg_fld='Faxa_ndep', mrg_type='copy')
+ end if
+ end if
! ---------------------------------------------------------------------
! to ocn: enthalpy from atm rain, snow, evaporation
@@ -2135,7 +2159,7 @@ subroutine esmFldsExchange_cesm(gcomp, phase, rc)
! liquid from river and possibly flood from river to ocean
if (fldchk(is_local%wrap%FBImp(comprof, comprof), 'Forr_rofl' , rc=rc)) then
if (trim(rof2ocn_liq_rmap) == 'unset') then
- call addmap_from(comprof, 'Forr_rofl', compocn, mapconsd, 'none', 'unset')
+ call addmap_from(comprof, 'Forr_rofl', compocn, mapconsd, 'one', 'unset')
else
call addmap_from(comprof, 'Forr_rofl', compocn, map_rof2ocn_liq, 'none', rof2ocn_liq_rmap)
end if
@@ -2159,7 +2183,7 @@ subroutine esmFldsExchange_cesm(gcomp, phase, rc)
! ice from river to ocean
if (fldchk(is_local%wrap%FBImp(comprof, comprof), 'Forr_rofi' , rc=rc)) then
if (trim(rof2ocn_ice_rmap) == 'unset') then
- call addmap_from(comprof, 'Forr_rofi', compocn, mapconsd, 'none', 'unset')
+ call addmap_from(comprof, 'Forr_rofi', compocn, mapconsd, 'one', 'unset')
else
call addmap_from(comprof, 'Forr_rofi', compocn, map_rof2ocn_ice, 'none', rof2ocn_ice_rmap)
end if
@@ -2808,7 +2832,7 @@ subroutine esmFldsExchange_cesm(gcomp, phase, rc)
! ---------------------------------------------------------------------
! to ice: wave elevation spectrum (field with ungridded dimensions)
! ---------------------------------------------------------------------
- if (wavice_coupling) then
+ if (wav_coupling_to_cice) then
if (phase == 'advertise') then
call addfld_from(compwav, 'Sw_elevation_spectrum')
call addfld_to(compice, 'Sw_elevation_spectrum')
@@ -2843,7 +2867,7 @@ subroutine esmFldsExchange_cesm(gcomp, phase, rc)
!----------------------------------------------------------
! to wav: ice thickness from ice
!----------------------------------------------------------
- if (wavice_coupling) then
+ if (wav_coupling_to_cice) then
if (phase == 'advertise') then
call addfld_from(compice, 'Si_thick')
call addfld_to(compwav, 'Si_thick')
@@ -2858,7 +2882,7 @@ subroutine esmFldsExchange_cesm(gcomp, phase, rc)
!----------------------------------------------------------
! to wav: ice floe diameter from ice
!----------------------------------------------------------
- if (wavice_coupling) then
+ if (wav_coupling_to_cice) then
if (phase == 'advertise') then
call addfld_from(compice, 'Si_floediam')
call addfld_to(compwav, 'Si_floediam')
@@ -2963,6 +2987,14 @@ subroutine esmFldsExchange_cesm(gcomp, phase, rc)
end if
end if
+ ! ---------------------------------------------------------------------
+ ! to wav: zonal and meridional wind stress
+ ! ---------------------------------------------------------------------
+ if (phase == 'advertise') then
+ call addfld_to(compwav , 'Fwxx_taux')
+ call addfld_to(compwav , 'Fwxx_tauy')
+ end if
+
!=====================================================================
! FIELDS TO RIVER (comprof)
!=====================================================================
diff --git a/mediator/esmFldsExchange_nems_mod.F90 b/mediator/esmFldsExchange_nems_mod.F90
index f93739618..b5d3fbf8f 100644
--- a/mediator/esmFldsExchange_nems_mod.F90
+++ b/mediator/esmFldsExchange_nems_mod.F90
@@ -38,6 +38,8 @@ subroutine esmFldsExchange_nems(gcomp, phase, rc)
use esmFlds , only : addmap_from => med_fldList_addmap_from
use esmFlds , only : addfld_aoflux => med_fldList_addfld_aoflux
use esmFlds , only : addmap_aoflux => med_fldList_addmap_aoflux
+ use esmFlds , only : addfld_ocnalb => med_fldList_addfld_ocnalb
+ use esmFlds , only : addmap_ocnalb => med_fldList_addmap_ocnalb
! input/output parameters:
type(ESMF_GridComp) :: gcomp
@@ -47,6 +49,7 @@ subroutine esmFldsExchange_nems(gcomp, phase, rc)
! local variables:
type(InternalState) :: is_local
integer :: n, maptype
+ logical :: med_aoflux_to_ocn
character(len=CX) :: msgString
character(len=CL) :: cvalue
character(len=CS) :: fldname
@@ -73,6 +76,12 @@ subroutine esmFldsExchange_nems(gcomp, phase, rc)
write(msgString,'(A,i6,A)') trim(subname)//': maptype is ',maptype,', '//mapnames(maptype)
call ESMF_LogWrite(trim(msgString), ESMF_LOGMSG_INFO)
+ if (trim(coupling_mode) == 'nems_orig_data' .or. trim(coupling_mode) == 'nems_frac_aoflux') then
+ med_aoflux_to_ocn = .true.
+ else
+ med_aoflux_to_ocn = .false.
+ end if
+
!=====================================================================
! scalar information
!=====================================================================
@@ -81,8 +90,8 @@ subroutine esmFldsExchange_nems(gcomp, phase, rc)
call NUOPC_CompAttributeGet(gcomp, name="ScalarFieldName", value=cvalue, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
do n = 1,ncomps
- call addfld_to(n, trim(cvalue))
- call addfld_from(n, trim(cvalue))
+ call addfld_to(n , trim(cvalue))
+ call addfld_from(n , trim(cvalue))
end do
end if
@@ -96,80 +105,58 @@ subroutine esmFldsExchange_nems(gcomp, phase, rc)
if (is_local%wrap%comp_present(compocn)) call addfld_from(compocn, 'So_omask')
if (is_local%wrap%comp_present(complnd)) call addfld_from(complnd, 'Sl_lfrin')
else
- if ( fldchk(is_local%wrap%FBexp(compice) , trim(fldname), rc=rc) .and. &
- fldchk(is_local%wrap%FBImp(compocn,compocn), trim(fldname), rc=rc)) then
+ if ( fldchk(is_local%wrap%FBexp(compice) , 'So_omask', rc=rc) .and. &
+ fldchk(is_local%wrap%FBImp(compocn,compocn), 'So_omask', rc=rc)) then
call addmap_from(compocn, 'So_omask', compice, mapfcopy, 'unset', 'unset')
end if
end if
- if ( trim(coupling_mode) == 'nems_orig_data') then
- ! atm fields required for atm/ocn flux calculation
- allocate(flds(10))
- flds = (/'Sa_u ', 'Sa_v ', 'Sa_z ', 'Sa_tbot', 'Sa_pbot', &
- 'Sa_shum', 'Sa_u10m', 'Sa_v10m', 'Sa_t2m ', 'Sa_q2m '/)
+ ! fields required for atm/ocn flux calculation
+ if (is_local%wrap%comp_present(compocn) .and. is_local%wrap%comp_present(compatm)) then
+ ! from atm: states for fluxes
+ allocate(flds(13))
+ flds = (/'Sa_u ', 'Sa_v ', 'Sa_z ', 'Sa_tbot', 'Sa_pbot', 'Sa_pslv', &
+ 'Sa_shum', 'Sa_ptem', 'Sa_dens', 'Sa_u10m', 'Sa_v10m', 'Sa_t2m ', &
+ 'Sa_q2m '/)
do n = 1,size(flds)
fldname = trim(flds(n))
if (phase == 'advertise') then
- if (is_local%wrap%comp_present(compatm) )then
- call addfld_from(compatm, trim(fldname))
- end if
+ call addfld_from(compatm , fldname)
else
- if ( fldchk(is_local%wrap%FBImp(compatm,compatm), trim(fldname), rc=rc)) then
- call addmap_from(compatm, trim(fldname), compocn, maptype, 'one', 'unset')
- end if
+ if ( fldchk(is_local%wrap%FBImp(compatm,compatm), fldname, rc=rc)) then
+ call addmap_from(compatm, fldname, compocn, maptype, 'one', 'unset')
+ end if
end if
end do
deallocate(flds)
- ! fields returned by the atm/ocn flux computation which are otherwise unadvertised
+ ! from med: fields returned by the atm/ocn flux computation, otherwise unadvertised
allocate(flds(8))
- flds = (/'So_tref ', 'So_qref ', 'So_ustar ', 'So_re ','So_ssq ', &
- 'So_u10 ', 'So_duu10n', 'Faox_lat '/)
+ flds = (/'So_tref ', 'So_qref ', 'So_ustar ', 'So_re ','So_ssq ', 'So_u10 ', &
+ 'So_duu10n', 'Faox_lat '/)
do n = 1,size(flds)
fldname = trim(flds(n))
if (phase == 'advertise') then
- call addfld_aoflux(trim(fldname))
+ call addfld_aoflux(fldname)
end if
end do
deallocate(flds)
end if
- if (trim(coupling_mode) == 'nems_frac_aoflux' .or. trim(coupling_mode) == 'nems_frac_aoflux_sbs') then
- allocate(flds(12))
- flds = (/'Sa_u ', 'Sa_v ', 'Sa_z ', 'Sa_tbot ', 'Sa_pbot ', &
- 'Sa_pslv ', 'Sa_shum ', 'Sa_ptem ', 'Sa_dens ', 'Sa_u10m ', &
- 'Sa_v10m ', 'Faxa_lwdn'/)
- do n = 1,size(flds)
- fldname = trim(flds(n))
- if (phase == 'advertise') then
- if (is_local%wrap%comp_present(compatm) )then
- call addfld_from(compatm, trim(fldname))
- end if
- else
- if ( fldchk(is_local%wrap%FBImp(compatm,compatm), trim(fldname), rc=rc)) then
- call addmap_from(compatm, trim(fldname), compocn, maptype, 'one', 'unset')
- end if
- end if
- end do
- deallocate(flds)
-
- ! fields returned by the atm/ocn flux computation which are otherwise unadvertised
- allocate(flds(13))
- flds = (/'So_tref ', 'So_qref ','So_u10 ', 'So_ustar ','So_ssq ', &
- 'So_re ', 'So_duu10n','Faox_lwup', 'Faox_sen ','Faox_lat ', &
- 'Faox_evap', 'Faox_taux','Faox_tauy'/)
- do n = 1,size(flds)
- fldname = trim(flds(n))
- if (phase == 'advertise') then
- call addfld_aoflux(trim(fldname))
- end if
- end do
- deallocate(flds)
+ ! from med: ocean albedos (not sent to the ATM in UFS).
+ if (phase == 'advertise') then
+ call addfld_ocnalb('So_avsdr')
+ call addfld_ocnalb('So_avsdf')
+ call addfld_ocnalb('So_anidr')
+ call addfld_ocnalb('So_anidf')
end if
- ! TODO: unused, but required to maintain B4B repro for mediator restarts; should be removed
+ ! Advertise the ocean albedos. These are not sent to the ATM in UFS.
if (phase == 'advertise') then
- call addfld_from(compice, 'mean_sw_pen_to_ocn')
+ call addfld_ocnalb('So_avsdr')
+ call addfld_ocnalb('So_avsdf')
+ call addfld_ocnalb('So_anidr')
+ call addfld_ocnalb('So_anidf')
end if
!=====================================================================
@@ -179,16 +166,16 @@ subroutine esmFldsExchange_nems(gcomp, phase, rc)
! to atm: fractions (computed in med_phases_prep_atm)
if (phase == 'advertise') then
if (is_local%wrap%comp_present(compice) .and. is_local%wrap%comp_present(compatm)) then
- call addfld_from(compice, 'Si_ifrac')
- call addfld_to(compatm, 'Si_ifrac')
+ call addfld_from(compice , 'Si_ifrac')
+ call addfld_to(compatm , 'Si_ifrac')
end if
! ofrac used by atm
if (is_local%wrap%comp_present(compocn) .and. is_local%wrap%comp_present(compatm)) then
- call addfld_from(compatm, 'Sa_ofrac')
+ call addfld_from(compatm , 'Sa_ofrac')
end if
! lfrac used by atm
if (is_local%wrap%comp_present(complnd) .and. is_local%wrap%comp_present(compatm)) then
- call addfld_to(compatm, 'Sl_lfrac')
+ call addfld_to(compatm , 'Sl_lfrac')
end if
end if
@@ -202,39 +189,40 @@ subroutine esmFldsExchange_nems(gcomp, phase, rc)
! - mean snow volume per unit area
! - surface temperatures
allocate(flds(9))
- flds = (/'Faii_taux', 'Faii_tauy', 'Faii_lat ', 'Faii_sen ', 'Faii_lwup', &
- 'Faii_evap', 'Si_vice ', 'Si_vsno ', 'Si_t '/)
+ flds = (/'Faii_taux', 'Faii_tauy', 'Faii_lat ', 'Faii_sen ', 'Faii_lwup', 'Faii_evap', &
+ 'Si_vice ', 'Si_vsno ', 'Si_t '/)
do n = 1,size(flds)
fldname = trim(flds(n))
if (phase == 'advertise') then
if (is_local%wrap%comp_present(compice) .and. is_local%wrap%comp_present(compatm)) then
- call addfld_from(compice, trim(fldname))
- call addfld_to(compatm, trim(fldname))
+ call addfld_from(compice , fldname)
+ call addfld_to(compatm , fldname)
end if
else
- if ( fldchk(is_local%wrap%FBexp(compatm) , trim(fldname), rc=rc) .and. &
- fldchk(is_local%wrap%FBImp(compice,compice), trim(fldname), rc=rc)) then
- call addmap_from(compice, trim(fldname), compatm, maptype, 'ifrac', 'unset')
- call addmrg_to(compatm, trim(fldname), mrg_from=compice, mrg_fld=trim(fldname), mrg_type='copy')
+ if ( fldchk(is_local%wrap%FBexp(compatm) , fldname, rc=rc) .and. &
+ fldchk(is_local%wrap%FBImp(compice,compice), fldname, rc=rc)) then
+ call addmap_from(compice, fldname, compatm, maptype, 'ifrac', 'unset')
+ call addmrg_to(compatm, fldname, mrg_from=compice, mrg_fld=fldname, mrg_type='copy')
end if
end if
end do
deallocate(flds)
+ ! to atm: unmerged sea ice albedo, 4 bands
allocate(flds(4))
flds = (/'Si_avsdr', 'Si_avsdf', 'Si_anidr', 'Si_anidf'/)
do n = 1,size(flds)
fldname = trim(flds(n))
if (phase == 'advertise') then
if (is_local%wrap%comp_present(compice) .and. is_local%wrap%comp_present(compatm)) then
- call addfld_from(compice, trim(fldname))
- call addfld_to(compatm, trim(fldname))
+ call addfld_from(compice , fldname)
+ call addfld_to(compatm , fldname)
end if
else
- if ( fldchk(is_local%wrap%FBexp(compatm) , trim(fldname), rc=rc) .and. &
- fldchk(is_local%wrap%FBImp(compice,compice), trim(fldname), rc=rc)) then
- call addmap_from(compice, trim(fldname), compatm, maptype, 'ifrac', 'unset')
- call addmrg_to(compatm, trim(fldname), mrg_from=compice, mrg_fld=trim(fldname), mrg_type='copy')
+ if ( fldchk(is_local%wrap%FBexp(compatm) , fldname, rc=rc) .and. &
+ fldchk(is_local%wrap%FBImp(compice,compice), fldname, rc=rc)) then
+ call addmap_from(compice, fldname, compatm, maptype, 'ifrac', 'unset')
+ call addmrg_to(compatm, fldname, mrg_from=compice, mrg_fld=fldname, mrg_type='copy')
end if
end if
end do
@@ -243,8 +231,8 @@ subroutine esmFldsExchange_nems(gcomp, phase, rc)
! to atm: unmerged surface temperatures from ocn
if (phase == 'advertise') then
if (is_local%wrap%comp_present(compocn) .and. is_local%wrap%comp_present(compatm)) then
- call addfld_from(compocn, 'So_t')
- call addfld_to(compatm, 'So_t')
+ call addfld_from(compocn , 'So_t')
+ call addfld_to(compatm , 'So_t')
end if
else
if ( fldchk(is_local%wrap%FBexp(compatm) , 'So_t', rc=rc) .and. &
@@ -257,8 +245,8 @@ subroutine esmFldsExchange_nems(gcomp, phase, rc)
! to atm: unmerged surface temperatures from lnd
if (phase == 'advertise') then
if (is_local%wrap%comp_present(complnd) .and. is_local%wrap%comp_present(compatm)) then
- call addfld_from(complnd, 'Sl_t')
- call addfld_to(compatm, 'Sl_t')
+ call addfld_from(complnd , 'Sl_t')
+ call addfld_to(compatm , 'Sl_t')
end if
else
if ( fldchk(is_local%wrap%FBexp(compatm) , 'Sl_t', rc=rc) .and. &
@@ -273,40 +261,36 @@ subroutine esmFldsExchange_nems(gcomp, phase, rc)
! - surface latent heat flux,
! - surface sensible heat flux
! - surface upward longwave heat flux
- ! - evaporation water flux from water, not in the list do we need to send it to atm?
- if (trim(coupling_mode) == 'nems_frac_aoflux') then
- if (is_local%wrap%comp_present(compocn) .and. is_local%wrap%comp_present(compatm)) then
- allocate(flds(5))
- flds = (/ 'lat ', 'sen ', 'lwup', 'taux', 'tauy' /)
- if (phase == 'advertise') then
- do n = 1,size(flds)
- call addfld_aoflux('Faox_'//trim(flds(n)))
- call addfld_to(compatm, 'Faox_'//trim(flds(n)))
- end do
- else
- do n = 1,size(flds)
- if (fldchk(is_local%wrap%FBMed_aoflux_o, 'Faox_'//trim(flds(n)), rc=rc)) then
- if (trim(is_local%wrap%aoflux_grid) == 'ogrid') then
- call addmap_aoflux('Faox_'//trim(flds(n)), compatm, maptype, 'ofrac', 'unset')
- end if
- call addmrg_to(compatm, 'Faox_'//trim(flds(n)), mrg_from=compmed, mrg_fld='Faox_'//trim(flds(n)), mrg_type='copy')
- end if
- end do
+ allocate(flds(5))
+ flds = (/ 'Faox_lat ', 'Faox_sen ', 'Faox_lwup', 'Faox_taux', 'Faox_tauy' /)
+ do n = 1,size(flds)
+ fldname = trim(flds(n))
+ if (phase == 'advertise') then
+ if (is_local%wrap%comp_present(compatm) .and. is_local%wrap%comp_present(compocn)) then
+ call addfld_aoflux(fldname)
+ call addfld_to(compatm , fldname)
+ end if
+ else
+ if (fldchk(is_local%wrap%FBMed_aoflux_o, fldname, rc=rc)) then
+ if (trim(is_local%wrap%aoflux_grid) == 'ogrid') then
+ call addmap_aoflux(fldname, compatm, maptype, 'ofrac', 'unset')
+ end if
+ call addmrg_to(compatm, fldname, mrg_from=compmed, mrg_fld=fldname, mrg_type='copy')
end if
- deallocate(flds)
end if
- end if
+ end do
+ deallocate(flds)
! to atm: surface roughness length from wav
if (phase == 'advertise') then
if (is_local%wrap%comp_present(compwav) .and. is_local%wrap%comp_present(compatm)) then
- call addfld_from(compwav, 'Sw_z0')
- call addfld_to(compatm, 'Sw_z0')
+ call addfld_from(compwav , 'Sw_z0')
+ call addfld_to(compatm , 'Sw_z0')
end if
else
if ( fldchk(is_local%wrap%FBexp(compatm) , 'Sw_z0', rc=rc) .and. &
fldchk(is_local%wrap%FBImp(compwav,compwav), 'Sw_z0', rc=rc)) then
- call addmap_from(compwav, 'Sw_z0', compatm, mapnstod_consf, 'one', 'unset')
+ call addmap_from(compwav, 'Sw_z0', compatm, mapbilnr_nstod, 'one', 'unset')
call addmrg_to(compatm, 'Sw_z0', mrg_from=compwav, mrg_fld='Sw_z0', mrg_type='copy')
end if
end if
@@ -318,8 +302,8 @@ subroutine esmFldsExchange_nems(gcomp, phase, rc)
! to ocn: sea level pressure from atm
if (phase == 'advertise') then
if (is_local%wrap%comp_present(compatm) .and. is_local%wrap%comp_present(compocn)) then
- call addfld_from(compatm, 'Sa_pslv')
- call addfld_to(compocn, 'Sa_pslv')
+ call addfld_from(compatm , 'Sa_pslv')
+ call addfld_to(compocn , 'Sa_pslv')
end if
else
if ( fldchk(is_local%wrap%FBexp(compocn) , 'Sa_pslv', rc=rc) .and. &
@@ -329,6 +313,16 @@ subroutine esmFldsExchange_nems(gcomp, phase, rc)
end if
end if
+ ! to ocn: swpen thru ice w/o bands
+ if (phase == 'advertise') then
+ if (is_local%wrap%comp_present(compice) .and. is_local%wrap%comp_present(compocn)) then
+ call addfld_from(compice , 'Fioi_swpen')
+ end if
+ else
+ if (fldchk(is_local%wrap%FBImp(compice,compice), 'Fioi_swpen', rc=rc)) then
+ call addmap_from(compice, 'Fioi_swpen', compocn, mapfcopy, 'unset', 'unset')
+ end if
+ end if
! to ocn: from sw from atm and sw net from ice (custom merge in med_phases_prep_ocn)
! - downward direct near-infrared ("n" or "i") incident solar radiation
! - downward diffuse near-infrared ("n" or "i") incident solar radiation
@@ -343,8 +337,8 @@ subroutine esmFldsExchange_nems(gcomp, phase, rc)
do n = 1,size(oflds)
if (phase == 'advertise') then
if (is_local%wrap%comp_present(compatm) .and. is_local%wrap%comp_present(compocn)) then
- call addfld_from(compatm, trim(aflds(n)))
- call addfld_to(compocn, trim(oflds(n)))
+ call addfld_from(compatm , trim(aflds(n)))
+ call addfld_to(compocn , trim(oflds(n)))
end if
else
if ( fldchk(is_local%wrap%FBexp(compocn) , trim(oflds(n)), rc=rc) .and. &
@@ -357,8 +351,8 @@ subroutine esmFldsExchange_nems(gcomp, phase, rc)
do n = 1,size(oflds)
if (phase == 'advertise') then
if (is_local%wrap%comp_present(compice) .and. is_local%wrap%comp_present(compocn)) then
- call addfld_from(compice, trim(iflds(n)))
- call addfld_to(compocn, trim(oflds(n)))
+ call addfld_from(compice , trim(iflds(n)))
+ call addfld_to(compocn , trim(oflds(n)))
end if
else
if ( fldchk(is_local%wrap%FBexp(compocn) , trim(oflds(n)), rc=rc) .and. &
@@ -378,182 +372,153 @@ subroutine esmFldsExchange_nems(gcomp, phase, rc)
fldname = trim(flds(n))
if (phase == 'advertise') then
if (is_local%wrap%comp_present(compatm) .and. is_local%wrap%comp_present(compocn)) then
- call addfld_from(compatm, trim(fldname))
- call addfld_to(compocn, trim(fldname))
+ call addfld_from(compatm , fldname)
+ call addfld_to(compocn , fldname)
end if
else
- if ( fldchk(is_local%wrap%FBexp(compocn) , trim(fldname), rc=rc) .and. &
- fldchk(is_local%wrap%FBImp(compatm,compatm), trim(fldname), rc=rc)) then
- call addmap_from(compatm, trim(fldname), compocn, maptype, 'one', 'unset')
- call addmrg_to(compocn, trim(fldname), &
- mrg_from=compatm, mrg_fld=trim(fldname), mrg_type='copy_with_weights', mrg_fracname='ofrac')
+ if ( fldchk(is_local%wrap%FBexp(compocn) , fldname, rc=rc) .and. &
+ fldchk(is_local%wrap%FBImp(compatm,compatm), fldname, rc=rc)) then
+ call addmap_from(compatm, fldname, compocn, maptype, 'one', 'unset')
+ call addmrg_to(compocn, fldname, &
+ mrg_from=compatm, mrg_fld=fldname, mrg_type='copy_with_weights', mrg_fracname='ofrac')
end if
end if
end do
- deallocate(flds)
-
- if (trim(coupling_mode) == 'nems_orig' .or. trim(coupling_mode) == 'nems_frac' .or. &
- trim(coupling_mode) == 'nems_frac_aoflux_sbs') then
- ! to ocn: merge surface stress (custom merge calculation in med_phases_prep_ocn)
- allocate(oflds(2))
- allocate(aflds(2))
- allocate(iflds(2))
- oflds = (/'Foxx_taux', 'Foxx_tauy'/)
- aflds = (/'Faxa_taux', 'Faxa_tauy'/)
- iflds = (/'Fioi_taux', 'Fioi_tauy'/)
- do n = 1,size(oflds)
- if (phase == 'advertise') then
- if (is_local%wrap%comp_present(compice) .and. is_local%wrap%comp_present(compatm) &
- .and. is_local%wrap%comp_present(compocn)) then
- call addfld_from(compice, trim(iflds(n)))
- call addfld_from(compatm, trim(aflds(n)))
- call addfld_to(compocn, trim(oflds(n)))
- end if
- else
- if ( fldchk(is_local%wrap%FBexp(compocn) , trim(oflds(n)), rc=rc) .and. &
- fldchk(is_local%wrap%FBImp(compice,compice), trim(iflds(n)), rc=rc) .and. &
- fldchk(is_local%wrap%FBImp(compatm,compatm), trim(aflds(n)), rc=rc)) then
- call addmap_from(compice, trim(iflds(n)), compocn, mapfcopy, 'unset', 'unset')
- call addmap_from(compatm, trim(aflds(n)), compocn, mapconsf_aofrac, 'aofrac', 'unset')
- end if
- end if
- end do
- deallocate(oflds)
- deallocate(aflds)
- deallocate(iflds)
-
- ! to ocn: net long wave via auto merge
- if (phase == 'advertise') then
- if (is_local%wrap%comp_present(compatm) .and. is_local%wrap%comp_present(compocn)) then
- call addfld_from(compatm, 'Faxa_lwnet')
- call addfld_to(compocn, 'Faxa_lwnet')
- end if
- else
- if ( fldchk(is_local%wrap%FBexp(compocn) , 'Faxa_lwnet', rc=rc) .and. &
- fldchk(is_local%wrap%FBImp(compatm,compatm), 'Faxa_lwnet', rc=rc)) then
- call addmap_from(compatm, 'Faxa_lwnet', compocn, mapconsf_aofrac, 'aofrac', 'unset')
- call addmrg_to(compocn, 'Faxa_lwnet', &
- mrg_from=compatm, mrg_fld='Faxa_lwnet', mrg_type='copy_with_weights', mrg_fracname='ofrac')
- end if
- end if
-
- ! to ocn: merged sensible heat flux (custom merge in med_phases_prep_ocn)
- if (phase == 'advertise') then
- if (is_local%wrap%comp_present(compatm) .and. is_local%wrap%comp_present(compocn)) then
- call addfld_from(compatm, 'Faxa_sen')
- call addfld_to(compocn, 'Faxa_sen')
- end if
- else
- if ( fldchk(is_local%wrap%FBexp(compocn) , 'Faxa_sen', rc=rc) .and. &
- fldchk(is_local%wrap%FBImp(compatm,compatm), 'Faxa_sen', rc=rc)) then
- call addmap_from(compatm, 'Faxa_sen', compocn, mapconsf_aofrac, 'aofrac', 'unset')
- end if
- end if
- ! to ocn: evaporation water flux (custom merge in med_phases_prep_ocn)
+ !to ocn: surface stress from mediator or atm and ice stress via auto merge
+ flds = (/'taux', 'tauy'/)
+ do n = 1,size(flds)
+ fldname = trim(flds(n))
if (phase == 'advertise') then
- if (is_local%wrap%comp_present(compatm) .and. is_local%wrap%comp_present(compocn)) then
- call addfld_from(compatm, 'Faxa_lat')
- call addfld_to(compocn, 'Faxa_evap')
+ if (is_local%wrap%comp_present(compice) .and. is_local%wrap%comp_present(compocn)) then
+ call addfld_aoflux('Faox_'//fldname)
+ call addfld_from(compatm , 'Faxa_'//fldname)
+ call addfld_from(compice , 'Fioi_'//fldname)
+ call addfld_to(compocn , 'Foxx_'//fldname)
end if
else
- if ( fldchk(is_local%wrap%FBexp(compocn) , 'Faxa_evap', rc=rc) .and. &
- fldchk(is_local%wrap%FBImp(compatm,compatm), 'Faxa_lat' , rc=rc)) then
- call addmap_from(compatm, 'Faxa_lat', compocn, mapconsf_aofrac, 'aofrac', 'unset')
- end if
- end if
- else if (trim(coupling_mode) == 'nems_orig_data' .or. trim(coupling_mode) == 'nems_frac_aoflux') then
- ! nems_orig_data
- ! to ocn: surface stress from mediator and ice stress via auto merge
- allocate(flds(2))
- flds = (/'taux', 'tauy'/)
- do n = 1,size(flds)
- if (phase == 'advertise') then
- if (is_local%wrap%comp_present(compice) .and. is_local%wrap%comp_present(compocn)) then
- call addfld_aoflux('Faox_'//trim(flds(n)))
- call addfld_from(compice , 'Fioi_'//trim(flds(n)))
- call addfld_to(compocn , 'Foxx_'//trim(flds(n)))
+ if (med_aoflux_to_ocn) then
+ if ( fldchk(is_local%wrap%FBexp(compocn) , 'Foxx_'//fldname, rc=rc) .and. &
+ fldchk(is_local%wrap%FBImp(compice,compice), 'Fioi_'//fldname, rc=rc) .and. &
+ fldchk(is_local%wrap%FBMed_aoflux_o , 'Faox_'//fldname, rc=rc)) then
+ call addmap_from(compice, 'Fioi_'//fldname, compocn, mapfcopy, 'unset', 'unset')
+ call addmrg_to(compocn, 'Foxx_'//fldname, &
+ mrg_from=compmed, mrg_fld='Faox_'//fldname, mrg_type='merge', mrg_fracname='ofrac')
+ call addmrg_to(compocn, 'Foxx_'//fldname, &
+ mrg_from=compice, mrg_fld='Fioi_'//fldname, mrg_type='merge', mrg_fracname='ifrac')
end if
else
- if ( fldchk(is_local%wrap%FBexp(compocn) , 'Foxx_'//trim(flds(n)), rc=rc) .and. &
- fldchk(is_local%wrap%FBMed_aoflux_o , 'Faox_'//trim(flds(n)), rc=rc) .and. &
- fldchk(is_local%wrap%FBImp(compice,compice), 'Fioi_'//trim(flds(n)), rc=rc)) then
- call addmap_from(compice, 'Fioi_'//trim(flds(n)), compocn, mapfcopy, 'unset', 'unset')
- call addmrg_to(compocn, 'Foxx_'//trim(flds(n)), &
- mrg_from=compmed, mrg_fld='Faox_'//trim(flds(n)), mrg_type='merge', mrg_fracname='ofrac')
- call addmrg_to(compocn, 'Foxx_'//trim(flds(n)), &
- mrg_from=compice, mrg_fld='Fioi_'//trim(flds(n)), mrg_type='merge', mrg_fracname='ifrac')
+ if ( fldchk(is_local%wrap%FBexp(compocn) , 'Foxx_'//fldname, rc=rc) .and. &
+ fldchk(is_local%wrap%FBImp(compice,compice), 'Fioi_'//fldname, rc=rc) .and. &
+ fldchk(is_local%wrap%FBImp(compatm,compatm), 'Faxa_'//fldname, rc=rc)) then
+ call addmap_from(compice, 'Fioi_'//fldname, compocn, mapfcopy, 'unset', 'unset')
+ call addmap_from(compatm, 'Faxa_'//fldname, compocn, mapconsf_aofrac, 'aofrac', 'unset')
+ call addmrg_to(compocn, 'Foxx_'//fldname, &
+ mrg_from=compice, mrg_fld='Fioi_'//fldname, mrg_type='merge', mrg_fracname='ifrac')
+ call addmrg_to(compocn, 'Foxx_'//fldname, &
+ mrg_from=compatm, mrg_fld='Faxa_'//fldname, mrg_type='merge', mrg_fracname='ofrac')
end if
end if
+ end if
end do
- deallocate(flds)
+ deallocate(flds)
- ! to ocn: long wave net via auto merge
- if (phase == 'advertise') then
- if (is_local%wrap%comp_present(compatm) .and. is_local%wrap%comp_present(compocn)) then
- call addfld_aoflux('Faox_lwup')
- call addfld_from(compatm, 'Faxa_lwdn')
- call addfld_to(compocn, 'Foxx_lwnet')
- end if
- else
+ ! to ocn: net long wave via auto merge
+ if (phase == 'advertise') then
+ if (is_local%wrap%comp_present(compatm) .and. is_local%wrap%comp_present(compocn)) then
+ call addfld_aoflux('Faox_lwup')
+ call addfld_from(compatm , 'Faxa_lwnet')
+ call addfld_from(compatm , 'Faxa_lwdn')
+ call addfld_to(compocn , 'Foxx_lwnet')
+ end if
+ else
+ if (med_aoflux_to_ocn) then
if ( fldchk(is_local%wrap%FBexp(compocn) , 'Foxx_lwnet', rc=rc) .and. &
- fldchk(is_local%wrap%FBMed_aoflux_o , 'Faox_lwup' , rc=rc) .and. &
- fldchk(is_local%wrap%FBImp(compatm,compatm), 'Faxa_lwdn' , rc=rc)) then
+ fldchk(is_local%wrap%FBImp(compatm,compatm), 'Faxa_lwdn' , rc=rc) .and. &
+ fldchk(is_local%wrap%FBMed_aoflux_o , 'Faox_lwup' , rc=rc)) then
call addmap_from(compatm, 'Faxa_lwdn', compocn, maptype, 'one', 'unset')
call addmrg_to(compocn, 'Foxx_lwnet', &
mrg_from=compmed, mrg_fld='Faox_lwup', mrg_type='merge', mrg_fracname='ofrac')
call addmrg_to(compocn, 'Foxx_lwnet', &
mrg_from=compatm, mrg_fld='Faxa_lwdn', mrg_type='merge', mrg_fracname='ofrac')
end if
+ else
+ if ( fldchk(is_local%wrap%FBexp(compocn) , 'Foxx_lwnet', rc=rc) .and. &
+ fldchk(is_local%wrap%FBImp(compatm,compatm), 'Faxa_lwnet', rc=rc)) then
+ call addmap_from(compatm, 'Faxa_lwnet', compocn, mapconsf_aofrac, 'aofrac', 'unset')
+ call addmrg_to(compocn, 'Foxx_lwnet', &
+ mrg_from=compatm, mrg_fld='Faxa_lwnet', mrg_type='copy_with_weights', mrg_fracname='ofrac')
+ end if
end if
+ end if
- ! to ocn: sensible heat flux from mediator via auto merge
- if (phase == 'advertise') then
- if (is_local%wrap%comp_present(compocn)) then
- call addfld_aoflux('Faox_sen')
- call addfld_to(compocn, 'Faox_sen')
- end if
- else
- if ( fldchk(is_local%wrap%FBexp(compocn) , 'Faox_sen', rc=rc) .and. &
+ ! to ocn: sensible heat flux
+ if (phase == 'advertise') then
+ if (is_local%wrap%comp_present(compatm) .and. is_local%wrap%comp_present(compocn)) then
+ call addfld_aoflux('Faox_sen')
+ call addfld_from(compatm , 'Faxa_sen')
+ call addfld_to(compocn , 'Foxx_sen')
+ end if
+ else
+ if (med_aoflux_to_ocn) then
+ if ( fldchk(is_local%wrap%FBexp(compocn) , 'Foxx_sen', rc=rc) .and. &
fldchk(is_local%wrap%FBMed_aoflux_o , 'Faox_sen' , rc=rc)) then
- call addmrg_to(compocn, 'Faox_sen', &
+ call addmrg_to(compocn, 'Foxx_sen', &
mrg_from=compmed, mrg_fld='Faox_sen', mrg_type='copy_with_weights', mrg_fracname='ofrac')
end if
+ else
+ if ( fldchk(is_local%wrap%FBexp(compocn) , 'Foxx_sen', rc=rc) .and. &
+ fldchk(is_local%wrap%FBImp(compatm,compatm), 'Faxa_sen', rc=rc)) then
+ call addmap_from(compatm, 'Faxa_sen', compocn, mapconsf_aofrac, 'aofrac', 'unset')
+ call addmrg_to(compocn, 'Foxx_sen', &
+ mrg_from=compatm, mrg_fld='Faxa_sen', mrg_type='copy_with_weights', mrg_fracname='ofrac')
+ end if
end if
+ end if
- ! to ocn: evaporation water flux from mediator via auto merge
- if (phase == 'advertise') then
- if (is_local%wrap%comp_present(compocn)) then
- call addfld_aoflux('Faox_evap')
- call addfld_to(compocn, 'Faox_evap')
- end if
- else
- if ( fldchk(is_local%wrap%FBexp(compocn) , 'Faox_evap', rc=rc) .and. &
+ ! to ocn: evaporation water flux
+ if (phase == 'advertise') then
+ if (is_local%wrap%comp_present(compatm) .and. is_local%wrap%comp_present(compocn)) then
+ call addfld_aoflux('Faox_evap')
+ call addfld_from(compatm , 'Faxa_evap')
+ call addfld_to(compocn , 'Foxx_evap')
+ end if
+ else
+ if (med_aoflux_to_ocn) then
+ if ( fldchk(is_local%wrap%FBexp(compocn) , 'Foxx_evap', rc=rc) .and. &
fldchk(is_local%wrap%FBMed_aoflux_o , 'Faox_evap' , rc=rc)) then
- call addmrg_to(compocn, 'Faox_evap', &
+ call addmrg_to(compocn, 'Foxx_evap', &
mrg_from=compmed, mrg_fld='Faox_evap', mrg_type='copy_with_weights', mrg_fracname='ofrac')
end if
+ else
+ if ( fldchk(is_local%wrap%FBexp(compocn) , 'Foxx_evap', rc=rc) .and. &
+ fldchk(is_local%wrap%FBImp(compatm,compatm), 'Faxa_evap' , rc=rc)) then
+ call addmap_from(compatm, 'Faxa_evap', compocn, mapconsf_aofrac, 'aofrac', 'unset')
+ call addmrg_to(compocn, 'Foxx_evap', &
+ mrg_from=compatm, mrg_fld='Faxa_evap', mrg_type='copy_with_weights', mrg_fracname='ofrac')
+ end if
end if
end if
- ! to ocn: water flux due to melting ice from ice
- ! to ocn: heat flux from melting ice from ice
- ! to ocn: salt flux from ice
+ ! to ocn: unmerged fluxes from ice
+ ! - water flux due to melting ice from ice
+ ! - heat flux from melting ice from ice
+ ! - salt flux from ice
allocate(flds(3))
flds = (/'Fioi_meltw', 'Fioi_melth', 'Fioi_salt '/)
do n = 1,size(flds)
fldname = trim(flds(n))
if (phase == 'advertise') then
if (is_local%wrap%comp_present(compice) .and. is_local%wrap%comp_present(compocn)) then
- call addfld_from(compice, trim(fldname))
- call addfld_to(compocn, trim(fldname))
+ call addfld_from(compice , fldname)
+ call addfld_to(compocn , fldname)
end if
else
- if ( fldchk(is_local%wrap%FBexp(compocn) , trim(fldname), rc=rc) .and. &
- fldchk(is_local%wrap%FBImp(compice,compice), trim(fldname), rc=rc)) then
- call addmap_from(compice, trim(fldname), compocn, mapfcopy, 'unset', 'unset')
- call addmrg_to(compocn, trim(fldname), &
- mrg_from=compice, mrg_fld=trim(fldname), mrg_type='copy_with_weights', mrg_fracname='ifrac')
+ if ( fldchk(is_local%wrap%FBexp(compocn) , fldname, rc=rc) .and. &
+ fldchk(is_local%wrap%FBImp(compice,compice), fldname, rc=rc)) then
+ call addmap_from(compice, fldname, compocn, mapfcopy, 'unset', 'unset')
+ call addmrg_to(compocn, fldname, &
+ mrg_from=compice, mrg_fld=fldname, mrg_type='copy_with_weights', mrg_fracname='ifrac')
end if
end if
end do
@@ -566,14 +531,14 @@ subroutine esmFldsExchange_nems(gcomp, phase, rc)
fldname = trim(flds(n))
if (phase == 'advertise') then
if (is_local%wrap%comp_present(compwav) .and. is_local%wrap%comp_present(compocn)) then
- call addfld_from(compwav, trim(fldname))
- call addfld_to(compocn, trim(fldname))
+ call addfld_from(compwav , fldname)
+ call addfld_to(compocn , fldname)
end if
else
- if ( fldchk(is_local%wrap%FBexp(compocn) , trim(fldname), rc=rc) .and. &
- fldchk(is_local%wrap%FBImp(compwav,compwav), trim(fldname), rc=rc)) then
- call addmap_from(compwav, trim(fldname), compocn, mapbilnr_nstod, 'one', 'unset')
- call addmrg_to(compocn, trim(fldname), mrg_from=compwav, mrg_fld=trim(fldname), mrg_type='copy')
+ if ( fldchk(is_local%wrap%FBexp(compocn) , fldname, rc=rc) .and. &
+ fldchk(is_local%wrap%FBImp(compwav,compwav), fldname, rc=rc)) then
+ call addmap_from(compwav, fldname, compocn, mapbilnr_nstod, 'one', 'unset')
+ call addmrg_to(compocn, fldname, mrg_from=compwav, mrg_fld=fldname, mrg_type='copy')
end if
end if
end do
@@ -583,14 +548,14 @@ subroutine esmFldsExchange_nems(gcomp, phase, rc)
! FIELDS TO ICE (compice)
!=====================================================================
- ! to ice - fluxes from atm
- ! to ice: downward longwave heat flux from atm
- ! to ice: downward direct near-infrared incident solar radiation from atm
- ! to ice: downward direct visible incident solar radiation from atm
- ! to ice: downward diffuse near-infrared incident solar radiation from atm
- ! to ice: downward Diffuse visible incident solar radiation from atm
- ! to ice: rain from atm
- ! to ice: snow from atm
+ ! to ice: fluxes from atm
+ ! - downward longwave heat flux from atm
+ ! - downward direct near-infrared incident solar radiation from atm
+ ! - downward direct visible incident solar radiation from atm
+ ! - downward diffuse near-infrared incident solar radiation from atm
+ ! - downward Diffuse visible incident solar radiation from atm
+ ! - rain from atm
+ ! - snow from atm
allocate(flds(7))
flds = (/'Faxa_lwdn ', 'Faxa_swndr', 'Faxa_swvdr', 'Faxa_swndf', 'Faxa_swvdf', &
@@ -599,69 +564,67 @@ subroutine esmFldsExchange_nems(gcomp, phase, rc)
fldname = trim(flds(n))
if (phase == 'advertise') then
if (is_local%wrap%comp_present(compatm) .and. is_local%wrap%comp_present(compice)) then
- call addfld_from(compatm, trim(fldname))
- call addfld_to(compice, trim(fldname))
+ call addfld_from(compatm , fldname)
+ call addfld_to(compice , fldname)
end if
else
- if ( fldchk(is_local%wrap%FBexp(compice) , trim(fldname), rc=rc) .and. &
- fldchk(is_local%wrap%FBImp(compatm,compatm), trim(fldname), rc=rc)) then
- call addmap_from(compatm, trim(fldname), compice, maptype, 'one', 'unset')
- call addmrg_to(compice, trim(fldname), mrg_from=compatm, mrg_fld=trim(fldname), mrg_type='copy')
+ if ( fldchk(is_local%wrap%FBexp(compice) , fldname, rc=rc) .and. &
+ fldchk(is_local%wrap%FBImp(compatm,compatm), fldname, rc=rc)) then
+ call addmap_from(compatm, fldname, compice, maptype, 'one', 'unset')
+ call addmrg_to(compice, fldname, mrg_from=compatm, mrg_fld=fldname, mrg_type='copy')
end if
end if
end do
deallocate(flds)
- ! to ice - state from atm
- ! to ice: height at the lowest model level from atm
- ! to ice: pressure at the lowest model level from atm
- ! to ice: temperature at the lowest model level from atm
- ! to ice: zonal wind at the lowest model level from atm
- ! to ice: meridional wind at the lowest model level from atm
- ! to ice: specific humidity at the lowest model level from atm
+ ! to ice: states from atm
+ ! - height at the lowest model level from atm
+ ! - pressure at the lowest model level from atm
+ ! - temperature at the lowest model level from atm
+ ! - zonal wind at the lowest model level from atm
+ ! - meridional wind at the lowest model level from atm
+ ! - specific humidity at the lowest model level from atm
allocate(flds(6))
- flds = (/'Sa_u ', 'Sa_v ', 'Sa_z ', 'Sa_tbot', 'Sa_pbot', &
- 'Sa_shum'/)
+ flds = (/'Sa_u ', 'Sa_v ', 'Sa_z ', 'Sa_tbot', 'Sa_pbot', 'Sa_shum'/)
do n = 1,size(flds)
fldname = trim(flds(n))
if (phase == 'advertise') then
if (is_local%wrap%comp_present(compatm) .and. is_local%wrap%comp_present(compice)) then
- call addfld_from(compatm, trim(fldname))
- call addfld_to(compice, trim(fldname))
+ call addfld_from(compatm , fldname)
+ call addfld_to(compice , fldname)
endif
else
- if ( fldchk(is_local%wrap%FBexp(compice) , trim(fldname), rc=rc) .and. &
- fldchk(is_local%wrap%FBImp(compatm,compatm), trim(fldname), rc=rc)) then
- call addmap_from(compatm, trim(fldname), compice, maptype, 'one', 'unset')
- call addmrg_to(compice, trim(fldname), mrg_from=compatm, mrg_fld=trim(fldname), mrg_type='copy')
+ if ( fldchk(is_local%wrap%FBexp(compice) , fldname, rc=rc) .and. &
+ fldchk(is_local%wrap%FBImp(compatm,compatm), fldname, rc=rc)) then
+ call addmap_from(compatm, fldname, compice, maptype, 'one', 'unset')
+ call addmrg_to(compice, fldname, mrg_from=compatm, mrg_fld=fldname, mrg_type='copy')
end if
end if
end do
deallocate(flds)
- ! to ice - states and fluxes from ocn
- ! to ice: sea surface temperature from ocn
- ! to ice: sea surface salinity from ocn
- ! to ice: zonal sea water velocity from ocn
- ! to ice: meridional sea water velocity from ocn
- ! to ice: zonal sea surface slope from ocn
- ! to ice: meridional sea surface slope from ocn
- ! to ice: ocean melt and freeze potential from ocn
+ ! to ice: states and fluxes from ocn
+ ! - sea surface temperature from ocn
+ ! - sea surface salinity from ocn
+ ! - zonal sea water velocity from ocn
+ ! - meridional sea water velocity from ocn
+ ! - zonal sea surface slope from ocn
+ ! - meridional sea surface slope from ocn
+ ! - ocean melt and freeze potential from ocn
allocate(flds(7))
- flds = (/'So_t ', 'So_s ', 'So_u ', 'So_v ','So_dhdx', &
- 'So_dhdy', 'Fioo_q '/)
+ flds = (/'So_t ', 'So_s ', 'So_u ', 'So_v ','So_dhdx', 'So_dhdy', 'Fioo_q '/)
do n = 1,size(flds)
fldname = trim(flds(n))
if (phase == 'advertise') then
if (is_local%wrap%comp_present(compocn) .and. is_local%wrap%comp_present(compice)) then
- call addfld_from(compocn, trim(fldname))
- call addfld_to(compice, trim(fldname))
+ call addfld_from(compocn , fldname)
+ call addfld_to(compice , fldname)
endif
else
- if ( fldchk(is_local%wrap%FBexp(compice) , trim(fldname), rc=rc) .and. &
- fldchk(is_local%wrap%FBImp(compocn,compocn), trim(fldname), rc=rc)) then
- call addmap_from(compocn, trim(fldname), compice, mapfcopy , 'unset', 'unset')
- call addmrg_to(compice, trim(fldname), mrg_from=compocn, mrg_fld=trim(fldname), mrg_type='copy')
+ if ( fldchk(is_local%wrap%FBexp(compice) , fldname, rc=rc) .and. &
+ fldchk(is_local%wrap%FBImp(compocn,compocn), fldname, rc=rc)) then
+ call addmap_from(compocn, fldname, compice, mapfcopy , 'unset', 'unset')
+ call addmrg_to(compice, fldname, mrg_from=compocn, mrg_fld=fldname, mrg_type='copy')
end if
end if
end do
@@ -669,8 +632,8 @@ subroutine esmFldsExchange_nems(gcomp, phase, rc)
if (phase == 'advertise') then
if (is_local%wrap%comp_present(compice) .and. is_local%wrap%comp_present(compwav)) then
- call addfld_from(compwav, 'Sw_elevation_spectrum')
- call addfld_to(compice, 'Sw_elevation_spectrum')
+ call addfld_from(compwav , 'Sw_elevation_spectrum')
+ call addfld_to(compice , 'Sw_elevation_spectrum')
end if
else
if ( fldchk(is_local%wrap%FBExp(compice) , 'Sw_elevation_spectrum', rc=rc) .and. &
@@ -685,63 +648,69 @@ subroutine esmFldsExchange_nems(gcomp, phase, rc)
! FIELDS TO WAV (compwav)
!=====================================================================
- ! to wav - 10m winds and bottom temperature from atm
+ ! to wav: states from atm
+ ! - 10m meridonal and zonal winds
+ ! - bottom temperature from atm
allocate(flds(3))
flds = (/'Sa_u10m', 'Sa_v10m', 'Sa_tbot'/)
do n = 1,size(flds)
fldname = trim(flds(n))
if (phase == 'advertise') then
if (is_local%wrap%comp_present(compatm) .and. is_local%wrap%comp_present(compwav)) then
- call addfld_from(compatm, trim(fldname))
- call addfld_to(compwav, trim(fldname))
+ call addfld_from(compatm , fldname)
+ call addfld_to(compwav , fldname)
end if
else
- if ( fldchk(is_local%wrap%FBexp(compwav) , trim(fldname), rc=rc) .and. &
- fldchk(is_local%wrap%FBImp(compatm,compatm), trim(fldname), rc=rc)) then
- call addmap_from(compatm, trim(fldname), compwav, mapnstod_consf, 'one', 'unset')
- call addmrg_to(compwav, trim(fldname), mrg_from=compatm, mrg_fld=trim(fldname), mrg_type='copy')
+ if ( fldchk(is_local%wrap%FBexp(compwav) , fldname, rc=rc) .and. &
+ fldchk(is_local%wrap%FBImp(compatm,compatm), fldname, rc=rc)) then
+ call addmap_from(compatm, fldname, compwav, mapbilnr_nstod, 'one', 'unset')
+ call addmrg_to(compwav, fldname, mrg_from=compatm, mrg_fld=fldname, mrg_type='copy')
end if
end if
end do
deallocate(flds)
- ! to wav: sea ice fraction, thickness and floe diameter
+ ! to wav: states from ice
+ ! - sea ice fraction
+ ! - sea ice thickness
+ ! - sea ice floe diameter
allocate(flds(3))
flds = (/'Si_ifrac ', 'Si_floediam', 'Si_thick '/)
do n = 1,size(flds)
fldname = trim(flds(n))
if (phase == 'advertise') then
if (is_local%wrap%comp_present(compice) .and. is_local%wrap%comp_present(compwav)) then
- call addfld_from(compice, trim(fldname))
- call addfld_to(compwav, trim(fldname))
+ call addfld_from(compice , fldname)
+ call addfld_to(compwav , fldname)
end if
else
- if ( fldchk(is_local%wrap%FBexp(compwav) , trim(fldname), rc=rc) .and. &
- fldchk(is_local%wrap%FBImp(compice,compice), trim(fldname), rc=rc)) then
- call addmap_from(compice, trim(fldname), compwav, mapbilnr_nstod , 'one', 'unset')
- call addmrg_to(compwav, trim(fldname), mrg_from=compice, mrg_fld=trim(fldname), mrg_type='copy')
+ if ( fldchk(is_local%wrap%FBexp(compwav) , fldname, rc=rc) .and. &
+ fldchk(is_local%wrap%FBImp(compice,compice), fldname, rc=rc)) then
+ call addmap_from(compice, fldname, compwav, mapbilnr_nstod , 'one', 'unset')
+ call addmrg_to(compwav, fldname, mrg_from=compice, mrg_fld=fldname, mrg_type='copy')
end if
end if
end do
deallocate(flds)
- ! to wav: zonal sea water velocity from ocn
- ! to wav: meridional sea water velocity from ocn
- ! to wav: surface temperature from ocn
- allocate(flds(3))
- flds = (/'So_u', 'So_v', 'So_t'/)
- do n = 1,size(flds)
- fldname = trim(flds(n))
- if (phase == 'advertise') then
- if (is_local%wrap%comp_present(compocn) .and. is_local%wrap%comp_present(compwav)) then
- call addfld_from(compocn, trim(fldname))
- call addfld_to(compwav, trim(fldname))
- end if
- else
- if ( fldchk(is_local%wrap%FBexp(compwav) , trim(fldname), rc=rc) .and. &
- fldchk(is_local%wrap%FBImp(compocn,compocn), trim(fldname), rc=rc)) then
- call addmap_from(compocn, trim(fldname), compwav, mapbilnr_nstod , 'one', 'unset')
- call addmrg_to(compwav, trim(fldname), mrg_from=compocn, mrg_fld=trim(fldname), mrg_type='copy')
+ ! to wav: states from ocn
+ ! - zonal sea water velocity from ocn
+ ! - meridional sea water velocity from ocn
+ ! - surface temperature from ocn
+ allocate(flds(3))
+ flds = (/'So_u', 'So_v', 'So_t'/)
+ do n = 1,size(flds)
+ fldname = trim(flds(n))
+ if (phase == 'advertise') then
+ if (is_local%wrap%comp_present(compocn) .and. is_local%wrap%comp_present(compwav)) then
+ call addfld_from(compocn , fldname)
+ call addfld_to(compwav , fldname)
+ end if
+ else
+ if ( fldchk(is_local%wrap%FBexp(compwav) , fldname, rc=rc) .and. &
+ fldchk(is_local%wrap%FBImp(compocn,compocn), fldname, rc=rc)) then
+ call addmap_from(compocn, fldname, compwav, mapbilnr_nstod , 'one', 'unset')
+ call addmrg_to(compwav, fldname, mrg_from=compocn, mrg_fld=fldname, mrg_type='copy')
end if
end if
end do
@@ -772,14 +741,14 @@ subroutine esmFldsExchange_nems(gcomp, phase, rc)
fldname = trim(flds(n))
if (phase == 'advertise') then
if (is_local%wrap%comp_present(compatm) .and. is_local%wrap%comp_present(complnd)) then
- call addfld_from(compatm, trim(fldname))
- call addfld_to(complnd, trim(fldname))
+ call addfld_from(compatm , fldname)
+ call addfld_to(complnd , fldname)
end if
else
- if ( fldchk(is_local%wrap%FBexp(complnd) , trim(fldname), rc=rc) .and. &
- fldchk(is_local%wrap%FBImp(compatm,compatm), trim(fldname), rc=rc)) then
- call addmap_from(compatm, trim(fldname), complnd, maptype, 'one', 'unset')
- call addmrg_to(complnd, trim(fldname), mrg_from=compatm, mrg_fld=trim(fldname), mrg_type='copy')
+ if ( fldchk(is_local%wrap%FBexp(complnd) , fldname, rc=rc) .and. &
+ fldchk(is_local%wrap%FBImp(compatm,compatm), fldname, rc=rc)) then
+ call addmap_from(compatm, fldname, complnd, maptype, 'one', 'unset')
+ call addmrg_to(complnd, fldname, mrg_from=compatm, mrg_fld=fldname, mrg_type='copy')
end if
end if
end do
diff --git a/mediator/fd_cesm.yaml b/mediator/fd_cesm.yaml
index 648a4fed2..c09a63c58 100644
--- a/mediator/fd_cesm.yaml
+++ b/mediator/fd_cesm.yaml
@@ -325,6 +325,10 @@
canonical_units: mol/mol
description: atmosphere export - O3 in the lowest model layer (prognosed or prescribed)
#
+ - standard_name: Sa_lightning
+ canonical_units: /min
+ description: atmosphere export - lightning flash freqency
+ #
- standard_name: Sa_topo
alias: inst_surface_height
canonical_units: m
@@ -745,7 +749,7 @@
description: sea-ice export - ice thickness
#
- standard_name: Si_floediam
- canonical_units: m
+ canonical_units: m
description: sea-ice export - ice floe diameter
#
#-----------------------------------
@@ -1172,6 +1176,21 @@
canonical_units: m2/s
description: wave elevation spectrum
+ #
+ #-----------------------------------
+ # section: wave import
+ #-----------------------------------
+ #
+ - standard_name: Fwxx_taux
+ alias: mean_zonal_moment_flx
+ canonical_units: N m-2
+ description: wave import - zonal surface stress
+ #
+ - standard_name: Fwxx_tauy
+ alias: mean_merid_moment_flx
+ canonical_units: N m-2
+ description: wave import - meridional surface stress
+
#-----------------------------------
# mediator fields
#-----------------------------------
diff --git a/mediator/med.F90 b/mediator/med.F90
index e7c6da9d3..9bb936f60 100644
--- a/mediator/med.F90
+++ b/mediator/med.F90
@@ -661,6 +661,7 @@ subroutine AdvertiseFields(gcomp, importState, exportState, clock, rc)
use NUOPC , only : NUOPC_CompAttributeGet, NUOPC_CompAttributeSet, NUOPC_CompAttributeAdd
use esmFlds, only : med_fldlist_init1, med_fld_GetFldInfo, med_fldList_entry_type
use med_phases_history_mod, only : med_phases_history_init
+ use med_methods_mod , only : mediator_checkfornans
! input/output variables
type(ESMF_GridComp) :: gcomp
@@ -916,6 +917,23 @@ subroutine AdvertiseFields(gcomp, importState, exportState, clock, rc)
end if
end do ! end of ncomps loop
+ ! Should mediator check for NaNs?
+ call NUOPC_CompAttributeGet(gcomp, name="check_for_nans", value=cvalue, isPresent=isPresent, isSet=isSet, rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+ if(isPresent .and. isSet) then
+ read(cvalue, *) mediator_checkfornans
+ else
+ mediator_checkfornans = .false.
+ endif
+ if(maintask) then
+ write(logunit,*) ' check_for_nans is ',mediator_checkfornans
+ if(mediator_checkfornans) then
+ write(logunit,*) ' Fields will be checked for NaN values when passed from mediator to component'
+ else
+ write(logunit,*) ' Fields will NOT be checked for NaN values when passed from mediator to component'
+ endif
+ endif
+
if (profile_memory) call ESMF_VMLogMemInfo("Leaving "//trim(subname))
call ESMF_LogWrite(trim(subname)//": done", ESMF_LOGMSG_INFO)
@@ -1756,7 +1774,7 @@ subroutine DataInitialize(gcomp, rc)
!---------------------------------------
! NOTE: this section must be done BEFORE the second call to esmFldsExchange
- ! Create field bundles for mediator ocean albedo computation
+ ! Create field bundles for mediator atm/ocean flux computation
fieldCount = med_fldList_GetNumFlds(med_fldList_getaofluxfldList())
if ( fieldCount > 0 ) then
if ( is_local%wrap%med_coupling_active(compocn,compatm) .or. &
@@ -1785,7 +1803,8 @@ subroutine DataInitialize(gcomp, rc)
call esmFldsExchange_cesm(gcomp, phase='initialize', rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
else if (trim(coupling_mode(1:4)) == 'nems') then
- call esmFldsExchange_nems(gcomp, phase='initialize', rc=rc)
+ call esmFldsExchange_nems(gcomp, phase='initialize', rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
else if (trim(coupling_mode) == 'hafs') then
call esmFldsExchange_hafs(gcomp, phase='initialize', rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
@@ -1920,14 +1939,12 @@ subroutine DataInitialize(gcomp, rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
!----------------------------------------------------------
- ! Initialize ocean albedos (this is needed for cesm and hafs)
+ ! Initialize ocean albedos
!----------------------------------------------------------
- if (trim(coupling_mode(1:5)) /= 'nems_') then
- if (is_local%wrap%comp_present(compocn) .or. is_local%wrap%comp_present(compatm)) then
- call med_phases_ocnalb_run(gcomp, rc=rc)
- if (ChkErr(rc,__LINE__,u_FILE_u)) return
- end if
+ if (is_local%wrap%comp_present(compocn) .or. is_local%wrap%comp_present(compatm)) then
+ call med_phases_ocnalb_run(gcomp, rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
end if
!---------------------------------------
diff --git a/mediator/med_diag_mod.F90 b/mediator/med_diag_mod.F90
index 802334f6f..8ea6651ea 100644
--- a/mediator/med_diag_mod.F90
+++ b/mediator/med_diag_mod.F90
@@ -95,6 +95,8 @@ module med_diag_mod
character(*), parameter :: FA1 = "(' ',a12,6f15.8)"
character(*), parameter :: FA0r = "(' ',12x,8(6x,a8,1x))"
character(*), parameter :: FA1r = "(' ',a12,8f15.8)"
+ character(*), parameter :: FA0s = "(' ',12x,8(7x,a8,2x))"
+ character(*), parameter :: FA1s = "(' ',a12,8g18.8)"
! ---------------------------------
! C for component
@@ -2683,7 +2685,7 @@ subroutine med_diag_print_summary(data, ip, date, tod)
write(diagunit,*) ' '
write(diagunit,FAH) subname,'NET SALT BUDGET (kg/m2s): period = ',&
trim(budget_diags%periods(ip)%name), ': date = ',date,tod
- write(diagunit,FA0r) ' atm',' lnd',' rof',' ocn',' ice nh',' ice sh',' glc',' *SUM* '
+ write(diagunit,FA0s) ' atm',' lnd',' rof',' ocn',' ice nh',' ice sh',' glc',' *SUM* '
do nf = f_salt_beg, f_salt_end
net_salt_atm = data(nf, c_atm_recv, ip) + data(nf, c_atm_send, ip)
net_salt_lnd = data(nf, c_lnd_recv, ip) + data(nf, c_lnd_send, ip)
@@ -2695,7 +2697,7 @@ subroutine med_diag_print_summary(data, ip, date, tod)
net_salt_tot = net_salt_atm + net_salt_lnd + net_salt_rof + net_salt_ocn + &
net_salt_ice_nh + net_salt_ice_sh + net_salt_glc
- write(diagunit,FA1r) budget_diags%fields(nf)%name,&
+ write(diagunit,FA1s) budget_diags%fields(nf)%name,&
net_salt_atm, net_salt_lnd, net_salt_rof, net_salt_ocn, &
net_salt_ice_nh, net_salt_ice_sh, net_salt_glc, net_salt_tot
enddo
@@ -2718,7 +2720,7 @@ subroutine med_diag_print_summary(data, ip, date, tod)
sum_net_salt_tot = sum_net_salt_atm + sum_net_salt_lnd + sum_net_salt_rof + sum_net_salt_ocn + &
sum_net_salt_ice_nh + sum_net_salt_ice_sh + sum_net_salt_glc
- write(diagunit,FA1r)' *SUM*',&
+ write(diagunit,FA1s)' *SUM*',&
sum_net_salt_atm, sum_net_salt_lnd, sum_net_salt_rof, sum_net_salt_ocn, &
sum_net_salt_ice_nh, sum_net_salt_ice_sh, sum_net_salt_glc, sum_net_salt_tot
end if
diff --git a/mediator/med_fraction_mod.F90 b/mediator/med_fraction_mod.F90
index 2fd83972a..7fe0315b6 100644
--- a/mediator/med_fraction_mod.F90
+++ b/mediator/med_fraction_mod.F90
@@ -365,11 +365,8 @@ subroutine med_fraction_init(gcomp, rc)
call med_map_field(field_src, field_dst, is_local%wrap%RH(compocn,compatm,:), maptype, rc=rc)
if (chkerr(rc,__LINE__,u_FILE_u)) return
- ! Set 'aofrac' in FBfrac(compatm)
- if (trim(coupling_mode) == 'nems_orig' .or. &
- trim(coupling_mode) == 'nems_frac' .or. &
- trim(coupling_mode) == 'nems_frac_aoflux' .or. &
- trim(coupling_mode) == 'nems_frac_aoflux_sbs') then
+ ! Set 'aofrac' in FBfrac(compatm) if available
+ if ( fldbun_fldchk(is_local%wrap%FBImp(compatm,compatm), 'Sa_ofrac', rc=rc)) then
call fldbun_getdata1d(is_local%wrap%FBImp(compatm,compatm), 'Sa_ofrac', Sa_ofrac, rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
call fldbun_getdata1d(is_local%wrap%FBFrac(compatm), 'aofrac', aofrac, rc)
@@ -788,11 +785,8 @@ subroutine med_fraction_set(gcomp, rc)
call med_map_field(field_src, field_dst, is_local%wrap%RH(compice,compatm,:), maptype, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
end if
- ! Set 'aofrac' from FBImp(compatm) to FBfrac(compatm)
- if (trim(coupling_mode) == 'nems_orig' .or. &
- trim(coupling_mode) == 'nems_frac' .or. &
- trim(coupling_mode) == 'nems_frac_aoflux' .or. &
- trim(coupling_mode) == 'nems_frac_aoflux_sbs') then
+ ! Set 'aofrac' from FBImp(compatm) to FBfrac(compatm) if available
+ if ( fldbun_fldchk(is_local%wrap%FBImp(compatm,compatm), 'Sa_ofrac', rc=rc)) then
call fldbun_getdata1d(is_local%wrap%FBImp(compatm,compatm), 'Sa_ofrac', Sa_ofrac, rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
call fldbun_getdata1d(is_local%wrap%FBFrac(compatm), 'aofrac', aofrac, rc)
diff --git a/mediator/med_internalstate_mod.F90 b/mediator/med_internalstate_mod.F90
index c5497293f..66e2eb1db 100644
--- a/mediator/med_internalstate_mod.F90
+++ b/mediator/med_internalstate_mod.F90
@@ -262,7 +262,6 @@ subroutine med_internalstate_init(gcomp, rc)
end do
end if
is_local%wrap%num_icesheets = num_icesheets
-
call NUOPC_CompAttributeGet(gcomp, name='mediator_present', value=cvalue, isPresent=isPresent, isSet=isSet, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
if (isPresent .and. isSet) then
diff --git a/mediator/med_io_mod.F90 b/mediator/med_io_mod.F90
index 69d1891fb..265a5ddda 100644
--- a/mediator/med_io_mod.F90
+++ b/mediator/med_io_mod.F90
@@ -7,13 +7,13 @@ module med_io_mod
use med_kind_mod , only : CX=>SHR_KIND_CX, CS=>SHR_KIND_CS, CL=>SHR_KIND_CL, I8=>SHR_KIND_I8, R8=>SHR_KIND_R8
use med_kind_mod , only : R4=>SHR_KIND_R4
use med_constants_mod , only : fillvalue => SHR_CONST_SPVAL
- use ESMF , only : ESMF_VM, ESMF_LogWrite, ESMF_LOGMSG_INFO, ESMF_LogFoundError
+ use ESMF , only : ESMF_VM, ESMF_LogWrite, ESMF_LOGMSG_INFO, ESMF_LogFoundError, ESMF_LOGMSG_ERROR
use ESMF , only : ESMF_SUCCESS, ESMF_FAILURE, ESMF_END_ABORT, ESMF_LOGERR_PASSTHRU
use ESMF , only : ESMF_VMGetCurrent, ESMF_VMGet, ESMF_VMBroadCast, ESMF_Finalize
use NUOPC , only : NUOPC_FieldDictionaryGetEntry
use NUOPC , only : NUOPC_FieldDictionaryHasEntry
use pio , only : file_desc_t, iosystem_desc_t
- use med_internalstate_mod , only : logunit, med_id
+ use med_internalstate_mod , only : logunit, med_id, maintask
use med_constants_mod , only : dbug_flag => med_constants_dbug_flag
use med_methods_mod , only : FB_getFieldN => med_methods_FB_getFieldN
use med_methods_mod , only : FB_getFldPtr => med_methods_FB_getFldPtr
@@ -75,10 +75,7 @@ module med_io_mod
character(*),parameter :: prefix = "med_io_"
character(*),parameter :: modName = "(med_io_mod) "
character(*),parameter :: version = "cmeps0"
- integer , parameter :: number_strlen = 8
- integer , parameter :: file_desc_t_cnt = 20 ! Note - this is hard-wired for now
- character(CL) :: wfilename(0:file_desc_t_cnt) = ''
- type(file_desc_t) :: io_file(0:file_desc_t_cnt)
+
integer :: pio_iotype
integer :: pio_ioformat
type(iosystem_desc_t), pointer :: io_subsystem
@@ -198,7 +195,7 @@ subroutine med_io_init(gcomp, rc)
else if (trim(cvalue) .eq. '64BIT_DATA') then
pio_ioformat = PIO_64BIT_DATA
else
- call ESMF_LogWrite(trim(subname)//': need to provide valid option for pio_ioformat (CLASSIC|64BIT_OFFSET|64BIT_DATA)', ESMF_LOGMSG_INFO)
+ call ESMF_LogWrite(trim(subname)//': need to provide valid option for pio_ioformat (CLASSIC|64BIT_OFFSET|64BIT_DATA)', ESMF_LOGMSG_ERROR)
rc = ESMF_FAILURE
return
end if
@@ -223,7 +220,7 @@ subroutine med_io_init(gcomp, rc)
else if (trim(cvalue) .eq. 'NETCDF4P') then
pio_iotype = PIO_IOTYPE_NETCDF4P
else
- call ESMF_LogWrite(trim(subname)//': need to provide valid option for pio_typename (NETCDF|PNETCDF|NETCDF4C|NETCDF4P)', ESMF_LOGMSG_INFO)
+ call ESMF_LogWrite(trim(subname)//': need to provide valid option for pio_typename (NETCDF|PNETCDF|NETCDF4C|NETCDF4P)', ESMF_LOGMSG_ERROR)
rc = ESMF_FAILURE
return
end if
@@ -334,13 +331,13 @@ subroutine med_io_init(gcomp, rc)
else if (trim(cvalue) .eq. 'SUBSET') then
pio_rearranger = PIO_REARR_SUBSET
else
- call ESMF_LogWrite(trim(subname)//': need to provide valid option for pio_rearranger (BOX|SUBSET)', ESMF_LOGMSG_INFO)
+ call ESMF_LogWrite(trim(subname)//': need to provide valid option for pio_rearranger (BOX|SUBSET)', ESMF_LOGMSG_ERROR)
rc = ESMF_FAILURE
return
end if
else
- cvalue = 'BOX'
- pio_rearranger = PIO_REARR_BOX
+ cvalue = 'SUBSET'
+ pio_rearranger = PIO_REARR_SUBSET
end if
if (localPet == 0) write(logunit,*) trim(subname), ' : pio_rearranger = ', trim(cvalue), pio_rearranger
@@ -357,7 +354,7 @@ subroutine med_io_init(gcomp, rc)
if (isPresent .and. isSet) then
read(cvalue,*) pio_debug_level
if (pio_debug_level < 0 .or. pio_debug_level > 6) then
- call ESMF_LogWrite(trim(subname)//': need to provide valid option for pio_debug_level (0-6)', ESMF_LOGMSG_INFO)
+ call ESMF_LogWrite(trim(subname)//': need to provide valid option for pio_debug_level (0-6)', ESMF_LOGMSG_ERROR)
rc = ESMF_FAILURE
return
end if
@@ -381,7 +378,7 @@ subroutine med_io_init(gcomp, rc)
else if (trim(cvalue) .eq. 'COLL') then
pio_rearr_comm_type = PIO_REARR_COMM_COLL
else
- call ESMF_LogWrite(trim(subname)//': need to provide valid option for pio_rearr_comm_type (P2P|COLL)', ESMF_LOGMSG_INFO)
+ call ESMF_LogWrite(trim(subname)//': need to provide valid option for pio_rearr_comm_type (P2P|COLL)', ESMF_LOGMSG_ERROR)
rc = ESMF_FAILURE
return
end if
@@ -406,7 +403,7 @@ subroutine med_io_init(gcomp, rc)
else if (trim(cvalue) .eq. '2DDISABLE') then
pio_rearr_comm_fcd = PIO_REARR_COMM_FC_2D_DISABLE
else
- call ESMF_LogWrite(trim(subname)//': need to provide valid option for pio_rearr_comm_fcd (2DENABLE|IO2COMP|COMP2IO|2DDISABLE)', ESMF_LOGMSG_INFO)
+ call ESMF_LogWrite(trim(subname)//': need to provide valid option for pio_rearr_comm_fcd (2DENABLE|IO2COMP|COMP2IO|2DDISABLE)', ESMF_LOGMSG_ERROR)
rc = ESMF_FAILURE
return
end if
@@ -498,7 +495,7 @@ subroutine med_io_init(gcomp, rc)
end subroutine med_io_init
!===============================================================================
- subroutine med_io_wopen(filename, vm, clobber, file_ind, model_doi_url)
+ subroutine med_io_wopen(filename, io_file, vm, rc, clobber, file_ind, model_doi_url)
!---------------
! open netcdf file
@@ -511,17 +508,17 @@ subroutine med_io_wopen(filename, vm, clobber, file_ind, model_doi_url)
! input/output arguments
character(*), intent(in) :: filename
+ type(file_desc_t), intent(inout) :: io_file
type(ESMF_VM) :: vm
+ integer, intent(out) :: rc
logical, optional, intent(in) :: clobber
integer, optional, intent(in) :: file_ind
character(CL), optional, intent(in) :: model_doi_url
-
! local variables
logical :: lclobber
integer :: rcode
integer :: nmode
integer :: lfile_ind
- integer :: rc
integer :: iam
character(CL) :: lversion
character(CL) :: lmodel_doi_url
@@ -539,13 +536,11 @@ subroutine med_io_wopen(filename, vm, clobber, file_ind, model_doi_url)
lfile_ind = 0
if (present(file_ind)) lfile_ind=file_ind
- if (.not. pio_file_is_open(io_file(lfile_ind))) then
+ call ESMF_VMGet(vm, localPet=iam, rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
- call ESMF_VMGet(vm, localPet=iam, rc=rc)
- if (ChkErr(rc,__LINE__,u_FILE_u)) return
- ! filename not open
- wfilename(lfile_ind) = trim(filename)
+ if (.not. pio_file_is_open(io_file)) then
if (med_io_file_exists(vm, filename)) then
if (lclobber) then
@@ -554,20 +549,20 @@ subroutine med_io_wopen(filename, vm, clobber, file_ind, model_doi_url)
if(pio_iotype == PIO_IOTYPE_NETCDF .or. pio_iotype == PIO_IOTYPE_PNETCDF) then
nmode = ior(nmode,pio_ioformat)
endif
- rcode = pio_createfile(io_subsystem, io_file(lfile_ind), pio_iotype, trim(filename), nmode)
+ rcode = pio_createfile(io_subsystem, io_file, pio_iotype, trim(filename), nmode)
if(iam==0) write(logunit,'(a)') trim(subname)//' creating file '//trim(filename)
- rcode = pio_put_att(io_file(lfile_ind),pio_global,"file_version",version)
- rcode = pio_put_att(io_file(lfile_ind),pio_global,"model_doi_url",lmodel_doi_url)
+ rcode = pio_put_att(io_file,pio_global,"file_version",version)
+ rcode = pio_put_att(io_file,pio_global,"model_doi_url",lmodel_doi_url)
else
- rcode = pio_openfile(io_subsystem, io_file(lfile_ind), pio_iotype, trim(filename), pio_write)
+ rcode = pio_openfile(io_subsystem, io_file, pio_iotype, trim(filename), pio_write)
if (iam==0) write(logunit,'(a)') trim(subname)//' opening file '//trim(filename)
- call pio_seterrorhandling(io_file(lfile_ind),PIO_BCAST_ERROR)
- rcode = pio_get_att(io_file(lfile_ind),pio_global,"file_version",lversion)
- call pio_seterrorhandling(io_file(lfile_ind),PIO_INTERNAL_ERROR)
+ call pio_seterrorhandling(io_file,PIO_BCAST_ERROR)
+ rcode = pio_get_att(io_file,pio_global,"file_version",lversion)
+ call pio_seterrorhandling(io_file,PIO_INTERNAL_ERROR)
if (trim(lversion) /= trim(version)) then
- rcode = pio_redef(io_file(lfile_ind))
- rcode = pio_put_att(io_file(lfile_ind),pio_global,"file_version",version)
- rcode = pio_enddef(io_file(lfile_ind))
+ rcode = pio_redef(io_file)
+ rcode = pio_put_att(io_file,pio_global,"file_version",version)
+ rcode = pio_enddef(io_file)
endif
endif
else
@@ -577,22 +572,12 @@ subroutine med_io_wopen(filename, vm, clobber, file_ind, model_doi_url)
nmode = ior(nmode,pio_ioformat)
endif
- rcode = pio_createfile(io_subsystem, io_file(lfile_ind), pio_iotype, trim(filename), nmode)
+ rcode = pio_createfile(io_subsystem, io_file, pio_iotype, trim(filename), nmode)
if (iam==0) write(logunit,'(a)') trim(subname) //' creating file '// trim(filename)
- rcode = pio_put_att(io_file(lfile_ind),pio_global,"file_version",version)
- rcode = pio_put_att(io_file(lfile_ind),pio_global,"model_doi_url",lmodel_doi_url)
+ rcode = pio_put_att(io_file,pio_global,"file_version",version)
+ rcode = pio_put_att(io_file,pio_global,"model_doi_url",lmodel_doi_url)
endif
- elseif (trim(wfilename(lfile_ind)) /= trim(filename)) then
- ! filename is open, better match open filename
- if (iam==0) then
- write(logunit,'(a)') trim(subname)//' different filename currently open '//trim(filename)
- write(logunit,'(a)') trim(subname)//' different wfilename currently open '//trim(wfilename(lfile_ind))
- end if
- call ESMF_LogWrite(trim(subname)//'different file currently open '//trim(filename), ESMF_LOGMSG_INFO)
- rc = ESMF_FAILURE
- return
-
else
! filename is already open, just return
endif
@@ -600,7 +585,7 @@ subroutine med_io_wopen(filename, vm, clobber, file_ind, model_doi_url)
end subroutine med_io_wopen
!===============================================================================
- subroutine med_io_close(filename, vm, file_ind, rc)
+ subroutine med_io_close(io_file, rc)
!---------------
! close netcdf file
@@ -609,85 +594,51 @@ subroutine med_io_close(filename, vm, file_ind, rc)
use pio, only: pio_file_is_open, pio_closefile
! input/output variables
- character(*) , intent(in) :: filename
- type(ESMF_VM) , intent(in) :: vm
- integer,optional , intent(in) :: file_ind
+ type(file_desc_t) :: io_file
integer , intent(out) :: rc
! local variables
- integer :: lfile_ind
- integer :: iam
+
character(*),parameter :: subName = '(med_io_close) '
!-------------------------------------------------------------------------------
rc = ESMF_SUCCESS
- lfile_ind = 0
- if (present(file_ind)) lfile_ind=file_ind
-
- if (.not. pio_file_is_open(io_file(lfile_ind))) then
- ! filename not open, just return
- elseif (trim(wfilename(lfile_ind)) == trim(filename)) then
- ! filename matches, close it
- call pio_closefile(io_file(lfile_ind))
- !wfilename(lfile_ind) = ''
- else
- call ESMF_VMGet(vm, localPet=iam, rc=rc)
- if (ChkErr(rc,__LINE__,u_FILE_u)) return
-
- ! different filename is open, abort
- if (iam==0) then
- write(logunit,*) subname,' different wfilename and filename currently open, aborting '
- write(logunit,'(a)') 'filename = ',trim(filename)
- write(logunit,'(a)') 'wfilename = ',trim(wfilename(lfile_ind))
- write(logunit,'(i6)')'lfile_ind = ',lfile_ind
- end if
- call ESMF_LogWrite(subname//'different file currently open, aborting '//trim(filename), ESMF_LOGMSG_INFO)
- rc = ESMF_FAILURE
- if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, line=__LINE__, file=u_FILE_u)) then
- call ESMF_Finalize(endflag=ESMF_END_ABORT)
- end if
+ if (pio_file_is_open(io_file)) then
+ call pio_closefile(io_file)
endif
end subroutine med_io_close
!===============================================================================
- subroutine med_io_redef(filename,file_ind)
+ subroutine med_io_redef(io_file)
use pio, only : pio_redef
! input/output variables
- character(len=*), intent(in) :: filename
- integer,optional,intent(in):: file_ind
-
+ type(file_desc_t) :: io_file
! local variables
- integer :: lfile_ind
integer :: rcode
!-------------------------------------------------------------------------------
- lfile_ind = 0
- if (present(file_ind)) lfile_ind=file_ind
- rcode = pio_redef(io_file(lfile_ind))
+ rcode = pio_redef(io_file)
end subroutine med_io_redef
!===============================================================================
- subroutine med_io_enddef(filename,file_ind)
+ subroutine med_io_enddef(io_file)
use pio, only : pio_enddef
! input/output variables
- character(len=*) , intent(in) :: filename
- integer,optional , intent(in) :: file_ind
+ type(file_desc_t) :: io_file
! local variables
- integer :: lfile_ind
+
integer :: rcode
!-------------------------------------------------------------------------------
- lfile_ind = 0
- if (present(file_ind)) lfile_ind=file_ind
- rcode = pio_enddef(io_file(lfile_ind))
+ rcode = pio_enddef(io_file)
end subroutine med_io_enddef
@@ -746,8 +697,8 @@ character(len=8) function med_io_sec2hms (seconds, rc)
end function med_io_sec2hms
!===============================================================================
- subroutine med_io_write_FB(filename, FB, whead, wdata, nx, ny, nt, &
- fillval, pre, flds, tavg, use_float, file_ind, tilesize, rc)
+ subroutine med_io_write_FB(io_file, FB, whead, wdata, nx, ny, nt, &
+ fillval, pre, flds, tavg, use_float, tilesize, rc)
!---------------
! Write FB to netcdf file
@@ -765,7 +716,7 @@ subroutine med_io_write_FB(filename, FB, whead, wdata, nx, ny, nt, &
use pio , only : pio_syncfile
! input/output variables
- character(len=*) , intent(in) :: filename ! file
+ type(file_desc_t) :: io_file
type(ESMF_FieldBundle) , intent(in) :: FB ! data to be written
logical , intent(in) :: whead ! write header
logical , intent(in) :: wdata ! write data
@@ -777,7 +728,6 @@ subroutine med_io_write_FB(filename, FB, whead, wdata, nx, ny, nt, &
character(len=*), optional , intent(in) :: flds(:) ! specific fields to write out
logical, optional , intent(in) :: tavg ! is this a tavg
logical, optional , intent(in) :: use_float ! write output as float rather than double
- integer, optional , intent(in) :: file_ind
integer, optional , intent(in) :: tilesize ! if non-zero, write atm component on tiles
integer , intent(out):: rc
@@ -811,7 +761,6 @@ subroutine med_io_write_FB(filename, FB, whead, wdata, nx, ny, nt, &
integer, pointer :: maxIndexPTile(:,:)
integer :: dimCount, tileCount
integer, pointer :: Dof(:)
- integer :: lfile_ind
real(r8), pointer :: fldptr1(:)
real(r8), pointer :: fldptr2(:,:)
real(r8), allocatable :: ownedElemCoords(:), ownedElemCoords_x(:), ownedElemCoords_y(:)
@@ -835,8 +784,7 @@ subroutine med_io_write_FB(filename, FB, whead, wdata, nx, ny, nt, &
if (present(pre)) lpre = trim(pre)
luse_float = .false.
if (present(use_float)) luse_float = use_float
- lfile_ind = 0
- if (present(file_ind)) lfile_ind=file_ind
+
atmtiles = .false.
if (present(tilesize)) then
if (tilesize > 0) atmtiles = .true.
@@ -848,7 +796,6 @@ subroutine med_io_write_FB(filename, FB, whead, wdata, nx, ny, nt, &
if (dbug_flag > 5) then
call ESMF_LogWrite(trim(subname)//": done", ESMF_LOGMSG_INFO)
endif
- rc = ESMF_Success
return
endif
@@ -954,22 +901,22 @@ subroutine med_io_write_FB(filename, FB, whead, wdata, nx, ny, nt, &
! Write header
if (whead) then
if (atmtiles) then
- rcode = pio_def_dim(io_file(lfile_ind), trim(lpre)//'_nx', lnx, dimid3(1))
- rcode = pio_def_dim(io_file(lfile_ind), trim(lpre)//'_ny', lny, dimid3(2))
- rcode = pio_def_dim(io_file(lfile_ind), trim(lpre)//'_ntiles', ntiles, dimid3(3))
+ rcode = pio_def_dim(io_file, trim(lpre)//'_nx', lnx, dimid3(1))
+ rcode = pio_def_dim(io_file, trim(lpre)//'_ny', lny, dimid3(2))
+ rcode = pio_def_dim(io_file, trim(lpre)//'_ntiles', ntiles, dimid3(3))
if (present(nt)) then
dimid4(1:3) = dimid3
- rcode = pio_inq_dimid(io_file(lfile_ind), 'time', dimid4(4))
+ rcode = pio_inq_dimid(io_file, 'time', dimid4(4))
dimid => dimid4
else
dimid => dimid3
endif
else
- rcode = pio_def_dim(io_file(lfile_ind), trim(lpre)//'_nx', lnx, dimid2(1))
- rcode = pio_def_dim(io_file(lfile_ind), trim(lpre)//'_ny', lny, dimid2(2))
+ rcode = pio_def_dim(io_file, trim(lpre)//'_nx', lnx, dimid2(1))
+ rcode = pio_def_dim(io_file, trim(lpre)//'_ny', lny, dimid2(2))
if (present(nt)) then
dimid3(1:2) = dimid2
- rcode = pio_inq_dimid(io_file(lfile_ind), 'time', dimid3(3))
+ rcode = pio_inq_dimid(io_file, 'time', dimid3(3))
dimid => dimid3
else
dimid => dimid2
@@ -1008,21 +955,21 @@ subroutine med_io_write_FB(filename, FB, whead, wdata, nx, ny, nt, &
name1 = trim(lpre)//'_'//trim(itemc)//trim(cnumber)
call ESMF_LogWrite(trim(subname)//': defining '//trim(name1), ESMF_LOGMSG_INFO)
if (luse_float) then
- rcode = pio_def_var(io_file(lfile_ind), trim(name1), PIO_REAL, dimid, varid)
- rcode = pio_put_att(io_file(lfile_ind), varid,"_FillValue",real(lfillvalue,r4))
+ rcode = pio_def_var(io_file, trim(name1), PIO_REAL, dimid, varid)
+ rcode = pio_put_att(io_file, varid,"_FillValue",real(lfillvalue,r4))
else
- rcode = pio_def_var(io_file(lfile_ind), trim(name1), PIO_DOUBLE, dimid, varid)
- rcode = pio_put_att(io_file(lfile_ind),varid,"_FillValue",lfillvalue)
+ rcode = pio_def_var(io_file, trim(name1), PIO_DOUBLE, dimid, varid)
+ rcode = pio_put_att(io_file,varid,"_FillValue",lfillvalue)
end if
if (NUOPC_FieldDictionaryHasEntry(trim(itemc))) then
call NUOPC_FieldDictionaryGetEntry(itemc, canonicalUnits=cunit, rc=rc)
if (chkerr(rc,__LINE__,u_FILE_u)) return
- rcode = pio_put_att(io_file(lfile_ind), varid, "units" , trim(cunit))
+ rcode = pio_put_att(io_file, varid, "units" , trim(cunit))
end if
- rcode = pio_put_att(io_file(lfile_ind), varid, "standard_name", trim(name1))
+ rcode = pio_put_att(io_file, varid, "standard_name", trim(name1))
if (present(tavg)) then
if (tavg) then
- rcode = pio_put_att(io_file(lfile_ind), varid, "cell_methods", "time: mean")
+ rcode = pio_put_att(io_file, varid, "cell_methods", "time: mean")
endif
endif
end if
@@ -1031,21 +978,21 @@ subroutine med_io_write_FB(filename, FB, whead, wdata, nx, ny, nt, &
name1 = trim(lpre)//'_'//trim(itemc)
call ESMF_LogWrite(trim(subname)//':'//trim(itemc)//':'//trim(name1),ESMF_LOGMSG_INFO)
if (luse_float) then
- rcode = pio_def_var(io_file(lfile_ind), trim(name1), PIO_REAL, dimid, varid)
- rcode = pio_put_att(io_file(lfile_ind), varid, "_FillValue", real(lfillvalue, r4))
+ rcode = pio_def_var(io_file, trim(name1), PIO_REAL, dimid, varid)
+ rcode = pio_put_att(io_file, varid, "_FillValue", real(lfillvalue, r4))
else
- rcode = pio_def_var(io_file(lfile_ind), trim(name1), PIO_DOUBLE, dimid, varid)
- rcode = pio_put_att(io_file(lfile_ind), varid, "_FillValue", lfillvalue)
+ rcode = pio_def_var(io_file, trim(name1), PIO_DOUBLE, dimid, varid)
+ rcode = pio_put_att(io_file, varid, "_FillValue", lfillvalue)
end if
if (NUOPC_FieldDictionaryHasEntry(trim(itemc))) then
call NUOPC_FieldDictionaryGetEntry(itemc, canonicalUnits=cunit, rc=rc)
if (chkerr(rc,__LINE__,u_FILE_u)) return
- rcode = pio_put_att(io_file(lfile_ind), varid, "units", trim(cunit))
+ rcode = pio_put_att(io_file, varid, "units", trim(cunit))
end if
- rcode = pio_put_att(io_file(lfile_ind), varid, "standard_name", trim(name1))
+ rcode = pio_put_att(io_file, varid, "standard_name", trim(name1))
if (present(tavg)) then
if (tavg) then
- rcode = pio_put_att(io_file(lfile_ind), varid, "cell_methods", "time: mean")
+ rcode = pio_put_att(io_file, varid, "cell_methods", "time: mean")
endif
end if
end if
@@ -1055,13 +1002,13 @@ subroutine med_io_write_FB(filename, FB, whead, wdata, nx, ny, nt, &
! Add coordinate information to file
do n = 1,ndims
if (luse_float) then
- rcode = pio_def_var(io_file(lfile_ind), trim(coordvarnames(n)), PIO_REAL, dimid, varid)
+ rcode = pio_def_var(io_file, trim(coordvarnames(n)), PIO_REAL, dimid, varid)
else
- rcode = pio_def_var(io_file(lfile_ind), trim(coordvarnames(n)), PIO_DOUBLE, dimid, varid)
+ rcode = pio_def_var(io_file, trim(coordvarnames(n)), PIO_DOUBLE, dimid, varid)
end if
- rcode = pio_put_att(io_file(lfile_ind), varid, "long_name", trim(coordnames(n)))
- rcode = pio_put_att(io_file(lfile_ind), varid, "units", trim(coordunits(n)))
- rcode = pio_put_att(io_file(lfile_ind), varid, "standard_name", trim(coordnames(n)))
+ rcode = pio_put_att(io_file, varid, "long_name", trim(coordnames(n)))
+ rcode = pio_put_att(io_file, varid, "units", trim(coordunits(n)))
+ rcode = pio_put_att(io_file, varid, "standard_name", trim(coordnames(n)))
end do
end if
@@ -1107,40 +1054,39 @@ subroutine med_io_write_FB(filename, FB, whead, wdata, nx, ny, nt, &
do n = 1,ungriddedUBound(1)
write(cnumber,'(i0)') n
name1 = trim(lpre)//'_'//trim(itemc)//trim(cnumber)
- rcode = pio_inq_varid(io_file(lfile_ind), trim(name1), varid)
- call pio_setframe(io_file(lfile_ind),varid,frame)
+ rcode = pio_inq_varid(io_file, trim(name1), varid)
+ call pio_setframe(io_file,varid,frame)
if (gridToFieldMap(1) == 1) then
- call pio_write_darray(io_file(lfile_ind), varid, iodesc, fldptr2(:,n), rcode, fillval=lfillvalue)
+ call pio_write_darray(io_file, varid, iodesc, fldptr2(:,n), rcode, fillval=lfillvalue)
else if (gridToFieldMap(1) == 2) then
- call pio_write_darray(io_file(lfile_ind), varid, iodesc, fldptr2(n,:), rcode, fillval=lfillvalue)
+ call pio_write_darray(io_file, varid, iodesc, fldptr2(n,:), rcode, fillval=lfillvalue)
end if
end do
else if (rank == 1 .or. rank == 0) then
name1 = trim(lpre)//'_'//trim(itemc)
- rcode = pio_inq_varid(io_file(lfile_ind), trim(name1), varid)
- call pio_setframe(io_file(lfile_ind),varid,frame)
+ rcode = pio_inq_varid(io_file, trim(name1), varid)
+ call pio_setframe(io_file,varid,frame)
! fix for writing data on exchange grid, which has no data in some PETs
if (rank == 0) nullify(fldptr1)
- call pio_write_darray(io_file(lfile_ind), varid, iodesc, fldptr1, rcode, fillval=lfillvalue)
+ call pio_write_darray(io_file, varid, iodesc, fldptr1, rcode, fillval=lfillvalue)
end if ! end if rank is 2 or 1 or 0
end if ! end if not "hgt"
end do ! end loop over fields in FB
! Fill coordinate variables - why is this being done each time?
- rcode = pio_inq_varid(io_file(lfile_ind), trim(coordvarnames(1)), varid)
- call pio_setframe(io_file(lfile_ind),varid,frame)
- call pio_write_darray(io_file(lfile_ind), varid, iodesc, ownedElemCoords_x, rcode, fillval=lfillvalue)
+ rcode = pio_inq_varid(io_file, trim(coordvarnames(1)), varid)
+ call pio_setframe(io_file,varid,frame)
+ call pio_write_darray(io_file, varid, iodesc, ownedElemCoords_x, rcode, fillval=lfillvalue)
- rcode = pio_inq_varid(io_file(lfile_ind), trim(coordvarnames(2)), varid)
- call pio_setframe(io_file(lfile_ind),varid,frame)
- call pio_write_darray(io_file(lfile_ind), varid, iodesc, ownedElemCoords_y, rcode, fillval=lfillvalue)
+ rcode = pio_inq_varid(io_file, trim(coordvarnames(2)), varid)
+ call pio_setframe(io_file,varid,frame)
+ call pio_write_darray(io_file, varid, iodesc, ownedElemCoords_y, rcode, fillval=lfillvalue)
- call pio_syncfile(io_file(lfile_ind))
- call pio_freedecomp(io_file(lfile_ind), iodesc)
+ call pio_syncfile(io_file)
+ call pio_freedecomp(io_file, iodesc)
endif
- deallocate(fieldNameList)
deallocate(ownedElemCoords, ownedElemCoords_x, ownedElemCoords_y)
if (dbug_flag > 5) then
@@ -1150,7 +1096,7 @@ subroutine med_io_write_FB(filename, FB, whead, wdata, nx, ny, nt, &
end subroutine med_io_write_FB
!===============================================================================
- subroutine med_io_write_int(filename, idata, dname, whead, wdata, file_ind, rc)
+ subroutine med_io_write_int(io_file, idata, dname, whead, wdata, rc)
use pio, only : var_desc_t, pio_def_var, pio_put_att, pio_int, pio_inq_varid, pio_put_var
@@ -1159,45 +1105,40 @@ subroutine med_io_write_int(filename, idata, dname, whead, wdata, file_ind, rc)
!---------------
! intput/output variables
- character(len=*) ,intent(in) :: filename ! file
+ type(file_desc_t) :: io_file
integer ,intent(in) :: idata ! data to be written
character(len=*) ,intent(in) :: dname ! name of data
logical ,intent(in) :: whead ! write header
logical ,intent(in) :: wdata ! write data
- integer,optional ,intent(in) :: file_ind
integer ,intent(out):: rc
! local variables
integer :: rcode
type(var_desc_t) :: varid
character(CL) :: cunit ! var units
- integer :: lfile_ind
character(*),parameter :: subName = '(med_io_write_int) '
!-------------------------------------------------------------------------------
rc = ESMF_SUCCESS
- lfile_ind = 0
- if (present(file_ind)) lfile_ind=file_ind
-
if (whead) then
if (NUOPC_FieldDictionaryHasEntry(trim(dname))) then
call NUOPC_FieldDictionaryGetEntry(dname, canonicalUnits=cunit, rc=rc)
if (chkerr(rc,__LINE__,u_FILE_u)) return
- rcode = pio_put_att(io_file(lfile_ind),varid,"units",trim(cunit))
+ rcode = pio_put_att(io_file,varid,"units",trim(cunit))
end if
- rcode = pio_def_var(io_file(lfile_ind),trim(dname),PIO_INT,varid)
- rcode = pio_put_att(io_file(lfile_ind),varid,"standard_name",trim(dname))
+ rcode = pio_def_var(io_file,trim(dname),PIO_INT,varid)
+ rcode = pio_put_att(io_file,varid,"standard_name",trim(dname))
endif
if (wdata) then
- rcode = pio_inq_varid(io_file(lfile_ind),trim(dname),varid)
- rcode = pio_put_var(io_file(lfile_ind),varid,idata)
+ rcode = pio_inq_varid(io_file,trim(dname),varid)
+ rcode = pio_put_var(io_file,varid,idata)
endif
end subroutine med_io_write_int
!===============================================================================
- subroutine med_io_write_int1d(filename, idata, dname, whead, wdata, file_ind, rc)
+ subroutine med_io_write_int1d(io_file, idata, dname, whead, wdata, file_ind, rc)
!---------------
! Write 1d integer array to netcdf file
@@ -1208,7 +1149,7 @@ subroutine med_io_write_int1d(filename, idata, dname, whead, wdata, file_ind, rc
use pio , only : pio_int, pio_def_var
! input/output arguments
- character(len=*) ,intent(in) :: filename ! file
+ type(file_desc_t) :: io_file
integer ,intent(in) :: idata(:) ! data to be written
character(len=*) ,intent(in) :: dname ! name of data
logical ,intent(in) :: whead ! write header
@@ -1235,21 +1176,21 @@ subroutine med_io_write_int1d(filename, idata, dname, whead, wdata, file_ind, rc
if (NUOPC_FieldDictionaryHasEntry(trim(dname))) then
call NUOPC_FieldDictionaryGetEntry(dname, canonicalUnits=cunit, rc=rc)
if (chkerr(rc,__LINE__,u_FILE_u)) return
- rcode = pio_put_att(io_file(lfile_ind),varid,"units",trim(cunit))
+ rcode = pio_put_att(io_file,varid,"units",trim(cunit))
end if
lnx = size(idata)
- rcode = pio_def_dim(io_file(lfile_ind),trim(dname),lnx,dimid(1))
- rcode = pio_def_var(io_file(lfile_ind),trim(dname),PIO_INT,dimid,varid)
- rcode = pio_put_att(io_file(lfile_ind),varid,"standard_name",trim(dname))
+ rcode = pio_def_dim(io_file,trim(dname),lnx,dimid(1))
+ rcode = pio_def_var(io_file,trim(dname),PIO_INT,dimid,varid)
+ rcode = pio_put_att(io_file,varid,"standard_name",trim(dname))
else if (wdata) then
- rcode = pio_inq_varid(io_file(lfile_ind),trim(dname),varid)
- rcode = pio_put_var(io_file(lfile_ind),varid,idata)
+ rcode = pio_inq_varid(io_file,trim(dname),varid)
+ rcode = pio_put_var(io_file,varid,idata)
endif
end subroutine med_io_write_int1d
!===============================================================================
- subroutine med_io_write_r8(filename, rdata, dname, whead, wdata, file_ind, rc)
+ subroutine med_io_write_r8(io_file, rdata, dname, whead, wdata, rc)
!---------------
! Write scalar double to netcdf file
@@ -1259,48 +1200,41 @@ subroutine med_io_write_r8(filename, rdata, dname, whead, wdata, file_ind, rc)
use pio , only : pio_double, pio_noerr, pio_inq_varid, pio_put_var
! input/output arguments
- character(len=*) ,intent(in) :: filename ! file
+ type(file_desc_T) :: io_file
real(r8) ,intent(in) :: rdata ! data to be written
character(len=*) ,intent(in) :: dname ! name of data
logical ,intent(in) :: whead ! write header
logical ,intent(in) :: wdata ! write data
- integer,optional ,intent(in) :: file_ind
integer ,intent(out):: rc
! local variables
integer :: rcode
type(var_desc_t) :: varid
character(CL) :: cunit ! var units
- integer :: lfile_ind
character(*),parameter :: subName = '(med_io_write_r8) '
!-------------------------------------------------------------------------------
rc = ESMF_SUCCESS
- if(present(file_ind)) then
- lfile_ind = file_ind
- else
- lfile_ind = 1
- endif
if (whead) then
- rcode = pio_def_var(io_file(lfile_ind),trim(dname),PIO_DOUBLE,varid)
+ rcode = pio_def_var(io_file,trim(dname),PIO_DOUBLE,varid)
if (rcode==PIO_NOERR) then
if (NUOPC_FieldDictionaryHasEntry(trim(dname))) then
call NUOPC_FieldDictionaryGetEntry(dname, canonicalUnits=cunit, rc=rc)
if (chkerr(rc,__LINE__,u_FILE_u)) return
- rcode = pio_put_att(io_file(lfile_ind),varid,"units",trim(cunit))
+ rcode = pio_put_att(io_file,varid,"units",trim(cunit))
end if
- rcode = pio_put_att(io_file(lfile_ind),varid,"standard_name",trim(dname))
+ rcode = pio_put_att(io_file,varid,"standard_name",trim(dname))
end if
else if (wdata) then
- rcode = pio_inq_varid(io_file(lfile_ind),trim(dname),varid)
- rcode = pio_put_var(io_file(lfile_ind),varid,rdata)
+ rcode = pio_inq_varid(io_file,trim(dname),varid)
+ rcode = pio_put_var(io_file,varid,rdata)
endif
end subroutine med_io_write_r8
!===============================================================================
- subroutine med_io_write_r81d(filename, rdata, dname, whead, wdata, file_ind, rc)
+ subroutine med_io_write_r81d(io_file, rdata, dname, whead, wdata, rc)
!---------------
! Write 1d double array to netcdf file
@@ -1310,12 +1244,11 @@ subroutine med_io_write_r81d(filename, rdata, dname, whead, wdata, file_ind, rc)
use pio , only : pio_inq_varid, pio_put_var, pio_double, pio_put_att
! !INPUT/OUTPUT PARAMETERS:
- character(len=*) ,intent(in) :: filename ! file
+ type(file_desc_t) :: io_file
real(r8) ,intent(in) :: rdata(:) ! data to be written
character(len=*) ,intent(in) :: dname ! name of data
logical ,intent(in) :: whead ! write header
logical ,intent(in) :: wdata ! write data
- integer,optional ,intent(in) :: file_ind
integer ,intent(out):: rc
! local variables
@@ -1324,38 +1257,32 @@ subroutine med_io_write_r81d(filename, rdata, dname, whead, wdata, file_ind, rc)
type(var_desc_t) :: varid
character(CL) :: cunit ! var units
integer :: lnx
- integer :: lfile_ind
character(*),parameter :: subName = '(med_io_write_r81d) '
!-------------------------------------------------------------------------------
rc = ESMF_SUCCESS
- if(present(file_ind)) then
- lfile_ind = file_ind
- else
- lfile_ind = 1
- endif
if (whead) then
lnx = size(rdata)
- rcode = pio_def_dim(io_file(lfile_ind),trim(dname)//'_nx',lnx,dimid(1))
- rcode = pio_def_var(io_file(lfile_ind),trim(dname),PIO_DOUBLE,dimid,varid)
+ rcode = pio_def_dim(io_file,trim(dname)//'_nx',lnx,dimid(1))
+ rcode = pio_def_var(io_file,trim(dname),PIO_DOUBLE,dimid,varid)
if (NUOPC_FieldDictionaryHasEntry(trim(dname))) then
call NUOPC_FieldDictionaryGetEntry(dname, canonicalUnits=cunit, rc=rc)
if (chkerr(rc,__LINE__,u_FILE_u)) return
- rcode = pio_put_att(io_file(lfile_ind),varid,"units",trim(cunit))
+ rcode = pio_put_att(io_file,varid,"units",trim(cunit))
end if
- rcode = pio_put_att(io_file(lfile_ind),varid,"standard_name",trim(dname))
+ rcode = pio_put_att(io_file,varid,"standard_name",trim(dname))
endif
if (wdata) then
- rcode = pio_inq_varid(io_file(lfile_ind),trim(dname),varid)
- rcode = pio_put_var(io_file(lfile_ind),varid,rdata)
+ rcode = pio_inq_varid(io_file,trim(dname),varid)
+ rcode = pio_put_var(io_file,varid,rdata)
endif
end subroutine med_io_write_r81d
!===============================================================================
- subroutine med_io_write_char(filename, rdata, dname, whead, wdata, file_ind, rc)
+ subroutine med_io_write_char(io_file, rdata, dname, whead, wdata, rc)
!---------------
! Write char string to netcdf file
@@ -1365,12 +1292,11 @@ subroutine med_io_write_char(filename, rdata, dname, whead, wdata, file_ind, rc)
use pio , only : pio_char, pio_put_var
! input/output arguments
- character(len=*) ,intent(in) :: filename ! file
+ type(file_desc_t) :: io_file
character(len=*) ,intent(in) :: rdata ! data to be written
character(len=*) ,intent(in) :: dname ! name of data
logical ,intent(in) :: whead ! write header
logical ,intent(in) :: wdata ! write data
- integer,optional ,intent(in) :: file_ind
integer ,intent(out):: rc
! local variables
@@ -1379,37 +1305,32 @@ subroutine med_io_write_char(filename, rdata, dname, whead, wdata, file_ind, rc)
type(var_desc_t) :: varid
character(CL) :: cunit ! var units
integer :: lnx
- integer :: lfile_ind
character(CL) :: charvar ! buffer for string read/write
character(*),parameter :: subName = '(med_io_write_char) '
!-------------------------------------------------------------------------------
rc = ESMF_SUCCESS
- if(present(file_ind)) then
- lfile_ind = file_ind
- else
- lfile_ind = 1
- endif
+
if (whead) then
lnx = len(charvar)
- rcode = pio_def_dim(io_file(lfile_ind),trim(dname)//'_len',lnx,dimid(1))
- rcode = pio_def_var(io_file(lfile_ind),trim(dname),PIO_CHAR,dimid,varid)
+ rcode = pio_def_dim(io_file,trim(dname)//'_len',lnx,dimid(1))
+ rcode = pio_def_var(io_file,trim(dname),PIO_CHAR,dimid,varid)
if (NUOPC_FieldDictionaryHasEntry(trim(dname))) then
call NUOPC_FieldDictionaryGetEntry(dname, canonicalUnits=cunit, rc=rc)
if (chkerr(rc,__LINE__,u_FILE_u)) return
end if
- rcode = pio_put_att(io_file(lfile_ind),varid,"standard_name",trim(dname))
+ rcode = pio_put_att(io_file,varid,"standard_name",trim(dname))
else if (wdata) then
charvar = ''
charvar = trim(rdata)
- rcode = pio_inq_varid(io_file(lfile_ind),trim(dname),varid)
- rcode = pio_put_var(io_file(lfile_ind),varid,charvar)
+ rcode = pio_inq_varid(io_file,trim(dname),varid)
+ rcode = pio_put_var(io_file,varid,charvar)
endif
end subroutine med_io_write_char
!===============================================================================
- subroutine med_io_define_time(time_units, calendar, file_ind, rc)
+ subroutine med_io_define_time(io_file, time_units, calendar, rc)
use ESMF, only : operator(==), operator(/=)
use ESMF, only : ESMF_Calendar, ESMF_CalendarIsCreated
@@ -1422,9 +1343,9 @@ subroutine med_io_define_time(time_units, calendar, file_ind, rc)
use pio , only : pio_inq_varid, pio_put_var
! input/output variables
+ type(file_desc_t) :: io_file
character(len=*) , intent(in) :: time_units ! units of time
type(ESMF_Calendar) , intent(in) :: calendar ! calendar
- integer, optional , intent(in) :: file_ind
integer , intent(out):: rc
! local variables
@@ -1432,16 +1353,12 @@ subroutine med_io_define_time(time_units, calendar, file_ind, rc)
integer :: dimid(1)
integer :: dimid2(2)
type(var_desc_t) :: varid
- integer :: lfile_ind
character(CL) :: calname ! calendar name
character(*),parameter :: subName = '(med_io_define_time) '
!-------------------------------------------------------------------------------
rc = ESMF_SUCCESS
- lfile_ind = 0
- if (present(file_ind)) lfile_ind=file_ind
-
if (.not. ESMF_CalendarIsCreated(calendar)) then
call ESMF_LogWrite(trim(subname)//' ERROR: calendar is not created ', &
ESMF_LOGMSG_ERROR, line=__LINE__, file=u_FILE_u)
@@ -1450,9 +1367,9 @@ subroutine med_io_define_time(time_units, calendar, file_ind, rc)
end if
! define time and add calendar attribute
- rcode = pio_def_dim(io_file(lfile_ind), 'time', PIO_UNLIMITED, dimid(1))
- rcode = pio_def_var(io_file(lfile_ind), 'time', PIO_DOUBLE, dimid, varid)
- rcode = pio_put_att(io_file(lfile_ind), varid, 'units', trim(time_units))
+ rcode = pio_def_dim(io_file, 'time', PIO_UNLIMITED, dimid(1))
+ rcode = pio_def_var(io_file, 'time', PIO_DOUBLE, dimid, varid)
+ rcode = pio_put_att(io_file, varid, 'units', trim(time_units))
if (calendar == ESMF_CALKIND_360DAY) then
calname = '360_day'
else if (calendar == ESMF_CALKIND_GREGORIAN) then
@@ -1468,18 +1385,18 @@ subroutine med_io_define_time(time_units, calendar, file_ind, rc)
else if (calendar == ESMF_CALKIND_NOLEAP) then
calname = 'noleap'
end if
- rcode = pio_put_att(io_file(lfile_ind), varid, 'calendar', trim(calname))
+ rcode = pio_put_att(io_file, varid, 'calendar', trim(calname))
! define time bounds
dimid2(2) = dimid(1)
- rcode = pio_def_dim(io_file(lfile_ind), 'ntb', 2, dimid2(1))
- rcode = pio_def_var(io_file(lfile_ind), 'time_bnds', PIO_DOUBLE, dimid2, varid)
- rcode = pio_put_att(io_file(lfile_ind), varid, 'bounds', 'time_bnds')
+ rcode = pio_def_dim(io_file, 'ntb', 2, dimid2(1))
+ rcode = pio_def_var(io_file, 'time_bnds', PIO_DOUBLE, dimid2, varid)
+ rcode = pio_put_att(io_file, varid, 'bounds', 'time_bnds')
end subroutine med_io_define_time
!===============================================================================
- subroutine med_io_write_time(time_val, tbnds, nt, file_ind, rc)
+ subroutine med_io_write_time(io_file, time_val, tbnds, nt, rc)
!---------------
! Write time variable to netcdf file
@@ -1488,15 +1405,14 @@ subroutine med_io_write_time(time_val, tbnds, nt, file_ind, rc)
use pio, only : pio_put_att, pio_inq_varid, pio_put_var
! input/output variables
+ type(file_desc_t) :: io_file
real(r8) , intent(in) :: time_val ! data to be written
real(r8) , intent(in) :: tbnds(2) ! time bounds
integer , intent(in) :: nt
- integer , optional, intent(in) :: file_ind
integer , intent(out):: rc
! local variables
integer :: rcode
- integer :: lfile_ind
integer :: varid
integer :: start(2),count(2)
character(*),parameter :: subName = '(med_io_write_time) '
@@ -1504,19 +1420,16 @@ subroutine med_io_write_time(time_val, tbnds, nt, file_ind, rc)
rc = ESMF_SUCCESS
- lfile_ind = 0
- if (present(file_ind)) lfile_ind=file_ind
-
! write time
count = 1; start = nt
- rcode = pio_inq_varid(io_file(lfile_ind), 'time', varid)
- rcode = pio_put_var(io_file(lfile_ind), varid, start(1:1), count(1:1), (/time_val/))
+ rcode = pio_inq_varid(io_file, 'time', varid)
+ rcode = pio_put_var(io_file, varid, start(1:1), count(1:1), (/time_val/))
! write time bounds
- rcode = pio_inq_varid(io_file(lfile_ind), 'time_bnds', varid)
+ rcode = pio_inq_varid(io_file, 'time_bnds', varid)
start(1) = 1; start(2) = nt
count(1) = 2; count(2) = 1
- rcode = pio_put_var(io_file(lfile_ind), varid, start(1:2), count(1:2), tbnds)
+ rcode = pio_put_var(io_file, varid, start(1:2), count(1:2), tbnds)
end subroutine med_io_write_time
@@ -1539,7 +1452,7 @@ subroutine med_io_read_FB(filename, vm, FB, pre, frame, rc)
use pio , only : pio_read_darray, pio_offset_kind, pio_setframe
! input/output arguments
- character(len=*) ,intent(in) :: filename ! file
+ character(len=*) ,intent(in) :: filename
type(ESMF_VM) ,intent(in) :: vm
type(ESMF_FieldBundle) ,intent(in) :: FB ! data to be read
character(len=*) ,optional ,intent(in) :: pre ! prefix to variable name
@@ -1824,7 +1737,10 @@ subroutine med_io_read_init_iodesc(FB, name1, pioid, iodesc, rc)
deallocate(dof)
deallocate(minIndexPTile, maxIndexPTile)
-
+ else
+ if(maintask) write(logunit,'(a)') trim(subname)//' ERROR: '//trim(name1)//' is not present, aborting '
+ call ESMF_LogWrite(trim(subname)//' ERROR: '//trim(name1)//' is not present, aborting ', ESMF_LOGMSG_ERROR)
+ rc = ESMF_FAILURE
end if ! end if rcode check
end subroutine med_io_read_init_iodesc
diff --git a/mediator/med_map_mod.F90 b/mediator/med_map_mod.F90
index 089bfc321..51c4c6faa 100644
--- a/mediator/med_map_mod.F90
+++ b/mediator/med_map_mod.F90
@@ -111,7 +111,7 @@ subroutine med_map_RouteHandles_initfrom_esmflds(gcomp, flds_scalar_name, llogun
type(ESMF_Mesh) :: mesh_dst
type(med_fldlist_type), pointer :: FldListFr
type(med_fldlist_entry_type), pointer :: fldptr
- character(len=*), parameter :: subname=' (module_med_map: RouteHandles_init) '
+ character(len=*), parameter :: subname=' (med_map_mod: RouteHandles_init) '
!-----------------------------------------------------------
call t_startf('MED:'//subname)
@@ -259,7 +259,8 @@ subroutine med_map_RouteHandles_initfrom_esmflds(gcomp, flds_scalar_name, llogun
if (chkerr(rc,__LINE__,u_FILE_u)) return
if (maintask) then
write(logunit,'(a)') trim(subname)//' created field_NormOne for '&
- //compname(n1)//'->'//compname(n2)//' with mapping '//trim(mapnames(mapindex))
+ //trim(compname(n1))//'->'//trim(compname(n2))//' with mapping '&
+ //trim(mapnames(mapindex))
end if
end if
end do ! end of loop over map_indiex mappers
@@ -304,7 +305,7 @@ subroutine med_map_routehandles_initfrom_fieldbundle(n1, n2, FBsrc, FBdst, mapin
! local variables
type(ESMF_Field) :: fldsrc
type(ESMF_Field) :: flddst
- character(len=*), parameter :: subname=' (module_MED_map:med_map_routehandles_initfrom_fieldbundle) '
+ character(len=*), parameter :: subname=' (med_map_mod:med_map_routehandles_initfrom_fieldbundle) '
!---------------------------------------------
rc = ESMF_SUCCESS
@@ -657,7 +658,7 @@ logical function med_map_RH_is_created_RH3d(RHs,n1,n2,mapindex,rc)
integer , intent(out) :: rc
! local variables
- character(len=*), parameter :: subname=' (module_MED_map:med_map_RH_is_created_RH3d) '
+ character(len=*), parameter :: subname=' (med_map_mod:med_map_RH_is_created_RH3d) '
!-----------------------------------------------------------
rc = ESMF_SUCCESS
@@ -682,7 +683,7 @@ logical function med_map_RH_is_created_RH1d(RHs,mapindex,rc)
! local variables
integer :: rc1, rc2
logical :: mapexists
- character(len=*), parameter :: subname=' (module_MED_map:med_map_RH_is_created_RH1d) '
+ character(len=*), parameter :: subname=' (med_map_mod:med_map_RH_is_created_RH1d) '
!-----------------------------------------------------------
rc = ESMF_SUCCESS
@@ -754,7 +755,7 @@ subroutine med_map_packed_field_create(destcomp, flds_scalar_name, &
character(CL), allocatable :: fieldNameList(:)
character(CS) :: mapnorm_mapindex
character(len=CX) :: tmpstr
- character(len=*), parameter :: subname=' (module_MED_map:med_packed_field_create) '
+ character(len=*), parameter :: subname=' (med_map_mod:med_packed_field_create) '
!-----------------------------------------------------------
rc = ESMF_SUCCESS
@@ -822,6 +823,7 @@ subroutine med_map_packed_field_create(destcomp, flds_scalar_name, &
//' '//trim(fieldnamelist(nf))
call ESMF_LogWrite(trim(tmpstr), ESMF_LOGMSG_INFO)
else
+ !if(rof_name .ne. 'xrof' .and. compname(destcomp) .ne. 'ocn') then
if (mapnorm_mapindex /= packed_data(mapindex)%mapnorm) then
write(tmpstr,*)'Map type '//trim(mapnames(mapindex)) &
//', destcomp '//trim(compname(destcomp)) &
@@ -957,7 +959,7 @@ subroutine med_map_field_packed(FBSrc, FBDst, FBFracSrc, field_normOne, packed_d
type(ESMF_Field), pointer :: fieldlist_dst(:)
real(r8), pointer :: data_norm(:)
real(r8), pointer :: data_dst(:,:)
- character(len=*), parameter :: subname=' (module_MED_map:med_map_field_packed) '
+ character(len=*), parameter :: subname=' (med_map_mod:med_map_field_packed) '
!-----------------------------------------------------------
call t_startf('MED:'//subname)
@@ -1169,7 +1171,7 @@ subroutine med_map_field_normalized(field_src, field_dst, routehandles, maptype,
integer :: ungriddedUBound(1) ! currently the size must equal 1 for rank 2 fields
integer :: lsize_src
integer :: lsize_dst
- character(len=*), parameter :: subname=' (module_MED_map:med_map_field_normalized) '
+ character(len=*), parameter :: subname=' (med_map_mod:med_map_field_normalized) '
!-----------------------------------------------------------
rc = ESMF_SUCCESS
@@ -1282,7 +1284,7 @@ subroutine med_map_field(field_src, field_dst, routehandles, maptype, fldname, r
logical :: checkflag = .false.
character(len=CS) :: lfldname
real(ESMF_KIND_R8), parameter :: fillValue = 9.99e20_ESMF_KIND_R8
- character(len=*), parameter :: subname='(module_MED_map:med_map_field) '
+ character(len=*), parameter :: subname='(med_map_mod:med_map_field) '
!---------------------------------------------------
rc = ESMF_SUCCESS
@@ -1385,7 +1387,7 @@ subroutine med_map_uv_cart3d(FBsrc, FBdst, routehandles, mapindex, rc)
integer :: spatialDim
real(r8), parameter :: deg2rad = shr_const_pi/180.0_R8 ! deg to rads
logical :: first_time = .true.
- character(len=*), parameter :: subname=' (module_MED_map:med_map_uv_cart3d) '
+ character(len=*), parameter :: subname=' (med_map_mod:med_map_uv_cart3d) '
!-------------------------------------------------------------------------------
rc = ESMF_SUCCESS
diff --git a/mediator/med_methods_mod.F90 b/mediator/med_methods_mod.F90
index bd5b60793..649c9c511 100644
--- a/mediator/med_methods_mod.F90
+++ b/mediator/med_methods_mod.F90
@@ -24,8 +24,13 @@ module med_methods_mod
med_methods_FieldPtr_compare2
end interface
- ! used/reused in module
+ interface med_methods_check_for_nans
+ module procedure med_methods_check_for_nans_1d
+ module procedure med_methods_check_for_nans_2d
+ end interface med_methods_check_for_nans
+ ! used/reused in module
+ logical, public :: mediator_checkfornans ! set in med.F90 AdvertiseFields
logical :: isPresent
character(len=1024) :: msgString
type(ESMF_FieldStatus_Flag) :: status
@@ -49,6 +54,7 @@ module med_methods_mod
public med_methods_FB_getdata2d
public med_methods_FB_getdata1d
public med_methods_FB_getmesh
+ public med_methods_FB_check_for_nans
public med_methods_State_reset
public med_methods_State_diagnose
@@ -71,6 +77,8 @@ module med_methods_mod
#ifdef DIAGNOSE
private med_methods_Array_diagnose
#endif
+ private med_methods_check_for_nans
+
!-----------------------------------------------------------------------------
contains
!-----------------------------------------------------------------------------
@@ -1346,7 +1354,10 @@ subroutine med_methods_FB_accum(FBout, FBin, copy, rc)
call med_methods_Field_GetFldPtr(lfield, fldptr1=dataptro1, fldptr2=dataptro2, rank=lranko, rc=rc)
if (chkerr(rc,__LINE__,u_FILE_u)) return
- if (lranki == 1 .and. lranko == 1) then
+ if (lranki == 0 .and. lranko == 0) then
+ ! do nothing
+ call ESMF_LogWrite(trim(subname)//": Both ranki and ranko are 0", ESMF_LOGMSG_INFO)
+ elseif (lranki == 1 .and. lranko == 1) then
if (.not.med_methods_FieldPtr_Compare(dataPtro1, dataPtri1, subname, rc)) then
call ESMF_LogWrite(trim(subname)//": ERROR in dataPtr1 size ", ESMF_LOGMSG_ERROR)
@@ -1389,7 +1400,7 @@ subroutine med_methods_FB_accum(FBout, FBin, copy, rc)
else
write(msgString,'(a,2i8)') trim(subname)//": ranki, ranko = ",lranki,lranko
- call ESMF_LogWrite(trim(msgString), ESMF_LOGMSG_INFO)
+ call ESMF_LogWrite(trim(msgString), ESMF_LOGMSG_ERROR)
call ESMF_LogWrite(trim(subname)//": ERROR ranki ranko not supported "//trim(lfieldnamelist(n)), &
ESMF_LOGMSG_ERROR)
rc = ESMF_FAILURE
@@ -2497,4 +2508,101 @@ subroutine med_methods_FB_getmesh(FB, mesh, rc)
end subroutine med_methods_FB_getmesh
+ !-----------------------------------------------------------------------------
+ subroutine med_methods_FB_check_for_nans(FB, maintask, logunit, rc)
+ use ESMF, only : ESMF_FieldBundle, ESMF_Field, ESMF_FieldBundleGet, ESMF_FieldGet
+ ! input/output variables
+ type(ESMF_FieldBundle) , intent(in) :: FB
+ logical , intent(in) :: maintask
+ integer , intent(in) :: logunit
+ integer , intent(inout) :: rc
+
+ ! local variables
+ type(ESMF_Field) :: field
+ integer :: index
+ integer :: fieldcount
+ integer :: fieldrank
+ character(len=CL) :: fieldname
+ real(r8) , pointer :: dataptr1d(:)
+ real(r8) , pointer :: dataptr2d(:,:)
+ integer :: nancount
+ character(len=CS) :: nancount_char
+ character(len=CL) :: msg_error
+ logical :: nanfound
+ character(len=*), parameter :: subname='(med_methods_FB_check_for_nans)'
+ ! ----------------------------------------------
+ rc = ESMF_SUCCESS
+
+ if(.not. mediator_checkfornans) return
+
+ call ESMF_FieldBundleGet(FB, fieldCount=fieldCount, rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+
+ nanfound = .false.
+ do index=1,fieldCount
+ call med_methods_FB_getNameN(FB, index, fieldname, rc)
+ if (chkerr(rc,__LINE__,u_FILE_u)) return
+ call ESMF_FieldBundleGet(FB, fieldName=fieldname, field=field, rc=rc)
+ if (chkerr(rc,__LINE__,u_FILE_u)) return
+ call ESMF_FieldGet(field, rank=fieldrank, name=fieldname, rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+ if (fieldrank == 1) then
+ call ESMF_FieldGet(field, farrayPtr=dataptr1d, rc=rc)
+ if (chkerr(rc,__LINE__,u_FILE_u)) return
+ call med_methods_check_for_nans(dataptr1d, nancount)
+ else
+ call ESMF_FieldGet(field, farrayPtr=dataptr2d, rc=rc)
+ if (chkerr(rc,__LINE__,u_FILE_u)) return
+ call med_methods_check_for_nans(dataptr2d, nancount)
+ end if
+ if (nancount > 0) then
+ write(nancount_char, '(i0)') nancount
+ msg_error = "ERROR: " // trim(nancount_char) //" nans found in "//trim(fieldname)
+ call ESMF_LogWrite(trim(msg_error), ESMF_LOGMSG_ERROR, line=__LINE__, file=u_FILE_u)
+ nanfound = .true.
+ end if
+ end do
+ if (nanfound) then
+ call ESMF_LogWrite('ABORTING JOB', ESMF_LOGMSG_ERROR, line=__LINE__, file=u_FILE_u)
+ rc = ESMF_FAILURE
+ return
+ end if
+
+ end subroutine med_methods_FB_check_for_nans
+
+ !-----------------------------------------------------------------------------
+ subroutine med_methods_check_for_nans_1d(dataptr, nancount)
+ use shr_infnan_mod, only: shr_infnan_isnan
+ ! input/output variables
+ real(r8) , intent(in) :: dataptr(:)
+ integer , intent(out) :: nancount
+ ! local variables
+ integer :: n
+
+ nancount = 0
+ do n = 1,size(dataptr)
+ if (shr_infnan_isnan(dataptr(n))) then
+ nancount = nancount + 1
+ end if
+ end do
+ end subroutine med_methods_check_for_nans_1d
+
+ subroutine med_methods_check_for_nans_2d(dataptr, nancount)
+ use shr_infnan_mod, only: shr_infnan_isnan
+ ! input/output variables
+ real(r8) , intent(in) :: dataptr(:,:)
+ integer , intent(out) :: nancount
+ ! local variables
+ integer :: n,k
+
+ nancount = 0
+ do k = 1,size(dataptr, dim=1)
+ do n = 1,size(dataptr, dim=2)
+ if (shr_infnan_isnan(dataptr(k,n))) then
+ nancount = nancount + 1
+ end if
+ end do
+ end do
+ end subroutine med_methods_check_for_nans_2d
+
end module med_methods_mod
diff --git a/mediator/med_phases_aofluxes_mod.F90 b/mediator/med_phases_aofluxes_mod.F90
index 0b3d10901..48055e92e 100644
--- a/mediator/med_phases_aofluxes_mod.F90
+++ b/mediator/med_phases_aofluxes_mod.F90
@@ -27,7 +27,7 @@ module med_phases_aofluxes_mod
use ESMF , only : ESMF_XGridGet, ESMF_MeshCreate, ESMF_MeshWrite, ESMF_KIND_R8
use med_kind_mod , only : CX=>SHR_KIND_CX, CS=>SHR_KIND_CS, CL=>SHR_KIND_CL, R8=>SHR_KIND_R8
use med_internalstate_mod , only : InternalState, maintask, logunit
- use med_internalstate_mod , only : compatm, compocn, coupling_mode, aoflux_code, mapconsd, mapconsf, mapfcopy
+ use med_internalstate_mod , only : compatm, compocn, compwav, coupling_mode, aoflux_code, mapconsd, mapconsf, mapfcopy
use med_constants_mod , only : dbug_flag => med_constants_dbug_flag
use med_utils_mod , only : memcheck => med_memcheck
use med_utils_mod , only : chkerr => med_utils_chkerr
@@ -487,6 +487,7 @@ subroutine med_aofluxes_init_ogrid(gcomp, aoflux_in, aoflux_out, rc)
use esmFlds , only : med_fldlist_GetaofluxfldList
use esmFlds , only : med_fldList_type
use med_map_mod , only : med_map_packed_field_create
+ use med_methods_mod , only : FB_fldchk => med_methods_FB_FldChk
! Arguments
type(ESMF_GridComp) , intent(inout) :: gcomp
@@ -565,7 +566,6 @@ subroutine med_aofluxes_init_ogrid(gcomp, aoflux_in, aoflux_out, rc)
if (is_local%wrap%aoflux_grid == 'ogrid') then
if ( ESMF_FieldBundleIsCreated(is_local%wrap%FBMed_aoflux_o) .and. &
ESMF_FieldBundleIsCreated(is_local%wrap%FBMed_aoflux_a)) then
-
call med_map_packed_field_create(destcomp=compatm, &
flds_scalar_name=is_local%wrap%flds_scalar_name, &
fieldsSrc=fldListMed_aoflux, &
@@ -573,7 +573,6 @@ subroutine med_aofluxes_init_ogrid(gcomp, aoflux_in, aoflux_out, rc)
FBDst=is_local%wrap%FBMed_aoflux_a, &
packed_data=is_local%wrap%packed_data_aoflux_o2a(:), rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
-
end if
end if
@@ -768,6 +767,7 @@ subroutine med_aofluxes_init_xgrid(gcomp, aoflux_in, aoflux_out, rc)
type(ESMF_Mesh) :: xch_mesh
real(r8), pointer :: dataptr(:)
integer :: fieldcount
+ integer :: stp ! srcTermProcessing is declared inout and must have variable not constant
type(ESMF_CoordSys_Flag) :: coordSys
real(ESMF_KIND_R8) ,allocatable :: garea(:)
character(len=*),parameter :: subname=' (med_aofluxes_init_xgrid) '
@@ -870,11 +870,12 @@ subroutine med_aofluxes_init_xgrid(gcomp, aoflux_in, aoflux_out, rc)
regridmethod=ESMF_REGRIDMETHOD_CONSERVE_2ND, rc=rc)
if (chkerr(rc,__LINE__,u_FILE_u)) return
if (trim(coupling_mode) == 'cesm') then
+ stp = 1
call ESMF_FieldRegridStore(field_a, field_x, routehandle=rh_agrid2xgrid_bilinr, &
- regridmethod=ESMF_REGRIDMETHOD_BILINEAR, dstMaskValues=(/0/), rc=rc)
+ regridmethod=ESMF_REGRIDMETHOD_BILINEAR, dstMaskValues=(/0/), srcTermProcessing=stp, rc=rc)
if (chkerr(rc,__LINE__,u_FILE_u)) return
call ESMF_FieldRegridStore(field_a, field_x, routehandle=rh_agrid2xgrid_patch, &
- regridmethod=ESMF_REGRIDMETHOD_PATCH, dstMaskValues=(/0/), rc=rc)
+ regridmethod=ESMF_REGRIDMETHOD_PATCH, dstMaskValues=(/0/), srcTermProcessing=stp, rc=rc)
if (chkerr(rc,__LINE__,u_FILE_u)) return
end if
@@ -948,6 +949,9 @@ subroutine med_aofluxes_update(gcomp, aoflux_in, aoflux_out, rc)
use ESMF , only : ESMF_GridComp
use ESMF , only : ESMF_LogWrite, ESMF_LogMsg_Info, ESMF_SUCCESS
use med_map_mod , only : med_map_field_packed, med_map_rh_is_created
+ use med_map_mod , only : med_map_routehandles_init
+ use med_methods_mod, only : FB_fldchk => med_methods_FB_fldchk
+ use med_methods_mod, only : FB_diagnose => med_methods_FB_diagnose
#ifdef CESMCOUPLED
use shr_flux_mod , only : flux_atmocn
#else
@@ -970,6 +974,9 @@ subroutine med_aofluxes_update(gcomp, aoflux_in, aoflux_out, rc)
real(r8), parameter :: p0 = 100000.0_r8 ! reference pressure in Pa
real(r8), parameter :: rcp = 0.286_r8 ! gas constant of air / specific heat capacity at a constant pressure
real(r8), parameter :: rdair = 287.058_r8 ! dry air gas constant in J/K/kg
+ integer :: maptype
+ type(ESMF_Field) :: field_src
+ type(ESMF_Field) :: field_dst
character(*),parameter :: subName = '(med_aofluxes_update) '
!-----------------------------------------------------------------------
@@ -1115,6 +1122,35 @@ subroutine med_aofluxes_update(gcomp, aoflux_in, aoflux_out, rc)
end if
+ ! map taux and tauy from ocean to wave grid if stresses are needed on the wave grid
+ if ( FB_fldchk(is_local%wrap%FBExp(compwav), 'Fwxx_taux', rc=rc) .and. &
+ FB_fldchk(is_local%wrap%FBExp(compwav), 'Fwxx_tauy', rc=rc)) then
+ maptype = mapconsf
+ if (.not. med_map_RH_is_created(is_local%wrap%RH(compocn,compwav,:), maptype, rc=rc)) then
+ call med_map_routehandles_init( compocn, compwav, &
+ FBSrc=is_local%wrap%FBImp(compocn,compocn), &
+ FBDst=is_local%wrap%FBImp(compwav,compwav), &
+ mapindex=maptype, RouteHandle=is_local%wrap%RH, rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+ end if
+ call ESMF_FieldBundleGet(is_local%wrap%FBMed_aoflux_o, 'Faox_taux', field=field_src, rc=rc)
+ if (chkerr(rc,__LINE__,u_FILE_u)) return
+ call ESMF_FieldBundleGet(is_local%wrap%FBExp(compwav), 'Fwxx_taux', field=field_dst, rc=rc)
+ if (chkerr(rc,__LINE__,u_FILE_u)) return
+ call ESMF_FieldRegrid(field_src, field_dst, &
+ routehandle=is_local%wrap%RH(compocn, compwav, maptype), &
+ termorderflag=ESMF_TERMORDER_SRCSEQ, zeroregion=ESMF_REGION_TOTAL, rc=rc)
+ if (chkerr(rc,__LINE__,u_FILE_u)) return
+ call ESMF_FieldBundleGet(is_local%wrap%FBMed_aoflux_o, 'Faox_tauy', field=field_src, rc=rc)
+ if (chkerr(rc,__LINE__,u_FILE_u)) return
+ call ESMF_FieldBundleGet(is_local%wrap%FBExp(compwav), 'Fwxx_tauy', field=field_dst, rc=rc)
+ if (chkerr(rc,__LINE__,u_FILE_u)) return
+ call ESMF_FieldRegrid(field_src, field_dst, &
+ routehandle=is_local%wrap%RH(compocn, compwav, maptype), &
+ termorderflag=ESMF_TERMORDER_SRCSEQ, zeroregion=ESMF_REGION_TOTAL, rc=rc)
+ if (chkerr(rc,__LINE__,u_FILE_u)) return
+ end if
+
call t_stopf('MED:'//subname)
end subroutine med_aofluxes_update
diff --git a/mediator/med_phases_history_mod.F90 b/mediator/med_phases_history_mod.F90
index 2f7c9f062..7d59a7fea 100644
--- a/mediator/med_phases_history_mod.F90
+++ b/mediator/med_phases_history_mod.F90
@@ -24,6 +24,7 @@ module med_phases_history_mod
use med_time_mod , only : med_time_alarmInit
use med_io_mod , only : med_io_write, med_io_wopen, med_io_enddef, med_io_close
use perf_mod , only : t_startf, t_stopf
+ use pio , only : file_desc_t
implicit none
private
@@ -59,6 +60,7 @@ module med_phases_history_mod
! Instantaneous history files datatypes/variables per component
! ----------------------------
type, public :: instfile_type
+ type(file_desc_t):: io_file
logical :: write_inst
character(CS) :: hist_option
integer :: hist_n
@@ -74,6 +76,7 @@ module med_phases_history_mod
! Time averaging history files
! ----------------------------
type, public :: avgfile_type
+ type(file_desc_t) :: io_file
logical :: write_avg
type(ESMF_FieldBundle) :: FBaccum_import ! field bundle for time averaging
integer :: accumcnt_import ! field bundle accumulation counter
@@ -93,6 +96,7 @@ module med_phases_history_mod
! Auxiliary history files
! ----------------------------
type, public :: auxfile_type
+ type(file_desc_t) :: io_file
character(CS), allocatable :: flds(:) ! array of aux field names
character(CS) :: auxname ! name for history file creation
character(CL) :: histfile = '' ! current history file name
@@ -155,6 +159,7 @@ subroutine med_phases_history_write(gcomp, rc)
integer, intent(out) :: rc
! local variables
+ type(file_desc_t) :: io_file
type(InternalState) :: is_local
type(ESMF_Clock) :: mclock
type(ESMF_Alarm) :: alarm
@@ -292,22 +297,23 @@ subroutine med_phases_history_write(gcomp, rc)
! Create history file
call ESMF_GridCompGet(gcomp, vm=vm, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
- call med_io_wopen(hist_file, vm, clobber=.true.)
+ call med_io_wopen(hist_file, io_file, vm, rc, clobber=.true.)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
! Loop over whead/wdata phases
do m = 1,2
if (m == 2) then
- call med_io_enddef(hist_file)
+ call med_io_enddef(io_file)
end if
! Write time values
if (whead(m)) then
call ESMF_ClockGet(mclock, calendar=calendar, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
- call med_io_define_time(time_units, calendar, rc=rc)
+ call med_io_define_time(io_file, time_units, calendar, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
else
- call med_io_write_time(time_val, time_bnds, nt=1, rc=rc)
+ call med_io_write_time(io_file, time_val, time_bnds, nt=1, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
end if
@@ -315,49 +321,49 @@ subroutine med_phases_history_write(gcomp, rc)
! Write import and export field bundles
if (is_local%wrap%comp_present(n)) then
if (ESMF_FieldBundleIsCreated(is_local%wrap%FBimp(n,n),rc=rc)) then
- call med_io_write(hist_file, is_local%wrap%FBimp(n,n), whead(m), wdata(m), &
+ call med_io_write(io_file, is_local%wrap%FBimp(n,n), whead(m), wdata(m), &
is_local%wrap%nx(n), is_local%wrap%ny(n), nt=1, pre=trim(compname(n))//'Imp', rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
endif
if (ESMF_FieldBundleIsCreated(is_local%wrap%FBexp(n),rc=rc)) then
- call med_io_write(hist_file, is_local%wrap%FBexp(n), whead(m), wdata(m), &
+ call med_io_write(io_file, is_local%wrap%FBexp(n), whead(m), wdata(m), &
is_local%wrap%nx(n), is_local%wrap%ny(n), nt=1, pre=trim(compname(n))//'Exp', rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
endif
end if
! Write mediator fraction field bundles
if (ESMF_FieldBundleIsCreated(is_local%wrap%FBFrac(n),rc=rc)) then
- call med_io_write(hist_file, is_local%wrap%FBFrac(n), whead(m), wdata(m), &
+ call med_io_write(io_file, is_local%wrap%FBFrac(n), whead(m), wdata(m), &
is_local%wrap%nx(n), is_local%wrap%ny(n), nt=1, pre='Med_frac_'//trim(compname(n)), rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
end if
! Write component mediator area field bundles
- call med_io_write(hist_file, is_local%wrap%FBArea(n), whead(m), wdata(m), &
+ call med_io_write(io_file, is_local%wrap%FBArea(n), whead(m), wdata(m), &
is_local%wrap%nx(n), is_local%wrap%ny(n), nt=1, pre='MED_'//trim(compname(n)), rc=rc)
end do
! Write atm/ocn fluxes and ocean albedoes if field bundles are created
if (ESMF_FieldBundleIsCreated(is_local%wrap%FBMed_ocnalb_o,rc=rc)) then
- call med_io_write(hist_file, is_local%wrap%FBMed_ocnalb_o, whead(m), wdata(m), &
+ call med_io_write(io_file, is_local%wrap%FBMed_ocnalb_o, whead(m), wdata(m), &
is_local%wrap%nx(compocn), is_local%wrap%ny(compocn), nt=1, pre='Med_alb_ocn', rc=rc)
end if
if (ESMF_FieldBundleIsCreated(is_local%wrap%FBMed_aoflux_o,rc=rc)) then
- call med_io_write(hist_file, is_local%wrap%FBMed_aoflux_o, whead(m), wdata(m), &
+ call med_io_write(io_file, is_local%wrap%FBMed_aoflux_o, whead(m), wdata(m), &
is_local%wrap%nx(compocn), is_local%wrap%ny(compocn), nt=1, pre='Med_aoflux_ocn', rc=rc)
end if
if (ESMF_FieldBundleIsCreated(is_local%wrap%FBMed_ocnalb_a,rc=rc)) then
- call med_io_write(hist_file, is_local%wrap%FBMed_ocnalb_a, whead(m), wdata(m), &
+ call med_io_write(io_file, is_local%wrap%FBMed_ocnalb_a, whead(m), wdata(m), &
is_local%wrap%nx(compatm), is_local%wrap%ny(compatm), nt=1, pre='Med_alb_atm', rc=rc)
end if
if (ESMF_FieldBundleIsCreated(is_local%wrap%FBMed_aoflux_a,rc=rc)) then
- call med_io_write(hist_file, is_local%wrap%FBMed_aoflux_a, whead(m), wdata(m), &
+ call med_io_write(io_file, is_local%wrap%FBMed_aoflux_a, whead(m), wdata(m), &
is_local%wrap%nx(compatm), is_local%wrap%ny(compatm), nt=1, pre='Med_aoflux_atm', rc=rc)
end if
end do ! end of loop over whead/wdata m index phases
! Close file
- call med_io_close(hist_file, vm, rc=rc)
+ call med_io_close(io_file, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
end if ! end of write_now if-block
@@ -463,43 +469,44 @@ subroutine med_phases_history_write_med(gcomp, rc)
! Create history file
call ESMF_GridCompGet(gcomp, vm=vm, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
- call med_io_wopen(hist_file, vm, clobber=.true.)
+ call med_io_wopen(hist_file, instfiles(compmed)%io_file, vm, rc, clobber=.true.)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
do m = 1,2
! Write time values
if (whead(m)) then
call ESMF_ClockGet(instfiles(compmed)%clock, calendar=calendar, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
- call med_io_define_time(time_units, calendar, rc=rc)
+ call med_io_define_time(instfiles(compmed)%io_file, time_units, calendar, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
else
- call med_io_enddef(hist_file)
- call med_io_write_time(time_val, time_bnds, nt=1, rc=rc)
+ call med_io_enddef(instfiles(compmed)%io_file)
+ call med_io_write_time(instfiles(compmed)%io_file, time_val, time_bnds, nt=1, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
end if
! Write aoflux fields computed in mediator
if (ESMF_FieldBundleIsCreated(is_local%wrap%FBMed_aoflux_o,rc=rc)) then
- call med_io_write(hist_file, is_local%wrap%FBMed_aoflux_o, whead(m), wdata(m), &
+ call med_io_write(instfiles(compmed)%io_file, is_local%wrap%FBMed_aoflux_o, whead(m), wdata(m), &
is_local%wrap%nx(compocn), is_local%wrap%ny(compocn), nt=1, pre='Med_aoflux_ocn', rc=rc)
end if
if (ESMF_FieldBundleIsCreated(is_local%wrap%FBMed_aoflux_a,rc=rc)) then
- call med_io_write(hist_file, is_local%wrap%FBMed_aoflux_a, whead(m), wdata(m), &
+ call med_io_write(instfiles(compmed)%io_file, is_local%wrap%FBMed_aoflux_a, whead(m), wdata(m), &
is_local%wrap%nx(compatm), is_local%wrap%ny(compatm), nt=1, pre='Med_aoflux_atm', rc=rc)
end if
! If appropriate - write ocn albedos computed in mediator
if (ESMF_FieldBundleIsCreated(is_local%wrap%FBMed_ocnalb_o,rc=rc)) then
- call med_io_write(hist_file, is_local%wrap%FBMed_ocnalb_o, whead(m), wdata(m), &
+ call med_io_write(instfiles(compmed)%io_file, is_local%wrap%FBMed_ocnalb_o, whead(m), wdata(m), &
is_local%wrap%nx(compocn), is_local%wrap%ny(compocn), nt=1, pre='Med_alb_ocn', rc=rc)
end if
if (ESMF_FieldBundleIsCreated(is_local%wrap%FBMed_ocnalb_a,rc=rc)) then
- call med_io_write(hist_file, is_local%wrap%FBMed_ocnalb_a, whead(m), wdata(m), &
+ call med_io_write(instfiles(compmed)%io_file, is_local%wrap%FBMed_ocnalb_a, whead(m), wdata(m), &
is_local%wrap%nx(compatm), is_local%wrap%ny(compatm), nt=1, pre='Med_alb_atm', rc=rc)
end if
end do ! end of loop over m
! Close file
- call med_io_close(hist_file, vm, rc=rc)
+ call med_io_close(instfiles(compmed)%io_file, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
end if ! end of if-write_now block
@@ -523,6 +530,7 @@ subroutine med_phases_history_write_lnd2glc(gcomp, fldbun, rc)
integer , intent(out) :: rc
! local variables
+ type(file_desc_t) :: io_file
type(InternalState) :: is_local
type(ESMF_VM) :: vm
type(ESMF_Clock) :: clock
@@ -596,27 +604,28 @@ subroutine med_phases_history_write_lnd2glc(gcomp, fldbun, rc)
! Create history file
call ESMF_GridCompGet(gcomp, vm=vm, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
- call med_io_wopen(hist_file, vm, clobber=.true.)
+ call med_io_wopen(hist_file, io_file, vm, rc, clobber=.true.)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
! Write data to history file
do m = 1,2
if (whead(m)) then
call ESMF_ClockGet(clock, calendar=calendar, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
- call med_io_define_time(time_units, calendar, rc=rc)
+ call med_io_define_time(io_file, time_units, calendar, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
else
- call med_io_enddef(hist_file)
- call med_io_write_time(time_val, time_bnds, nt=1, rc=rc)
+ call med_io_enddef(io_file)
+ call med_io_write_time(io_file, time_val, time_bnds, nt=1, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
end if
- call med_io_write(hist_file, fldbun, whead(m), wdata(m), is_local%wrap%nx(complnd), is_local%wrap%ny(complnd), &
+ call med_io_write(io_file, fldbun, whead(m), wdata(m), is_local%wrap%nx(complnd), is_local%wrap%ny(complnd), &
nt=1, pre=trim(compname(complnd))//'Imp', rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
end do ! end of loop over m
! Close history file
- call med_io_close(hist_file, vm, rc=rc)
+ call med_io_close(io_file, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
end subroutine med_phases_history_write_lnd2glc
@@ -749,17 +758,18 @@ subroutine med_phases_history_write_comp_inst(gcomp, compid, instfile, rc)
! Create history file
call ESMF_GridCompGet(gcomp, vm=vm, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
- call med_io_wopen(hist_file, vm, clobber=.true.)
+ call med_io_wopen(hist_file, instfile%io_file, vm, rc, clobber=.true.)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
do m = 1,2
! Write time values
if (whead(m)) then
call ESMF_ClockGet(instfile%clock, calendar=calendar, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
- call med_io_define_time(time_units, calendar, rc=rc)
+ call med_io_define_time(instfile%io_file, time_units, calendar, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
else
- call med_io_enddef(hist_file)
- call med_io_write_time(time_val, time_bnds, nt=1, rc=rc)
+ call med_io_enddef(instfile%io_file)
+ call med_io_write_time(instfile%io_file, time_val, time_bnds, nt=1, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
end if
@@ -767,19 +777,19 @@ subroutine med_phases_history_write_comp_inst(gcomp, compid, instfile, rc)
ny = is_local%wrap%ny(compid)
! Define/write import field bundle
if (ESMF_FieldBundleIsCreated(is_local%wrap%FBimp(compid,compid),rc=rc)) then
- call med_io_write(hist_file, is_local%wrap%FBimp(compid,compid), whead(m), wdata(m), nx, ny, &
+ call med_io_write(instfile%io_file, is_local%wrap%FBimp(compid,compid), whead(m), wdata(m), nx, ny, &
nt=1, pre=trim(compname(compid))//'Imp', tilesize=hist_tilesize, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
endif
! Define/write import export bundle
if (ESMF_FieldBundleIsCreated(is_local%wrap%FBexp(compid),rc=rc)) then
- call med_io_write(hist_file, is_local%wrap%FBexp(compid), whead(m), wdata(m), nx, ny, &
+ call med_io_write(instfile%io_file, is_local%wrap%FBexp(compid), whead(m), wdata(m), nx, ny, &
nt=1, pre=trim(compname(compid))//'Exp', tilesize=hist_tilesize, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
endif
! Define/Write mediator fractions
if (ESMF_FieldBundleIsCreated(is_local%wrap%FBFrac(compid),rc=rc)) then
- call med_io_write(hist_file, is_local%wrap%FBFrac(compid), whead(m), wdata(m), nx, ny, &
+ call med_io_write(instfile%io_file, is_local%wrap%FBFrac(compid), whead(m), wdata(m), nx, ny, &
nt=1, pre='Med_frac_'//trim(compname(compid)), tilesize=hist_tilesize, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
end if
@@ -787,7 +797,7 @@ subroutine med_phases_history_write_comp_inst(gcomp, compid, instfile, rc)
end do ! end of loop over m
! Close file
- call med_io_close(hist_file, vm, rc=rc)
+ call med_io_close(instfile%io_file, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
end if
@@ -953,17 +963,18 @@ subroutine med_phases_history_write_comp_avg(gcomp, compid, avgfile, rc)
! Create history file
call ESMF_GridCompGet(gcomp, vm=vm, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
- call med_io_wopen(hist_file, vm, clobber=.true.)
+ call med_io_wopen(hist_file, avgfile%io_file, vm, rc, clobber=.true.)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
do m = 1,2
! Write time values
if (whead(m)) then
call ESMF_ClockGet(avgfile%clock, calendar=calendar, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
- call med_io_define_time(time_units, calendar, rc=rc)
+ call med_io_define_time(avgfile%io_file, time_units, calendar, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
else
- call med_io_enddef(hist_file)
- call med_io_write_time(time_val, time_bnds, nt=1, rc=rc)
+ call med_io_enddef(avgfile%io_file)
+ call med_io_write_time(avgfile%io_file, time_val, time_bnds, nt=1, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
end if
@@ -972,7 +983,7 @@ subroutine med_phases_history_write_comp_avg(gcomp, compid, avgfile, rc)
nx = is_local%wrap%nx(compid)
ny = is_local%wrap%ny(compid)
if (ESMF_FieldBundleIsCreated(is_local%wrap%FBimp(compid,compid),rc=rc)) then
- call med_io_write(hist_file, avgfile%FBaccum_import, whead(m), wdata(m), nx, ny, &
+ call med_io_write(avgfile%io_file, avgfile%FBaccum_import, whead(m), wdata(m), nx, ny, &
nt=1, pre=trim(compname(compid))//'Imp', tilesize=hist_tilesize, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
if (wdata(m)) then
@@ -981,7 +992,7 @@ subroutine med_phases_history_write_comp_avg(gcomp, compid, avgfile, rc)
end if
endif
if (ESMF_FieldBundleIsCreated(is_local%wrap%FBexp(compid),rc=rc)) then
- call med_io_write(hist_file, avgfile%FBaccum_export, whead(m), wdata(m), nx, ny, &
+ call med_io_write(avgfile%io_file, avgfile%FBaccum_export, whead(m), wdata(m), nx, ny, &
nt=1, pre=trim(compname(compid))//'Exp', tilesize=hist_tilesize, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
if (wdata(m)) then
@@ -993,7 +1004,7 @@ subroutine med_phases_history_write_comp_avg(gcomp, compid, avgfile, rc)
end do ! end of loop over m
! Close file
- call med_io_close(hist_file, vm, rc=rc)
+ call med_io_close(avgfile%io_file, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
end if ! end of write_now if-block
@@ -1276,39 +1287,40 @@ subroutine med_phases_history_write_comp_aux(gcomp, compid, auxcomp, rc)
! open file
call ESMF_GridCompGet(gcomp, vm=vm, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
- call med_io_wopen(auxcomp%files(nf)%histfile, vm, file_ind=nf, clobber=.true.)
+ call med_io_wopen(auxcomp%files(nf)%histfile, auxcomp%files(nf)%io_file, vm, rc, file_ind=nf, clobber=.true.)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
! define time variables
call ESMF_ClockGet(auxcomp%files(nf)%clock, calendar=calendar, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
- call med_io_define_time(time_units, calendar, file_ind=nf, rc=rc)
+ call med_io_define_time(auxcomp%files(nf)%io_file, time_units, calendar, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
! define data variables with a time dimension (include the nt argument below)
- call med_io_write(auxcomp%files(nf)%histfile, is_local%wrap%FBimp(compid,compid), &
+ call med_io_write(auxcomp%files(nf)%io_file, is_local%wrap%FBimp(compid,compid), &
whead(1), wdata(1), nx, ny, nt=auxcomp%files(nf)%nt, &
pre=trim(compname(compid))//'Imp', flds=auxcomp%files(nf)%flds, &
- file_ind=nf, use_float=.true., rc=rc)
+ use_float=.true., rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
! end definition phase
- call med_io_enddef(auxcomp%files(nf)%histfile, file_ind=nf)
+ call med_io_enddef(auxcomp%files(nf)%io_file)
end if
! Write time variables for time nt
- call med_io_write_time(time_val, time_bnds, nt=auxcomp%files(nf)%nt, file_ind=nf, rc=rc)
+ call med_io_write_time(auxcomp%files(nf)%io_file, time_val, time_bnds, nt=auxcomp%files(nf)%nt, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
! Write data variables for time nt
if (auxcomp%files(nf)%doavg) then
- call med_io_write(auxcomp%files(nf)%histfile, auxcomp%files(nf)%FBaccum, whead(2), wdata(2), nx, ny, &
- nt=auxcomp%files(nf)%nt, pre=trim(compname(compid))//'Imp', flds=auxcomp%files(nf)%flds, file_ind=nf, rc=rc)
+ call med_io_write(auxcomp%files(nf)%io_file, auxcomp%files(nf)%FBaccum, whead(2), wdata(2), nx, ny, &
+ nt=auxcomp%files(nf)%nt, pre=trim(compname(compid))//'Imp', flds=auxcomp%files(nf)%flds, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
call med_methods_FB_reset(auxcomp%files(nf)%FBaccum, value=czero, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
else
- call med_io_write(auxcomp%files(nf)%histfile, is_local%wrap%FBimp(compid,compid), whead(2), wdata(2), nx, ny, &
- nt=auxcomp%files(nf)%nt, pre=trim(compname(compid))//'Imp', flds=auxcomp%files(nf)%flds, file_ind=nf, rc=rc)
+ call med_io_write(auxcomp%files(nf)%io_file, is_local%wrap%FBimp(compid,compid), whead(2), wdata(2), nx, ny, &
+ nt=auxcomp%files(nf)%nt, pre=trim(compname(compid))//'Imp', flds=auxcomp%files(nf)%flds, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
end if
@@ -1316,7 +1328,7 @@ subroutine med_phases_history_write_comp_aux(gcomp, compid, auxcomp, rc)
if (auxcomp%files(nf)%nt == auxcomp%files(nf)%ntperfile) then
call ESMF_GridCompGet(gcomp, vm=vm, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
- call med_io_close(auxcomp%files(nf)%histfile, vm, file_ind=nf, rc=rc)
+ call med_io_close(auxcomp%files(nf)%io_file, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
auxcomp%files(nf)%nt = 0
end if
diff --git a/mediator/med_phases_ocnalb_mod.F90 b/mediator/med_phases_ocnalb_mod.F90
index a5ef002c7..304d0c7fd 100644
--- a/mediator/med_phases_ocnalb_mod.F90
+++ b/mediator/med_phases_ocnalb_mod.F90
@@ -6,13 +6,11 @@ module med_phases_ocnalb_mod
use med_utils_mod , only : chkerr => med_utils_chkerr
use med_methods_mod , only : FB_diagnose => med_methods_FB_diagnose
use med_methods_mod , only : State_GetScalar => med_methods_State_GetScalar
- use med_internalstate_mod , only : mapconsf, mapnames, compatm, compocn
+ use med_internalstate_mod , only : mapconsf, mapnames, compatm, compocn, maintask
use perf_mod , only : t_startf, t_stopf
-#ifdef CESMCOUPLED
use shr_orb_mod , only : shr_orb_cosz, shr_orb_decl
use shr_orb_mod , only : shr_orb_params, SHR_ORB_UNDEF_INT, SHR_ORB_UNDEF_REAL
use shr_log_mod , only : shr_log_unit
-#endif
implicit none
private
@@ -26,11 +24,10 @@ module med_phases_ocnalb_mod
!--------------------------------------------------------------------------
! Private interfaces
!--------------------------------------------------------------------------
-#ifdef CESMCOUPLED
+
private med_phases_ocnalb_init
private med_phases_ocnalb_orbital_update
private med_phases_ocnalb_orbital_init
-#endif
!--------------------------------------------------------------------------
! Private data
@@ -47,25 +44,30 @@ module med_phases_ocnalb_mod
logical :: created ! has memory been allocated here
end type ocnalb_type
- ! Conversion from degrees to radians
character(*),parameter :: u_FILE_u = &
__FILE__
-#ifdef CESMCOUPLED
character(len=CL) :: orb_mode ! attribute - orbital mode
integer :: orb_iyear ! attribute - orbital year
integer :: orb_iyear_align ! attribute - associated with model year
real(R8) :: orb_obliq ! attribute - obliquity in degrees
real(R8) :: orb_mvelp ! attribute - moving vernal equinox longitude
real(R8) :: orb_eccen ! attribute and update- orbital eccentricity
-#endif
+
character(len=*) , parameter :: orb_fixed_year = 'fixed_year'
character(len=*) , parameter :: orb_variable_year = 'variable_year'
character(len=*) , parameter :: orb_fixed_parameters = 'fixed_parameters'
+ ! used, reused in module
+ logical :: flux_albav ! use average dif and dir albedos
+ logical :: use_nextswcday ! use the scalar field for next time (otherwise, will be set using clock)
+ logical :: use_min_albedo ! apply minimum value of albedo for direct vis, nir
+ real(R8) :: min_albedo ! minimum value of albedo for direct vis, nir
+ real(R8) :: albdif ! 60 deg reference albedo, diffuse
+ real(R8) :: albdir ! 60 deg reference albedo, direct
!===============================================================================
contains
!===============================================================================
-#ifdef CESMCOUPLED
+
subroutine med_phases_ocnalb_init(gcomp, ocnalb, rc)
!-----------------------------------------------------------------------
@@ -74,11 +76,12 @@ subroutine med_phases_ocnalb_init(gcomp, ocnalb, rc)
! All input field bundles are ASSUMED to be on the ocean grid
!-----------------------------------------------------------------------
- use ESMF , only : ESMF_LogWrite, ESMF_LOGMSG_INFO, ESMF_SUCCESS, ESMF_FAILURE
- use ESMF , only : ESMF_VM, ESMF_VMGet, ESMF_Mesh, ESMF_MeshGet
- use ESMF , only : ESMF_GridComp, ESMF_GridCompGet
- use ESMF , only : ESMF_FieldBundleGet, ESMF_Field, ESMF_FieldGet
- use ESMF , only : operator(==)
+ use ESMF , only : ESMF_LogWrite, ESMF_LOGMSG_INFO, ESMF_SUCCESS, ESMF_FAILURE
+ use ESMF , only : ESMF_VM, ESMF_VMGet, ESMF_Mesh, ESMF_MeshGet
+ use ESMF , only : ESMF_GridComp, ESMF_GridCompGet
+ use ESMF , only : ESMF_FieldBundleGet, ESMF_Field, ESMF_FieldGet
+ use NUOPC , only : NUOPC_CompAttributeGet
+ use ESMF , only : operator(==)
! Arguments
type(ESMF_GridComp) :: gcomp
@@ -97,7 +100,11 @@ subroutine med_phases_ocnalb_init(gcomp, ocnalb, rc)
type(InternalState) :: is_local
real(R8), pointer :: ownedElemCoords(:)
character(len=CL) :: tempc1,tempc2
+ character(len=CS) :: cvalue
+ logical :: use_min_ocnalb
+ logical :: isPresent, isSet
integer :: fieldCount
+ character(CL) :: msg
type(ESMF_Field), pointer :: fieldlist(:)
character(*), parameter :: subname = '(med_phases_ocnalb_init) '
!-----------------------------------------------------------------------
@@ -186,13 +193,65 @@ subroutine med_phases_ocnalb_init(gcomp, ocnalb, rc)
call med_phases_ocnalb_orbital_init(gcomp, logunit, iam==0, rc)
if (chkerr(rc,__LINE__,u_FILE_u)) return
+ ! Determine if reference albedos are used
+ flux_albav = .false.
+ call NUOPC_CompAttributeGet(gcomp, name='flux_albav', value=cvalue, isPresent=isPresent, isSet=isSet, rc=rc)
+ if (chkerr(rc,__LINE__,u_FILE_u)) return
+ if (isPresent .and. isSet) then
+ read(cvalue,*) flux_albav
+ end if
+ ! Set reference albedo values
+ call NUOPC_CompAttributeGet(gcomp, name="albdif", value=cvalue, isPresent=isPresent, isSet=isSet, rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+ if (isPresent .and. isSet) then
+ read(cvalue,*) albdif
+ else
+ albdif = 0.06_r8
+ end if
+ call NUOPC_CompAttributeGet(gcomp, name="albdir", value=cvalue, isPresent=isPresent, isSet=isSet, rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+ if (isPresent .and. isSet) then
+ read(cvalue,*) albdir
+ else
+ albdir = 0.07_r8
+ end if
+ ! Determine if direct albedo should have a minimum value
+ call NUOPC_CompAttributeGet(gcomp, name="ocean_albedo_limit", value=cvalue, isPresent=isPresent, isSet=isSet, rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+ if (isPresent .and. isSet) then
+ read(cvalue,*) min_albedo
+ use_min_albedo = .true.
+ else
+ min_albedo = 0.0_R8
+ use_min_ocnalb = .false.
+ endif
+ ! Allow setting of albedo timestep using the clock instead of the atm's next timestep
+ use_nextswcday = .true.
+ call NUOPC_CompAttributeGet(gcomp, name="ScalarFieldIdxNextSwCday", isPresent=isPresent, rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+ if (.not. isPresent ) then
+ use_nextswcday = .false.
+ endif
+
+ if (flux_albav) then
+ write(msg,'(2(A,f8.2))') trim(subname)//': mean albedos set: albdif = ',albdif,', albdir = ',albdir
+ call ESMF_LogWrite(trim(msg), ESMF_LOGMSG_INFO)
+ else
+ if (use_min_albedo) then
+ write(msg,'(A,f8.2)') trim(subname)//': min_albedo setting = ',min_albedo
+ call ESMF_LogWrite(trim(msg), ESMF_LOGMSG_INFO)
+ end if
+ end if
+ write(msg,'(A,l1)') trim(subname)//': use_nextswcday setting is ',use_nextswcday
+ call ESMF_LogWrite(trim(msg), ESMF_LOGMSG_INFO)
+
if (dbug_flag > 5) then
call ESMF_LogWrite(trim(subname)//": done", ESMF_LOGMSG_INFO)
endif
call t_stopf('MED:'//subname)
end subroutine med_phases_ocnalb_init
-#endif
+
!===============================================================================
subroutine med_phases_ocnalb_run(gcomp, rc)
@@ -201,8 +260,10 @@ subroutine med_phases_ocnalb_run(gcomp, rc)
! Compute ocean albedos (on the ocean grid)
!-----------------------------------------------------------------------
+ use NUOPC_Mediator, only : NUOPC_MediatorGet
use ESMF , only : ESMF_GridComp, ESMF_GridCompGet, ESMF_TimeInterval
use ESMF , only : ESMF_Clock, ESMF_ClockGet, ESMF_Time, ESMF_TimeGet
+ use ESMF , only : ESMF_ClockIsCreated, ESMF_ClockGetNextTime
use ESMF , only : ESMF_VM, ESMF_VMGet
use ESMF , only : ESMF_LogWrite, ESMF_LogFoundError
use ESMF , only : ESMF_SUCCESS, ESMF_FAILURE, ESMF_LOGMSG_INFO
@@ -211,11 +272,11 @@ subroutine med_phases_ocnalb_run(gcomp, rc)
use ESMF , only : operator(+)
use NUOPC , only : NUOPC_CompAttributeGet
use med_constants_mod , only : shr_const_pi
+ use med_phases_history_mod, only : med_phases_history_write_med
! input/output variables
type(ESMF_GridComp) :: gcomp
integer, intent(out) :: rc
-#ifdef CESMCOUPLED
! local variables
type(ocnalb_type), save :: ocnalb
type(ESMF_VM) :: vm
@@ -224,12 +285,13 @@ subroutine med_phases_ocnalb_run(gcomp, rc)
logical :: update_alb
type(InternalState) :: is_local
type(ESMF_Clock) :: clock
+ type(ESMF_Clock) :: dclock
type(ESMF_Time) :: currTime
+ type(ESMF_Time) :: nextTime
type(ESMF_TimeInterval) :: timeStep
character(CL) :: cvalue
character(CS) :: starttype ! config start type
character(CL) :: runtype ! initial, continue, hybrid, branch
- logical :: flux_albav ! flux avg option
real(R8) :: nextsw_cday ! calendar day of next atm shortwave
real(R8), pointer :: ofrac(:)
real(R8), pointer :: ofrad(:)
@@ -246,21 +308,13 @@ subroutine med_phases_ocnalb_run(gcomp, rc)
real(R8) :: obliqr ! Earth orbit
real(R8) :: delta ! Solar declination angle in radians
real(R8) :: eccf ! Earth orbit eccentricity factor
- real(R8), parameter :: albdif = 0.06_r8 ! 60 deg reference albedo, diffuse
- real(R8), parameter :: albdir = 0.07_r8 ! 60 deg reference albedo, direct
real(R8), parameter :: const_deg2rad = shr_const_pi/180.0_R8 ! deg to rads
character(CL) :: msg
logical :: first_call = .true.
character(len=*) , parameter :: subname='(med_phases_ocnalb_run)'
!---------------------------------------
-#endif
- rc = ESMF_SUCCESS
-
-#ifndef CESMCOUPLED
- RETURN ! the following code is not executed unless the model is CESM
-
-#else
+ rc = ESMF_SUCCESS
! Determine main task
call ESMF_GridCompGet(gcomp, vm=vm, rc=rc)
@@ -275,8 +329,7 @@ subroutine med_phases_ocnalb_run(gcomp, rc)
! Determine if ocnalb data type will be initialized - and if not return
if (first_call) then
- if ( ESMF_FieldBundleIsCreated(is_local%wrap%FBMed_aoflux_a, rc=rc) .and. &
- ESMF_FieldBundleIsCreated(is_local%wrap%FBMed_aoflux_o, rc=rc)) then
+ if (ESMF_FieldBundleIsCreated(is_local%wrap%FBMed_ocnalb_o, rc=rc)) then
ocnalb%created = .true.
else
ocnalb%created = .false.
@@ -331,6 +384,26 @@ subroutine med_phases_ocnalb_run(gcomp, rc)
call ESMF_TimeGet( currTime, dayOfYear_r8=nextsw_cday, rc=rc )
if (chkerr(rc,__LINE__,u_FILE_u)) return
else
+ ! obtain nextsw_cday from atm if it is in the import state
+ if (use_nextswcday) then
+ call State_GetScalar(&
+ state=is_local%wrap%NstateImp(compatm), &
+ flds_scalar_name=is_local%wrap%flds_scalar_name, &
+ flds_scalar_num=is_local%wrap%flds_scalar_num, &
+ scalar_id=is_local%wrap%flds_scalar_index_nextsw_cday, &
+ scalar_value=nextsw_cday, rc=rc)
+ if (chkerr(rc,__LINE__,u_FILE_u)) return
+ else
+ call ESMF_TimeGet( currTime, dayOfYear_r8=nextsw_cday, rc=rc )
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+ end if
+ end if
+
+ first_call = .false.
+
+ else
+ ! Note that med_methods_State_GetScalar includes a broadcast to all other pets
+ if (use_nextswcday) then
call State_GetScalar(&
state=is_local%wrap%NstateImp(compatm), &
flds_scalar_name=is_local%wrap%flds_scalar_name, &
@@ -338,27 +411,14 @@ subroutine med_phases_ocnalb_run(gcomp, rc)
scalar_id=is_local%wrap%flds_scalar_index_nextsw_cday, &
scalar_value=nextsw_cday, rc=rc)
if (chkerr(rc,__LINE__,u_FILE_u)) return
+ else
+ call ESMF_ClockGetNextTime(clock, nextTime, rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+ call ESMF_TimeGet(nextTime, dayOfYear_r8=nextsw_cday, rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
end if
-
- first_call = .false.
-
- else
-
- ! Note that med_methods_State_GetScalar includes a broadcast to all other pets
- call State_GetScalar(&
- state=is_local%wrap%NstateImp(compatm), &
- flds_scalar_name=is_local%wrap%flds_scalar_name, &
- flds_scalar_num=is_local%wrap%flds_scalar_num, &
- scalar_id=is_local%wrap%flds_scalar_index_nextsw_cday, &
- scalar_value=nextsw_cday, rc=rc)
- if (chkerr(rc,__LINE__,u_FILE_u)) return
-
end if
- call NUOPC_CompAttributeGet(gcomp, name='flux_albav', value=cvalue, rc=rc)
- if (chkerr(rc,__LINE__,u_FILE_u)) return
- read(cvalue,*) flux_albav
-
! Get orbital values
call med_phases_ocnalb_orbital_update(clock, logunit, iam==0, eccen, obliqr, lambm0, mvelpp, rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
@@ -393,6 +453,9 @@ subroutine med_phases_ocnalb_run(gcomp, rc)
ocnalb%anidr(n) = (.026_r8/(cosz**1.7_r8 + 0.065_r8)) + &
(.150_r8*(cosz - 0.100_r8 ) * &
(cosz - 0.500_r8 ) * (cosz - 1.000_r8 ) )
+ if (use_min_albedo) then
+ ocnalb%anidr(n) = max (ocnalb%anidr(n), min_albedo)
+ end if
ocnalb%avsdr(n) = ocnalb%anidr(n)
ocnalb%anidf(n) = albdif
ocnalb%avsdf(n) = albdif
@@ -430,18 +493,25 @@ subroutine med_phases_ocnalb_run(gcomp, rc)
ofrad(:) = ofrac(:)
endif
+ if (ESMF_FieldBundleIsCreated(is_local%wrap%FBMed_ocnalb_o, rc=rc)) then
+ call NUOPC_MediatorGet(gcomp, driverClock=dClock, rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+ if (ESMF_ClockIsCreated(dclock)) then
+ call med_phases_history_write_med(gcomp, rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+ end if
+ end if
+
if (dbug_flag > 1) then
call FB_diagnose(is_local%wrap%FBMed_ocnalb_o, string=trim(subname)//' FBMed_ocnalb_o', rc=rc)
if (chkerr(rc,__LINE__,u_FILE_u)) return
end if
call t_stopf('MED:'//subname)
-#endif
-
end subroutine med_phases_ocnalb_run
!===============================================================================
-#ifdef CESMCOUPLED
+
subroutine med_phases_ocnalb_orbital_init(gcomp, logunit, maintask, rc)
!----------------------------------------------------------
@@ -601,7 +671,6 @@ subroutine med_phases_ocnalb_orbital_update(clock, logunit, maintask, eccen, ob
endif
end subroutine med_phases_ocnalb_orbital_update
-#endif
!===============================================================================
diff --git a/mediator/med_phases_prep_atm_mod.F90 b/mediator/med_phases_prep_atm_mod.F90
index 9bb2b059f..01d1a52d0 100644
--- a/mediator/med_phases_prep_atm_mod.F90
+++ b/mediator/med_phases_prep_atm_mod.F90
@@ -14,9 +14,10 @@ module med_phases_prep_atm_mod
use med_methods_mod , only : FB_diagnose => med_methods_FB_diagnose
use med_methods_mod , only : FB_fldchk => med_methods_FB_FldChk
use med_methods_mod , only : FB_getfldptr=> med_methods_FB_GetFldPtr
+ use med_methods_mod , only : FB_check_for_nans => med_methods_FB_check_for_nans
use med_merge_mod , only : med_merge_auto
use med_map_mod , only : med_map_field_packed
- use med_internalstate_mod , only : InternalState, maintask
+ use med_internalstate_mod , only : InternalState, maintask, logunit
use med_internalstate_mod , only : compatm, compocn, compice, compname, coupling_mode
use esmFlds , only : med_fldlist_GetfldListTo, med_fldlist_type
use perf_mod , only : t_startf, t_stopf
@@ -114,7 +115,6 @@ subroutine med_phases_prep_atm(gcomp, rc)
!--- map atm/ocn fluxes from ocn to atm grid if appropriate
!---------------------------------------
if (trim(coupling_mode) == 'cesm' .or. &
- trim(coupling_mode) == 'hafs' .or. &
trim(coupling_mode) == 'nems_frac_aoflux' .or. &
trim(coupling_mode) == 'nems_frac_aoflux_sbs') then
if (is_local%wrap%aoflux_grid == 'ogrid') then
@@ -132,30 +132,15 @@ subroutine med_phases_prep_atm(gcomp, rc)
!--- merge all fields to atm
!---------------------------------------
fldList => med_fldList_GetfldListTo(compatm)
- if (trim(coupling_mode) == 'cesm' .or. &
- trim(coupling_mode) == 'nems_frac_aoflux' .or. &
- trim(coupling_mode) == 'hafs') then
- call med_merge_auto(&
- is_local%wrap%med_coupling_active(:,compatm), &
- is_local%wrap%FBExp(compatm), &
- is_local%wrap%FBFrac(compatm), &
- is_local%wrap%FBImp(:,compatm), &
- fldList, &
- FBMed1=is_local%wrap%FBMed_ocnalb_a, &
- FBMed2=is_local%wrap%FBMed_aoflux_a, rc=rc)
- if (ChkErr(rc,__LINE__,u_FILE_u)) return
- else if (trim(coupling_mode) == 'nems_frac' .or. &
- trim(coupling_mode) == 'nems_orig' .or. &
- trim(coupling_mode) == 'nems_frac_aoflux_sbs') then
- call med_merge_auto(&
- is_local%wrap%med_coupling_active(:,compatm), &
- is_local%wrap%FBExp(compatm), &
- is_local%wrap%FBFrac(compatm), &
- is_local%wrap%FBImp(:,compatm), &
- fldList, &
- rc=rc)
- if (ChkErr(rc,__LINE__,u_FILE_u)) return
- end if
+ call med_merge_auto(&
+ is_local%wrap%med_coupling_active(:,compatm), &
+ is_local%wrap%FBExp(compatm), &
+ is_local%wrap%FBFrac(compatm), &
+ is_local%wrap%FBImp(:,compatm), &
+ fldList, &
+ FBMed1=is_local%wrap%FBMed_ocnalb_a, &
+ FBMed2=is_local%wrap%FBMed_aoflux_a, rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
if (dbug_flag > 1) then
call FB_diagnose(is_local%wrap%FBExp(compatm),string=trim(subname)//' FBexp(compatm) ', rc=rc)
@@ -243,6 +228,10 @@ subroutine med_phases_prep_atm(gcomp, rc)
end do
end if
+ ! Check for nans in fields export to atm
+ call FB_check_for_nans(is_local%wrap%FBExp(compatm), maintask, logunit, rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+
if (dbug_flag > 5) then
call ESMF_LogWrite(trim(subname)//": done", ESMF_LOGMSG_INFO)
end if
diff --git a/mediator/med_phases_prep_glc_mod.F90 b/mediator/med_phases_prep_glc_mod.F90
index 311d91c8a..920fb415e 100644
--- a/mediator/med_phases_prep_glc_mod.F90
+++ b/mediator/med_phases_prep_glc_mod.F90
@@ -34,6 +34,7 @@ module med_phases_prep_glc_mod
use med_methods_mod , only : fldbun_diagnose => med_methods_FB_diagnose
use med_methods_mod , only : fldbun_reset => med_methods_FB_reset
use med_methods_mod , only : fldbun_init => med_methods_FB_init
+ use med_methods_mod , only : FB_check_for_nans => med_methods_FB_check_for_nans
use med_methods_mod , only : field_getdata2d => med_methods_Field_getdata2d
use med_methods_mod , only : field_getdata1d => med_methods_Field_getdata1d
use med_utils_mod , only : chkerr => med_utils_ChkErr
@@ -706,6 +707,12 @@ subroutine med_phases_prep_glc_avg(gcomp, rc)
endif
end if
+ ! Check for nans in fields export to glc
+ do ns = 1,is_local%wrap%num_icesheets
+ call FB_check_for_nans(is_local%wrap%FBExp(compglc(ns)), maintask, logunit, rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+ end do
+
if (dbug_flag > 5) then
call ESMF_LogWrite(trim(subname)//": done", ESMF_LOGMSG_INFO)
endif
diff --git a/mediator/med_phases_prep_ice_mod.F90 b/mediator/med_phases_prep_ice_mod.F90
index 428f3afef..524313622 100644
--- a/mediator/med_phases_prep_ice_mod.F90
+++ b/mediator/med_phases_prep_ice_mod.F90
@@ -34,6 +34,7 @@ subroutine med_phases_prep_ice(gcomp, rc)
use med_methods_mod , only : FB_fldchk => med_methods_FB_FldChk
use med_methods_mod , only : FB_diagnose => med_methods_FB_diagnose
use med_methods_mod , only : FB_GetFldPtr => med_methods_FB_GetFldPtr
+ use med_methods_mod , only : FB_check_for_nans => med_methods_FB_check_for_nans
use med_constants_mod , only : dbug_flag => med_constants_dbug_flag
use med_merge_mod , only : med_merge_auto
use med_internalstate_mod , only : InternalState, logunit, maintask
@@ -149,6 +150,10 @@ subroutine med_phases_prep_ice(gcomp, rc)
if (chkerr(rc,__LINE__,u_FILE_u)) return
end if
+ ! Check for nans in fields export to ice
+ call FB_check_for_nans(is_local%wrap%FBExp(compice), maintask, logunit, rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+
if (dbug_flag > 5) then
call ESMF_LogWrite(trim(subname)//": done", ESMF_LOGMSG_INFO)
endif
diff --git a/mediator/med_phases_prep_lnd_mod.F90 b/mediator/med_phases_prep_lnd_mod.F90
index 0c0bad212..4be8bb402 100644
--- a/mediator/med_phases_prep_lnd_mod.F90
+++ b/mediator/med_phases_prep_lnd_mod.F90
@@ -29,10 +29,11 @@ subroutine med_phases_prep_lnd(gcomp, rc)
use ESMF , only : ESMF_StateGet, ESMF_StateItem_Flag, ESMF_STATEITEM_NOTFOUND
use esmFlds , only : med_fldList_GetFldListTo, med_fldList_type
use med_methods_mod , only : fldbun_diagnose => med_methods_FB_diagnose
+ use med_methods_mod , only : FB_check_for_nans => med_methods_FB_check_for_nans
use med_utils_mod , only : chkerr => med_utils_ChkErr
use med_constants_mod , only : dbug_flag => med_constants_dbug_flag
use med_internalstate_mod , only : complnd, compatm
- use med_internalstate_mod , only : InternalState, maintask
+ use med_internalstate_mod , only : InternalState, maintask, logunit
use med_merge_mod , only : med_merge_auto
use perf_mod , only : t_startf, t_stopf
@@ -127,6 +128,10 @@ subroutine med_phases_prep_lnd(gcomp, rc)
! Set first call logical to false
first_call = .false.
+ ! Check for nans in fields export to lnd
+ call FB_check_for_nans(is_local%wrap%FBExp(complnd), maintask, logunit, rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+
if (dbug_flag > 5) then
call ESMF_LogWrite(trim(subname)//": done", ESMF_LOGMSG_INFO)
end if
diff --git a/mediator/med_phases_prep_ocn_mod.F90 b/mediator/med_phases_prep_ocn_mod.F90
index 60e37a95e..d76f3e81a 100644
--- a/mediator/med_phases_prep_ocn_mod.F90
+++ b/mediator/med_phases_prep_ocn_mod.F90
@@ -19,6 +19,7 @@ module med_phases_prep_ocn_mod
use med_methods_mod , only : FB_average => med_methods_FB_average
use med_methods_mod , only : FB_copy => med_methods_FB_copy
use med_methods_mod , only : FB_reset => med_methods_FB_reset
+ use med_methods_mod , only : FB_check_for_nans => med_methods_FB_check_for_nans
use esmFlds , only : med_fldList_GetfldListTo, med_fldlist_type
use med_internalstate_mod , only : compocn, compatm, compice, coupling_mode
use perf_mod , only : t_startf, t_stopf
@@ -30,8 +31,7 @@ module med_phases_prep_ocn_mod
public :: med_phases_prep_ocn_accum ! called from run sequence
public :: med_phases_prep_ocn_avg ! called from run sequence
- private :: med_phases_prep_ocn_custom_cesm
- private :: med_phases_prep_ocn_custom_nems
+ private :: med_phases_prep_ocn_custom
character(*), parameter :: u_FILE_u = &
__FILE__
@@ -116,30 +116,14 @@ subroutine med_phases_prep_ocn_accum(gcomp, rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
fldList => med_fldList_GetfldListTo(compocn)
! auto merges to ocn
- if ( trim(coupling_mode) == 'cesm' .or. &
- trim(coupling_mode) == 'nems_orig_data' .or. &
- trim(coupling_mode) == 'nems_frac_aoflux' .or. &
- trim(coupling_mode) == 'hafs') then
- call med_merge_auto(&
- is_local%wrap%med_coupling_active(:,compocn), &
- is_local%wrap%FBExp(compocn), &
- is_local%wrap%FBFrac(compocn), &
- is_local%wrap%FBImp(:,compocn), &
- fldList, &
- FBMed1=is_local%wrap%FBMed_aoflux_o, rc=rc)
- if (ChkErr(rc,__LINE__,u_FILE_u)) return
- else if (trim(coupling_mode) == 'nems_frac' .or. &
- trim(coupling_mode) == 'nems_orig' .or. &
- trim(coupling_mode) == 'nems_frac_aoflux_sbs') then
- call med_merge_auto(&
- is_local%wrap%med_coupling_active(:,compocn), &
- is_local%wrap%FBExp(compocn), &
- is_local%wrap%FBFrac(compocn), &
- is_local%wrap%FBImp(:,compocn), &
- fldList, &
- rc=rc)
- if (ChkErr(rc,__LINE__,u_FILE_u)) return
- end if
+ call med_merge_auto(&
+ is_local%wrap%med_coupling_active(:,compocn), &
+ is_local%wrap%FBExp(compocn), &
+ is_local%wrap%FBFrac(compocn), &
+ is_local%wrap%FBImp(:,compocn), &
+ fldList, &
+ FBMed1=is_local%wrap%FBMed_aoflux_o, rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
! compute enthaly associated with rain, snow, condensation and liquid river runoff
! the sea-ice model already accounts for the enthalpy flux (as part of melth), so
@@ -216,13 +200,8 @@ subroutine med_phases_prep_ocn_accum(gcomp, rc)
end if
! custom merges to ocean
- if (trim(coupling_mode) == 'cesm') then
- call med_phases_prep_ocn_custom_cesm(gcomp, rc)
- if (ChkErr(rc,__LINE__,u_FILE_u)) return
- else if (trim(coupling_mode(1:5)) == 'nems_') then
- call med_phases_prep_ocn_custom_nems(gcomp, rc)
- if (ChkErr(rc,__LINE__,u_FILE_u)) return
- end if
+ call med_phases_prep_ocn_custom(gcomp, rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
! ocean accumulator
call FB_accum(is_local%wrap%FBExpAccumOcn, is_local%wrap%FBExp(compocn), rc=rc)
@@ -295,6 +274,10 @@ subroutine med_phases_prep_ocn_avg(gcomp, rc)
call FB_copy(is_local%wrap%FBExp(compocn), is_local%wrap%FBExpAccumOcn, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
+ ! Check for nans in fields export to ocn
+ call FB_check_for_nans(is_local%wrap%FBExp(compocn), maintask, logunit, rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+
! zero accumulator
is_local%wrap%ExpAccumOcnCnt = 0
call FB_reset(is_local%wrap%FBExpAccumOcn, value=czero, rc=rc)
@@ -310,7 +293,7 @@ subroutine med_phases_prep_ocn_avg(gcomp, rc)
end subroutine med_phases_prep_ocn_avg
!-----------------------------------------------------------------------------
- subroutine med_phases_prep_ocn_custom_cesm(gcomp, rc)
+ subroutine med_phases_prep_ocn_custom(gcomp, rc)
!---------------------------------------
! custom calculations for cesm
@@ -367,7 +350,7 @@ subroutine med_phases_prep_ocn_custom_cesm(gcomp, rc)
integer :: lsize
real(R8) :: c1,c2,c3,c4
character(len=64), allocatable :: fldnames(:)
- character(len=*), parameter :: subname='(med_phases_prep_ocn_custom_cesm)'
+ character(len=*), parameter :: subname='(med_phases_prep_ocn_custom)'
!---------------------------------------
rc = ESMF_SUCCESS
@@ -383,7 +366,11 @@ subroutine med_phases_prep_ocn_custom_cesm(gcomp, rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
! Check that the necessary export field is present
- if ( .not. FB_fldchk(is_local%wrap%FBExp(compocn), 'Foxx_swnet', rc=rc)) then
+ if ( .not. FB_fldchk(is_local%wrap%FBExp(compocn), 'Foxx_swnet', rc=rc) .and. &
+ .not. (FB_fldchk(is_local%wrap%FBExp(compocn), 'Foxx_swnet_vdr', rc=rc) .and. &
+ FB_fldchk(is_local%wrap%FBExp(compocn), 'Foxx_swnet_vdf', rc=rc) .and. &
+ FB_fldchk(is_local%wrap%FBExp(compocn), 'Foxx_swnet_idr', rc=rc) .and. &
+ FB_fldchk(is_local%wrap%FBExp(compocn), 'Foxx_swnet_idf', rc=rc))) then
return
end if
@@ -611,105 +598,6 @@ subroutine med_phases_prep_ocn_custom_cesm(gcomp, rc)
end if
call t_stopf('MED:'//subname)
- end subroutine med_phases_prep_ocn_custom_cesm
-
- !-----------------------------------------------------------------------------
- subroutine med_phases_prep_ocn_custom_nems(gcomp, rc)
-
- ! ----------------------------------------------
- ! Custom calculation for nems_orig or nems_frac
- ! ----------------------------------------------
-
- use ESMF , only : ESMF_GridComp
- use ESMF , only : ESMF_LogWrite, ESMF_LOGMSG_INFO, ESMF_SUCCESS
- use ESMF , only : ESMF_FAILURE, ESMF_LOGMSG_ERROR
-
- ! input/output variables
- type(ESMF_GridComp) :: gcomp
- integer, intent(out) :: rc
-
- ! local variables
- type(InternalState) :: is_local
- real(R8), pointer :: customwgt(:)
- real(R8), pointer :: ifrac(:)
- real(R8), pointer :: ofrac(:)
- integer :: lsize
- real(R8) , parameter :: const_lhvap = 2.501e6_R8 ! latent heat of evaporation ~ J/kg
- character(len=*), parameter :: subname='(med_phases_prep_ocn_custom_nems)'
- !---------------------------------------
-
- rc = ESMF_SUCCESS
-
- call t_startf('MED:'//subname)
- if (dbug_flag > 20) then
- call ESMF_LogWrite(subname//' called', ESMF_LOGMSG_INFO)
- end if
- call memcheck(subname, 5, maintask)
-
- ! Get the internal state
- nullify(is_local%wrap)
- call ESMF_GridCompGetInternalState(gcomp, is_local, rc)
- if (ChkErr(rc,__LINE__,u_FILE_u)) return
-
- ! get ice and open ocean fractions on the ocn mesh
- call FB_GetFldPtr(is_local%wrap%FBfrac(compocn), 'ifrac' , ifrac, rc=rc)
- if (ChkErr(rc,__LINE__,u_FILE_u)) return
- call FB_GetFldPtr(is_local%wrap%FBfrac(compocn), 'ofrac' , ofrac, rc=rc)
- if (ChkErr(rc,__LINE__,u_FILE_u)) return
-
- lsize = size(ofrac)
- allocate(customwgt(lsize))
-
- if (trim(coupling_mode) == 'nems_orig' .or. &
- trim(coupling_mode) == 'nems_frac' .or. &
- trim(coupling_mode) == 'nems_frac_aoflux_sbs') then
- customwgt(:) = -ofrac(:) / const_lhvap
- call med_merge_field(is_local%wrap%FBExp(compocn), 'Faxa_evap', &
- FBinA=is_local%wrap%FBImp(compatm,compocn), fnameA='Faxa_lat' , wgtA=customwgt, rc=rc)
- if (ChkErr(rc,__LINE__,u_FILE_u)) return
-
- customwgt(:) = -ofrac(:)
- call med_merge_field(is_local%wrap%FBExp(compocn), 'Faxa_sen', &
- FBinA=is_local%wrap%FBImp(compatm,compocn), fnameA='Faxa_sen', wgtA=customwgt, rc=rc)
- if (ChkErr(rc,__LINE__,u_FILE_u)) return
-
- customwgt(:) = -ofrac(:)
- call med_merge_field(is_local%wrap%FBExp(compocn), 'Foxx_taux', &
- FBinA=is_local%wrap%FBImp(compice,compocn), fnameA='Fioi_taux', wgtA=ifrac, &
- FBinB=is_local%wrap%FBImp(compatm,compocn), fnameB='Faxa_taux', wgtB=customwgt, rc=rc)
- if (ChkErr(rc,__LINE__,u_FILE_u)) return
- call med_merge_field(is_local%wrap%FBExp(compocn), 'Foxx_tauy', &
- FBinA=is_local%wrap%FBImp(compice,compocn), fnameA='Fioi_tauy', wgtA=ifrac, &
- FBinB=is_local%wrap%FBImp(compatm,compocn), fnameB='Faxa_tauy', wgtB=customwgt, rc=rc)
- if (ChkErr(rc,__LINE__,u_FILE_u)) return
- end if
-
- ! netsw_for_ocn = [downsw_from_atm*(1-ice_fraction)*(1-ocn_albedo)] + [pensw_from_ice*(ice_fraction)]
- customwgt(:) = ofrac(:) * (1.0_R8 - 0.06_R8)
- call med_merge_field(is_local%wrap%FBExp(compocn), 'Foxx_swnet_vdr', &
- FBinA=is_local%wrap%FBImp(compatm,compocn), fnameA='Faxa_swvdr' , wgtA=customwgt, &
- FBinB=is_local%wrap%FBImp(compice,compocn), fnameB='Fioi_swpen_vdr', wgtB=ifrac, rc=rc)
- if (ChkErr(rc,__LINE__,u_FILE_u)) return
- call med_merge_field(is_local%wrap%FBExp(compocn), 'Foxx_swnet_vdf', &
- FBinA=is_local%wrap%FBImp(compatm,compocn), fnameA='Faxa_swvdf' , wgtA=customwgt, &
- FBinB=is_local%wrap%FBImp(compice,compocn), fnameB='Fioi_swpen_vdf', wgtB=ifrac, rc=rc)
- if (ChkErr(rc,__LINE__,u_FILE_u)) return
- call med_merge_field(is_local%wrap%FBExp(compocn), 'Foxx_swnet_idr', &
- FBinA=is_local%wrap%FBImp(compatm,compocn), fnameA='Faxa_swndr' , wgtA=customwgt, &
- FBinB=is_local%wrap%FBImp(compice,compocn), fnameB='Fioi_swpen_idr', wgtB=ifrac, rc=rc)
- if (ChkErr(rc,__LINE__,u_FILE_u)) return
- call med_merge_field(is_local%wrap%FBExp(compocn), 'Foxx_swnet_idf', &
- FBinA=is_local%wrap%FBImp(compatm,compocn), fnameA='Faxa_swndf' , wgtA=customwgt, &
- FBinB=is_local%wrap%FBImp(compice,compocn), fnameB='Fioi_swpen_idf', wgtB=ifrac, rc=rc)
- if (ChkErr(rc,__LINE__,u_FILE_u)) return
-
- deallocate(customwgt)
-
- if (dbug_flag > 20) then
- call ESMF_LogWrite(trim(subname)//": done", ESMF_LOGMSG_INFO)
- end if
- call t_stopf('MED:'//subname)
-
- end subroutine med_phases_prep_ocn_custom_nems
+ end subroutine med_phases_prep_ocn_custom
end module med_phases_prep_ocn_mod
diff --git a/mediator/med_phases_prep_rof_mod.F90 b/mediator/med_phases_prep_rof_mod.F90
index 5d603a141..55b2dae82 100644
--- a/mediator/med_phases_prep_rof_mod.F90
+++ b/mediator/med_phases_prep_rof_mod.F90
@@ -23,6 +23,7 @@ module med_phases_prep_rof_mod
use med_methods_mod , only : fldbun_reset => med_methods_FB_reset
use med_methods_mod , only : fldbun_average => med_methods_FB_average
use med_methods_mod , only : field_getdata1d => med_methods_Field_getdata1d
+ use med_methods_mod , only : FB_check_for_nans => med_methods_FB_check_for_nans
use perf_mod , only : t_startf, t_stopf
implicit none
@@ -376,6 +377,10 @@ subroutine med_phases_prep_rof(gcomp, rc)
FBfrac=is_local%wrap%FBFrac(comprof), FBin=FBlndAccum2rof_r, fldListTo=fldList, rc=rc)
if (chkerr(rc,__LINE__,u_FILE_u)) return
+ ! Check for nans in fields export to rof
+ call FB_check_for_nans(is_local%wrap%FBExp(comprof), maintask, logunit, rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+
if (dbug_flag > 1) then
call fldbun_diagnose(is_local%wrap%FBExp(comprof), &
string=trim(subname)//' FBexp(comprof) ', rc=rc)
diff --git a/mediator/med_phases_prep_wav_mod.F90 b/mediator/med_phases_prep_wav_mod.F90
index 5fcb9ba7e..c690aa522 100644
--- a/mediator/med_phases_prep_wav_mod.F90
+++ b/mediator/med_phases_prep_wav_mod.F90
@@ -17,6 +17,7 @@ module med_phases_prep_wav_mod
use med_methods_mod , only : FB_average => med_methods_FB_average
use med_methods_mod , only : FB_copy => med_methods_FB_copy
use med_methods_mod , only : FB_reset => med_methods_FB_reset
+ use med_methods_mod , only : FB_check_for_nans => med_methods_FB_check_for_nans
use esmFlds , only : med_fldList_GetfldListTo
use med_internalstate_mod , only : compwav
use perf_mod , only : t_startf, t_stopf
@@ -176,6 +177,10 @@ subroutine med_phases_prep_wav_avg(gcomp, rc)
call FB_copy(is_local%wrap%FBExp(compwav), is_local%wrap%FBExpAccumWav, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
+ ! Check for nans in fields export to wav
+ call FB_check_for_nans(is_local%wrap%FBExp(compwav), maintask, logunit, rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+
! zero accumulator
is_local%wrap%ExpAccumWavCnt = 0
call FB_reset(is_local%wrap%FBExpAccumWav, value=czero, rc=rc)
diff --git a/mediator/med_phases_restart_mod.F90 b/mediator/med_phases_restart_mod.F90
index 6bf5f3466..a225ff97c 100644
--- a/mediator/med_phases_restart_mod.F90
+++ b/mediator/med_phases_restart_mod.F90
@@ -13,7 +13,7 @@ module med_phases_restart_mod
use med_phases_prep_glc_mod , only : FBlndAccum2glc_l, lndAccum2glc_cnt
use med_phases_prep_glc_mod , only : FBocnAccum2glc_o, ocnAccum2glc_cnt
use med_phases_prep_rof_mod , only : FBlndAccum2rof_l, lndAccum2rof_cnt
-
+ use pio , only : file_desc_t
implicit none
private
@@ -143,6 +143,7 @@ subroutine med_phases_restart_write(gcomp, rc)
integer, intent(out) :: rc
! local variables
+ type(file_desc_t) :: io_file
type(ESMF_VM) :: vm
type(ESMF_Clock) :: clock
type(ESMF_Time) :: starttime
@@ -309,11 +310,12 @@ subroutine med_phases_restart_write(gcomp, rc)
call ESMF_LogWrite(trim(subname)//": write "//trim(restart_file), ESMF_LOGMSG_INFO)
call ESMF_GridCompGet(gcomp, vm=vm, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
- call med_io_wopen(restart_file, vm, clobber=.true.)
+ call med_io_wopen(restart_file, io_file, vm, rc, clobber=.true.)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
do m = 1,2
if (m == 2) then
- call med_io_enddef(restart_file)
+ call med_io_enddef(io_file)
end if
tbnds = days_since
@@ -321,23 +323,23 @@ subroutine med_phases_restart_write(gcomp, rc)
if (whead(m)) then
call ESMF_ClockGet(clock, calendar=calendar, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
- call med_io_define_time(time_units, calendar, rc=rc)
+ call med_io_define_time(io_file, time_units, calendar, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
else
- call med_io_write_time(days_since, tbnds=(/days_since,days_since/), nt=1, rc=rc)
+ call med_io_write_time(io_file, days_since, tbnds=(/days_since,days_since/), nt=1, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
end if
! Write out next ymd/tod in place of curr ymd/tod because the
! restart represents the time at end of the current timestep
! and that is where we want to start the next run.
- call med_io_write(restart_file, start_ymd, 'start_ymd', whead(m), wdata(m), rc=rc)
+ call med_io_write(io_file, start_ymd, 'start_ymd', whead(m), wdata(m), rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
- call med_io_write(restart_file, start_tod, 'start_tod', whead(m), wdata(m), rc=rc)
+ call med_io_write(io_file, start_tod, 'start_tod', whead(m), wdata(m), rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
- call med_io_write(restart_file, next_ymd , 'curr_ymd' , whead(m), wdata(m), rc=rc)
+ call med_io_write(io_file, next_ymd , 'curr_ymd' , whead(m), wdata(m), rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
- call med_io_write(restart_file, next_tod , 'curr_tod' , whead(m), wdata(m), rc=rc)
+ call med_io_write(io_file, next_tod , 'curr_tod' , whead(m), wdata(m), rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
do n = 1,ncomps
@@ -346,19 +348,19 @@ subroutine med_phases_restart_write(gcomp, rc)
ny = is_local%wrap%ny(n)
! Write import field bundles
if (ESMF_FieldBundleIsCreated(is_local%wrap%FBimp(n,n),rc=rc)) then
- call med_io_write(restart_file, is_local%wrap%FBimp(n,n), whead(m), wdata(m), nx, ny, &
+ call med_io_write(io_file, is_local%wrap%FBimp(n,n), whead(m), wdata(m), nx, ny, &
nt=1, pre=trim(compname(n))//'Imp', rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
endif
! Write export field bundles
if (ESMF_FieldBundleIsCreated(is_local%wrap%FBexp(n),rc=rc)) then
- call med_io_write(restart_file, is_local%wrap%FBexp(n), whead(m), wdata(m), nx, ny, &
+ call med_io_write(io_file, is_local%wrap%FBexp(n), whead(m), wdata(m), nx, ny, &
nt=1, pre=trim(compname(n))//'Exp', rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
endif
! Write fraction field bundles
if (ESMF_FieldBundleIsCreated(is_local%wrap%FBfrac(n),rc=rc)) then
- call med_io_write(restart_file, is_local%wrap%FBfrac(n), whead(m), wdata(m), nx, ny, &
+ call med_io_write(io_file, is_local%wrap%FBfrac(n), whead(m), wdata(m), nx, ny, &
nt=1, pre=trim(compname(n))//'Frac', rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
endif
@@ -369,10 +371,10 @@ subroutine med_phases_restart_write(gcomp, rc)
if (ESMF_FieldBundleIsCreated(is_local%wrap%FBExpAccumOcn)) then
nx = is_local%wrap%nx(compocn)
ny = is_local%wrap%ny(compocn)
- call med_io_write(restart_file, is_local%wrap%FBExpAccumOcn, whead(m), wdata(m), nx, ny, &
+ call med_io_write(io_file, is_local%wrap%FBExpAccumOcn, whead(m), wdata(m), nx, ny, &
nt=1, pre='ocnExpAccum', rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
- call med_io_write(restart_file, is_local%wrap%ExpAccumOcnCnt, 'ocnExpAccum_cnt', whead(m), wdata(m), rc=rc)
+ call med_io_write(io_file, is_local%wrap%ExpAccumOcnCnt, 'ocnExpAccum_cnt', whead(m), wdata(m), rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
endif
@@ -380,10 +382,10 @@ subroutine med_phases_restart_write(gcomp, rc)
if (ESMF_FieldBundleIsCreated(is_local%wrap%FBExpAccumWav)) then
nx = is_local%wrap%nx(compwav)
ny = is_local%wrap%ny(compwav)
- call med_io_write(restart_file, is_local%wrap%FBExpAccumWav, whead(m), wdata(m), nx, ny, &
+ call med_io_write(io_file, is_local%wrap%FBExpAccumWav, whead(m), wdata(m), nx, ny, &
nt=1, pre='wavExpAccum', rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
- call med_io_write(restart_file, is_local%wrap%ExpAccumWavCnt, 'wavExpAccum_cnt', whead(m), wdata(m), rc=rc)
+ call med_io_write(io_file, is_local%wrap%ExpAccumWavCnt, 'wavExpAccum_cnt', whead(m), wdata(m), rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
endif
@@ -391,10 +393,10 @@ subroutine med_phases_restart_write(gcomp, rc)
if (ESMF_FieldBundleIsCreated(FBlndAccum2rof_l)) then
nx = is_local%wrap%nx(complnd)
ny = is_local%wrap%ny(complnd)
- call med_io_write(restart_file, FBlndAccum2rof_l, whead(m), wdata(m), nx, ny, &
+ call med_io_write(io_file, FBlndAccum2rof_l, whead(m), wdata(m), nx, ny, &
nt=1, pre='lndImpAccum2rof', rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
- call med_io_write(restart_file, lndAccum2rof_cnt, 'lndImpAccum2rof_cnt', whead(m), wdata(m), rc=rc)
+ call med_io_write(io_file, lndAccum2rof_cnt, 'lndImpAccum2rof_cnt', whead(m), wdata(m), rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
end if
@@ -402,10 +404,10 @@ subroutine med_phases_restart_write(gcomp, rc)
if (ESMF_FieldBundleIsCreated(FBlndAccum2glc_l)) then
nx = is_local%wrap%nx(complnd)
ny = is_local%wrap%ny(complnd)
- call med_io_write(restart_file, FBlndAccum2glc_l, whead(m), wdata(m), nx, ny, &
+ call med_io_write(io_file, FBlndAccum2glc_l, whead(m), wdata(m), nx, ny, &
nt=1, pre='lndImpAccum2glc', rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
- call med_io_write(restart_file, lndAccum2glc_cnt, 'lndImpAccum2glc_cnt', whead(m), wdata(m), rc=rc)
+ call med_io_write(io_file, lndAccum2glc_cnt, 'lndImpAccum2glc_cnt', whead(m), wdata(m), rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
end if
@@ -413,10 +415,10 @@ subroutine med_phases_restart_write(gcomp, rc)
if (ESMF_FieldBundleIsCreated(FBocnAccum2glc_o)) then
nx = is_local%wrap%nx(compocn)
ny = is_local%wrap%ny(compocn)
- call med_io_write(restart_file, FBocnAccum2glc_o, whead(m), wdata(m), nx, ny, &
+ call med_io_write(io_file, FBocnAccum2glc_o, whead(m), wdata(m), nx, ny, &
nt=1, pre='ocnImpAccum2glc_o', rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
- call med_io_write(restart_file, ocnAccum2glc_cnt, 'ocnImpAccum2glc_cnt', whead(m), wdata(m), rc=rc)
+ call med_io_write(io_file, ocnAccum2glc_cnt, 'ocnImpAccum2glc_cnt', whead(m), wdata(m), rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
end if
@@ -424,7 +426,7 @@ subroutine med_phases_restart_write(gcomp, rc)
if (ESMF_FieldBundleIsCreated(is_local%wrap%FBMed_ocnalb_o,rc=rc)) then
nx = is_local%wrap%nx(compocn)
ny = is_local%wrap%ny(compocn)
- call med_io_write(restart_file, is_local%wrap%FBMed_ocnalb_o, whead(m), wdata(m), nx, ny, &
+ call med_io_write(io_file, is_local%wrap%FBMed_ocnalb_o, whead(m), wdata(m), nx, ny, &
nt=1, pre='MedOcnAlb_o', rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
end if
@@ -437,11 +439,11 @@ subroutine med_phases_restart_write(gcomp, rc)
if (auxcomp(nc)%files(nf)%doavg .and. auxcomp(nc)%files(nf)%accumcnt > 0) then
nx = is_local%wrap%nx(nc)
ny = is_local%wrap%ny(nc)
- call med_io_write(restart_file, auxcomp(nc)%files(nf)%FBaccum, &
+ call med_io_write(io_file, auxcomp(nc)%files(nf)%FBaccum, &
whead(m), wdata(m), nx, ny, &
nt=1, pre=trim(compname(nc))//trim(auxcomp(nc)%files(nf)%auxname), rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
- call med_io_write(restart_file, auxcomp(nc)%files(nf)%accumcnt, &
+ call med_io_write(io_file, auxcomp(nc)%files(nf)%accumcnt, &
trim(compname(nc))//trim(auxcomp(nc)%files(nf)%auxname)//'_accumcnt', &
whead(m), wdata(m), rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
@@ -452,7 +454,7 @@ subroutine med_phases_restart_write(gcomp, rc)
enddo ! end of whead/wdata loop
! Close file
- call med_io_close(restart_file, vm, rc=rc)
+ call med_io_close(io_file, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
endif
diff --git a/ufs/ccpp/data/MED_typedefs.F90 b/ufs/ccpp/data/MED_typedefs.F90
index 1b2ce51c5..e5e1b494f 100644
--- a/ufs/ccpp/data/MED_typedefs.F90
+++ b/ufs/ccpp/data/MED_typedefs.F90
@@ -4,9 +4,9 @@ module MED_typedefs
!! \htmlinclude MED_typedefs.html
!!
use machine, only: kind_phys
- use physcons, only: con_hvap, con_cp, con_rd, con_eps
+ use physcons, only: con_hvap, con_cp, con_rd, con_eps, con_rocp
use physcons, only: con_epsm1, con_fvirt, con_g
- use physcons, only: con_tice
+ use physcons, only: con_tice, karman
implicit none
@@ -68,7 +68,9 @@ module MED_typedefs
real(kind=kind_phys), pointer :: fm10_water(:) => null() !< Monin-Obukhov similarity parameter for momentum at 10m over water
real(kind=kind_phys), pointer :: prslki(:) => null() !< Exner function ratio bt midlayer and interface at 1st layer
logical, pointer :: wet(:) => null() !< flag indicating presence of some ocean or lake surface area fraction
- logical, pointer :: use_flake(:) => null() !< flag indicating lake points using flake model
+ integer, pointer :: use_lake_model(:)=>null() !< 0 for points that don't use a lake model, lkm for points that do
+ real (kind=kind_phys),pointer :: lake_t2m (:) => null() !< 2 meter temperature from CLM Lake model
+ real (kind=kind_phys),pointer :: lake_q2m (:) => null() !< 2 meter humidity from CLM Lake model
real(kind=kind_phys), pointer :: wind(:) => null() !< wind speed at lowest model level (m/s)
logical, pointer :: flag_iter(:) => null() !< flag for iteration
real(kind=kind_phys), pointer :: qss_water(:) => null() !< surface air saturation specific humidity over water (kg/kg)
@@ -172,7 +174,7 @@ module MED_typedefs
integer :: sfc_z0_type !< surface roughness options over water
logical :: thsfc_loc !< flag for reference pressure in theta calculation
integer :: nstf_name(5) !< NSSTM flag: off/uncoupled/coupled=0/1/2
- integer :: lkm !< flag for flake model
+ integer :: lkm !< 0 = no lake model, 1 = lake model, 2 = lake & nsst on lake points
logical :: first_time_step !< flag signaling first time step for time integration routine
logical :: frac_grid !< flag for fractional grid
logical :: cplwav2atm !< default no wav->atm coupling
@@ -189,6 +191,16 @@ module MED_typedefs
integer :: lsoil !< number of soil layers
integer :: kice !< vertical loop extent for ice levels, start at 1
integer :: lsm_ruc !< flag for RUC land surface model
+
+ ! Lake variables
+ logical :: frac_ice = .false. !< flag for fractional ice when fractional grid is not in use
+ logical :: use_lake2m = .false. !< use 2m T & Q calculated by the lake model
+ integer :: iopt_lake = 1 !< =1 flake, =2 clm lake
+ integer :: iopt_lake_flake = 1
+ integer :: iopt_lake_clm = 2
+
+ logical :: diag_flux !< flag for flux method of 2-m diagnostics
+ logical :: diag_log !< flag for log 2-m diagnostics
contains
procedure :: init => control_initialize
end type MED_control_type
@@ -208,6 +220,8 @@ module MED_typedefs
!!
type MED_grid_type
real(kind=kind_phys), pointer :: area(:) => null() !< area of the grid cell
+ real(kind=kind_phys), pointer :: xlat_d(:) => null() !< latitude in degrees
+ real(kind=kind_phys), pointer :: xlon_d(:) => null() !< longtitude in degrees
contains
procedure :: create => grid_create !< allocate array data
end type MED_grid_type
@@ -259,6 +273,7 @@ module MED_typedefs
type MED_diag_type
real(kind=kind_phys), pointer :: chh(:) => null() !< thermal exchange coefficient (kg m-2 s-1)
real(kind=kind_phys), pointer :: cmm(:) => null() !< momentum exchange coefficient (m/s)
+ real(kind=kind_phys), pointer :: dpt2m(:) => null() !< 2-m dewpoint (K)
contains
procedure :: create => diag_create !< allocate array data
end type MED_diag_type
@@ -343,8 +358,12 @@ subroutine interstitial_create(interstitial, im)
interstitial%prslki = clear_val
allocate(interstitial%wet(im))
interstitial%wet = .false.
- allocate(interstitial%use_flake(im))
- interstitial%use_flake = .false.
+ allocate(interstitial%use_lake_model(im))
+ interstitial%use_lake_model = 0
+ allocate(interstitial%lake_t2m(im))
+ interstitial%lake_t2m=-9999
+ allocate(interstitial%lake_q2m(im))
+ interstitial%lake_q2m=-9999
allocate(interstitial%wind(im))
interstitial%wind = huge
allocate(interstitial%flag_iter(im))
@@ -591,7 +610,9 @@ subroutine interstitial_phys_reset(interstitial)
interstitial%tsurf_ice = huge
interstitial%tsurf_land = huge
interstitial%tsurf_water = huge
- interstitial%use_flake = .false.
+ interstitial%use_lake_model = 0
+ interstitial%lake_t2m = -9999
+ interstitial%lake_q2m = -9999
interstitial%uustar_ice = huge
interstitial%uustar_land = huge
interstitial%uustar_water = huge
@@ -636,6 +657,13 @@ subroutine control_initialize(model)
model%lsoil = 4
model%kice = 2
model%lsm_ruc = 3
+ model%frac_ice = .false.
+ model%use_lake2m = .false.
+ model%iopt_lake = 1
+ model%iopt_lake_flake = 1
+ model%iopt_lake_clm = 2
+ model%diag_flux = .false.
+ model%diag_log = .false.
end subroutine control_initialize
@@ -658,6 +686,10 @@ subroutine grid_create(grid, im)
allocate(grid%area(im))
grid%area = clear_val
+ allocate(grid%xlat_d(im))
+ grid%xlat_d = clear_val
+ allocate(grid%xlon_d(im))
+ grid%xlon_d = clear_val
end subroutine grid_create
@@ -745,6 +777,8 @@ subroutine diag_create(diag, im)
diag%chh = clear_val
allocate(diag%cmm(im))
diag%cmm = clear_val
+ allocate(diag%dpt2m(im))
+ diag%dpt2m = clear_val
end subroutine diag_create
diff --git a/ufs/ccpp/data/MED_typedefs.meta b/ufs/ccpp/data/MED_typedefs.meta
index 8177ae5ca..271110e9c 100644
--- a/ufs/ccpp/data/MED_typedefs.meta
+++ b/ufs/ccpp/data/MED_typedefs.meta
@@ -202,12 +202,28 @@
units = flag
dimensions = (horizontal_loop_extent)
type = logical
-[use_flake]
- standard_name = flag_for_using_flake
- long_name = flag indicating lake points using flake model
+[lake_t2m]
+ standard_name = temperature_at_2m_from_clm_lake
+ long_name = temperature at 2m from clm lake
+ units = K
+ dimensions = (horizontal_loop_extent)
+ type = real
+ kind = kind_phys
+ active = (control_for_lake_model_selection == 2)
+[lake_q2m]
+ standard_name = specific_humidity_at_2m_from_clm_lake
+ long_name = specific humidity at 2m from clm lake
+ units = frac
+ dimensions = (horizontal_loop_extent)
+ type = real
+ kind = kind_phys
+ active = (control_for_lake_model_selection == 2)
+[use_lake_model]
+ standard_name = flag_for_using_lake_model
+ long_name = flag indicating lake points using a lake model
units = flag
dimensions = (horizontal_loop_extent)
- type = logical
+ type = integer
[wind]
standard_name = wind_speed_at_lowest_model_layer
long_name = wind speed at lowest model level
@@ -817,9 +833,33 @@
units = flag
dimensions = ()
type = integer
+[iopt_lake]
+ standard_name = control_for_lake_model_selection
+ long_name = control for lake model selection
+ units = 1
+ dimensions = ()
+ type = integer
+[iopt_lake_flake]
+ standard_name = flake_model_control_selection_value
+ long_name = value that indicates flake model in the control for lake model selection
+ units = 1
+ dimensions = ()
+ type = integer
+[iopt_lake_clm]
+ standard_name = clm_lake_model_control_selection_value
+ long_name = value that indicates clm lake model in the control for lake model selection
+ units = 1
+ dimensions = ()
+ type = integer
+[use_lake2m]
+ standard_name = use_2m_diagnostics_calculated_by_lake_model
+ long_name = model 2m diagnostics use the temperature and humidity calculated by the lake model
+ units = flag
+ dimensions = ()
+ type = integer
[lkm]
- standard_name = control_for_lake_surface_scheme
- long_name = flag for lake surface model
+ standard_name = control_for_lake_model_execution_method
+ long_name = control for lake model execution: 0=no lake, 1=lake, 2=lake+nsst
units = flag
dimensions = ()
type = integer
@@ -835,6 +875,12 @@
units = flag
dimensions = ()
type = logical
+[frac_ice]
+ standard_name = flag_for_fractional_ice_when_fractional_landmask_is_disabled
+ long_name = flag for fractional ice when fractional landmask is disabled
+ units = flag
+ dimensions = ()
+ type = logical
[cplwav2atm]
standard_name = flag_for_one_way_ocean_wave_coupling_to_atmosphere
long_name = flag controlling ocean wave coupling to the atmosphere (default off)
@@ -924,6 +970,18 @@
units = flag
dimensions = ()
type = integer
+[diag_flux]
+ standard_name = flag_for_flux_method_in_2m_diagnostics
+ long_name = flag for flux method in 2-m diagnostics
+ units = flag
+ dimensions = ()
+ type = logical
+[diag_log]
+ standard_name = flag_for_log_method_in_2m_diagnostics
+ long_name = flag for log method in 2-m diagnostics
+ units = flag
+ dimensions = ()
+ type = logical
########################################################################
[ccpp-table-properties]
@@ -964,6 +1022,20 @@
dimensions = (horizontal_loop_extent)
type = real
kind = kind_phys
+[xlat_d]
+ standard_name = latitude_in_degree
+ long_name = latitude in degree north
+ units = degree_north
+ dimensions = (horizontal_loop_extent)
+ type = real
+ kind = kind_phys
+[xlon_d]
+ standard_name = longitude_in_degree
+ long_name = longitude in degree east
+ units = degree_east
+ dimensions = (horizontal_loop_extent)
+ type = real
+ kind = kind_phys
########################################################################
[ccpp-table-properties]
@@ -1228,6 +1300,13 @@
dimensions = (horizontal_loop_extent)
type = real
kind = kind_phys
+[dpt2m]
+ standard_name = dewpoint_temperature_at_2m
+ long_name = 2 meter dewpoint temperature
+ units = K
+ dimensions = (horizontal_loop_extent)
+ type = real
+ kind = kind_phys
########################################################################
[ccpp-table-properties]
@@ -1343,3 +1422,17 @@
dimensions = ()
type = real
kind = kind_phys
+[con_rocp]
+ standard_name = ratio_of_gas_constant_dry_air_to_specific_heat_of_dry_air_at_constant_pressure
+ long_name = (rd/cp)
+ units = none
+ dimensions = ()
+ type = real
+ kind = kind_phys
+[karman]
+ standard_name = von_karman_constant
+ long_name = von karman constant
+ units = none
+ dimensions = ()
+ type = real
+