From 2212b7632349c7ff3657694e76e665c0c4989580 Mon Sep 17 00:00:00 2001 From: rem1776 Date: Tue, 2 Jul 2024 14:02:54 -0400 Subject: [PATCH 1/6] fix linter action and any whitespace that snuck in --- .github/workflows/lint.yml | 2 +- full/atmos_ocean_fluxes_calc.F90 | 2 +- full/earth_system_model.pdf | Bin 112975 -> 112912 bytes shared/surface_flux.F90 | 22 +++++++++++----------- simple/coupler_main.F90 | 2 +- simple/flux_exchange.F90 | 2 +- simple/ice_model.F90 | 10 +++++----- t/null_model_build.sh | 16 ++++++++-------- 8 files changed, 28 insertions(+), 28 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index c186dc1e..5dc2634e 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -9,4 +9,4 @@ jobs: - name: Checkout code uses: actions/checkout@v2 - name: Run linter - uses: NOAA-GFDL/simple_lint@v2 + uses: NOAA-GFDL/simple_lint@f5aa1fe976bd4c231db0536ba00cbfdc26708253 diff --git a/full/atmos_ocean_fluxes_calc.F90 b/full/atmos_ocean_fluxes_calc.F90 index d62d404e..d551ecd5 100644 --- a/full/atmos_ocean_fluxes_calc.F90 +++ b/full/atmos_ocean_fluxes_calc.F90 @@ -18,7 +18,7 @@ !* If not, see . !*********************************************************************** !> \file -!> \brief Calculates gas fluxes for atmosphere and ocean +!> \brief Calculates gas fluxes for atmosphere and ocean module atmos_ocean_fluxes_calc_mod use FMS diff --git a/full/earth_system_model.pdf b/full/earth_system_model.pdf index 3aa2e3e29273083c135fee48eade6726a6b4ba09..562b712d50466fec6aba09c39495e21c4acb6b09 100644 GIT binary patch delta 1163 zcmZWoJ5EC}5L6_Tf>WePzdzf%_uvvp2q`Cc1s8ydBS3?Mk|OjRfRoUqrD6RbN<498 zjdr{6+%#NZM+?t?vIJA`yU`$pC6( zBa!ncVHFo0p{P>wt*Q4swrnAFEMulXCOP?q3Tb70pN#`mI2%AbnJ^<$1dwG(^)WBiuBkr~v0 znN>7B|2B^6C!& delta 1176 zcmZWoJ5Iwu6qF@|1Rdf67E%f--fz8c@4+!pt`H$E0F{rBf(F7b1sw<(aC*V0D zwlm%)(RgM(Z|3=abNszIep=3|`eivgx{061hp)Oixtp&(=Bw(rx~xxWdooF`xBu$- z9wQRzvG(@0I$!J`Wip_19HpMVzm}5%RvJkLST524kD1CuyC5e=F=fdKE@a~}G2?8A zu?h1;tAaey%<%c|^+p~2a8kNQj29K{P1c#w@Sa!gegkZ+*%f^5@%we1Pf;sj8FXS|8ru|%3*MGC~ B>aYL+ diff --git a/shared/surface_flux.F90 b/shared/surface_flux.F90 index 531dfafe..16036c0f 100644 --- a/shared/surface_flux.F90 +++ b/shared/surface_flux.F90 @@ -17,7 +17,7 @@ !* License along with FMS Coupler. !* If not, see . !*********************************************************************** -!> \file +!> \file !> \brief Handles calculation of fluxes on the exchange grids, see module page for more information !> \page surface_flux_config Surface Flux Configuration @@ -117,7 +117,7 @@ module surface_flux_mod use FMS use FMSconstants, only: cp_air, hlv, stefan, rdgas, rvgas, grav, vonkarm -use ocean_rough_mod, only: cal_z0_hwrf17, cal_zt_hwrf17, read_ocean_rough_scheme +use ocean_rough_mod, only: cal_z0_hwrf17, cal_zt_hwrf17, read_ocean_rough_scheme use constants_mod, only: vonkarm use fms_mod, only: mpp_pe, mpp_root_pe, stdout @@ -177,9 +177,9 @@ module surface_flux_mod !! heat. This option is available for legacy purposes, and is not recommended for !! new experiments. logical :: ncar_ocean_flux_multilevel = .false. !< Use NCAR climate model turbulent flux calculation described by Large and Yeager, allows for different reference height for wind, temp and spec. hum. -logical :: do_iter_monin_obukhov = .false. !< If .TRUE, call monin obukhov funtcions a couple of times to update - !! rough_mom, rough_heat, rough_moist, cd, ch, b_star, u_star -logical :: use_u10_neutral = .false. !< If .TRUE., use 10m neutral wind rather than the standard 10m wind +logical :: do_iter_monin_obukhov = .false. !< If .TRUE, call monin obukhov funtcions a couple of times to update + !! rough_mom, rough_heat, rough_moist, cd, ch, b_star, u_star +logical :: use_u10_neutral = .false. !< If .TRUE., use 10m neutral wind rather than the standard 10m wind !! to obtain rough_mom, rough_heat, rough_moist real :: bulk_zu = 10. !< Reference height for wind speed (meters) real :: bulk_zt = 10. !< Reference height for atm temperature (meters) @@ -727,14 +727,14 @@ subroutine surface_flux_init ! read rough_scheme_ocean from ocean_rough namelist ! Note that we should not use the variable 'rough_scheme' directly from ocean_rough, - ! because the intialization of ocean_rough is later than the surface_flux_init. + ! because the intialization of ocean_rough is later than the surface_flux_init. if (do_iter_monin_obukhov) then - call read_ocean_rough_scheme(rough_scheme_ocean) + call read_ocean_rough_scheme(rough_scheme_ocean) if (mpp_pe() == mpp_root_pe() ) then write (outunit,*) 'ocean roughness scheme: ', rough_scheme_ocean write (outunit,*) 'Warning: if ocean roughness scheme is not hwrf17, & iter_monin_obukhov_ocean is not effective' - endif + endif endif ! write version number @@ -1044,7 +1044,7 @@ subroutine iter_monin_obukhov_ocean ( & real , intent(in), dimension(:) :: & z_atm, & !< Height at the lowest atmospheric level - u_atm, & !< Zonal wind velocity at the lowest atmospheric level + u_atm, & !< Zonal wind velocity at the lowest atmospheric level v_atm, & !< Meridional wind velocity at the lowest atmospheric level w_atm, & !< Absolute wind at the lowest atmospheric level thv_atm, & !< Surface air theta_v @@ -1070,11 +1070,11 @@ subroutine iter_monin_obukhov_ocean ( & ! ---- local vars ----------------------------------------------------------- real, dimension(size(z_atm(:))) :: & flux_q, q_star, & - ref_u, ref_v, u10, del_m, del_h, del_q, & + ref_u, ref_v, u10, del_m, del_h, del_q, & rough_mom1, rough_heat1, rough_moist1 integer i, j - do i = 1, niter_monin_obukhov + do i = 1, niter_monin_obukhov do j = 1, size(avail) if (avail(j) .and. seawater(j)) then diff --git a/simple/coupler_main.F90 b/simple/coupler_main.F90 index ea9e2376..3c199ede 100644 --- a/simple/coupler_main.F90 +++ b/simple/coupler_main.F90 @@ -513,7 +513,7 @@ subroutine coupler_end call atmos_model_end (Atm) call land_model_end (Atmos_land_boundary, Land) call ice_model_end (Ice) - + call fms_diag_end (Time_atmos) #ifdef use_deprecated_io call fms_io_exit diff --git a/simple/flux_exchange.F90 b/simple/flux_exchange.F90 index e397926c..175c4890 100644 --- a/simple/flux_exchange.F90 +++ b/simple/flux_exchange.F90 @@ -1204,7 +1204,7 @@ subroutine surface_flux_2d ( & thv_atm, thv_surf, & cd_m, cd_t, cd_q real, intent(inout), dimension(:,:) :: q_surf, rough_mom, & - rough_heat, rough_moist + rough_heat, rough_moist real, intent(in) :: dt ! ---- local vars ----------------------------------------------------------- diff --git a/simple/ice_model.F90 b/simple/ice_model.F90 index b499ec4e..24a037fc 100644 --- a/simple/ice_model.F90 +++ b/simple/ice_model.F90 @@ -58,12 +58,12 @@ module ice_model_mod logical :: use_annual_sst = .false. character(len=64) :: ice_method = 'prognostic' ! none, uniform, or prognostic character(len=64) :: sst_method = 'specified' ! specified, uniform, or mixed_layer - ! Additional sst specifications: 'aqua_planet_#' test cases are derived - ! from the 2000 paper by Neale and Hoskins, 'A standard test for AGCMs including - ! their physical parameterizations: I. The proposal, Atmospheric Science Letters'. - ! The 'aqua_planet_1' testcase corresponds to the 'Control' SST test case and + ! Additional sst specifications: 'aqua_planet_#' test cases are derived + ! from the 2000 paper by Neale and Hoskins, 'A standard test for AGCMs including + ! their physical parameterizations: I. The proposal, Atmospheric Science Letters'. + ! The 'aqua_planet_1' testcase corresponds to the 'Control' SST test case and ! provides the pattern which is shifted for the subsequent cases. - ! The test cases Control, and aqua_planet_5N-aqua_planet_60N were documented and used + ! The test cases Control, and aqua_planet_5N-aqua_planet_60N were documented and used ! in Burnett et al., 2021, GRL, https://doi.org/10.1029/2020GL091980 ! aqua_planet_1 = Control profile ! aqua_planet_2 = Peaked diff --git a/t/null_model_build.sh b/t/null_model_build.sh index a19d95ec..328f84da 100755 --- a/t/null_model_build.sh +++ b/t/null_model_build.sh @@ -66,28 +66,28 @@ coupler_simple_test.x: coupler_simple/libcoupler_simple.a atmos/libatmos_null.a \$(LD) \$^ \$(LDFLAGS) -o \$@ \$(STATIC_LIBS) fms/libfms.a: FORCE -\$(MAKE) SRCROOT=\$(SRCROOT) BUILDROOT=\$(BUILDROOT) MK_TEMPLATE=\$(MK_TEMPLATE) --directory=fms \$(@F) +\$(MAKE) SRCROOT=\$(SRCROOT) BUILDROOT=\$(BUILDROOT) MK_TEMPLATE=\$(MK_TEMPLATE) --directory=fms \$(@F) ocean/libocean_null.a: fms/libfms.a FORCE -\$(MAKE) SRCROOT=\$(SRCROOT) BUILDROOT=\$(BUILDROOT) MK_TEMPLATE=\$(MK_TEMPLATE) --directory=ocean \$(@F) +\$(MAKE) SRCROOT=\$(SRCROOT) BUILDROOT=\$(BUILDROOT) MK_TEMPLATE=\$(MK_TEMPLATE) --directory=ocean \$(@F) atmos/libatmos_null.a: fms/libfms.a FORCE -\$(MAKE) SRCROOT=\$(SRCROOT) BUILDROOT=\$(BUILDROOT) MK_TEMPLATE=\$(MK_TEMPLATE) --directory=atmos \$(@F) +\$(MAKE) SRCROOT=\$(SRCROOT) BUILDROOT=\$(BUILDROOT) MK_TEMPLATE=\$(MK_TEMPLATE) --directory=atmos \$(@F) ice_param/libice_param.a: fms/libfms.a FORCE -\$(MAKE) SRCROOT=\$(SRCROOT) BUILDROOT=\$(BUILDROOT) MK_TEMPLATE=\$(MK_TEMPLATE) --directory=ice_param \$(@F) +\$(MAKE) SRCROOT=\$(SRCROOT) BUILDROOT=\$(BUILDROOT) MK_TEMPLATE=\$(MK_TEMPLATE) --directory=ice_param \$(@F) ice/libice_null.a: ocean/libocean_null.a ice_param/libice_param.a fms/libfms.a FORCE -\$(MAKE) SRCROOT=\$(SRCROOT) BUILDROOT=\$(BUILDROOT) MK_TEMPLATE=\$(MK_TEMPLATE) --directory=ice \$(@F) +\$(MAKE) SRCROOT=\$(SRCROOT) BUILDROOT=\$(BUILDROOT) MK_TEMPLATE=\$(MK_TEMPLATE) --directory=ice \$(@F) land/libland_null.a: fms/libfms.a FORCE -\$(MAKE) SRCROOT=\$(SRCROOT) BUILDROOT=\$(BUILDROOT) MK_TEMPLATE=\$(MK_TEMPLATE) --directory=land \$(@F) +\$(MAKE) SRCROOT=\$(SRCROOT) BUILDROOT=\$(BUILDROOT) MK_TEMPLATE=\$(MK_TEMPLATE) --directory=land \$(@F) coupler_full/libcoupler_full.a: atmos/libatmos_null.a ice/libice_null.a ice_param/libice_param.a ocean/libocean_null.a land/libland_null.a fms/libfms.a FORCE -\$(MAKE) SRCROOT=\$(SRCROOT) BUILDROOT=\$(BUILDROOT) MK_TEMPLATE=\$(MK_TEMPLATE) --directory=coupler_full \$(@F) +\$(MAKE) SRCROOT=\$(SRCROOT) BUILDROOT=\$(BUILDROOT) MK_TEMPLATE=\$(MK_TEMPLATE) --directory=coupler_full \$(@F) coupler_simple/libcoupler_simple.a: atmos/libatmos_null.a ice/libice_null.a ice_param/libice_param.a ocean/libocean_null.a land/libland_null.a fms/libfms.a FORCE -\$(MAKE) SRCROOT=\$(SRCROOT) BUILDROOT=\$(BUILDROOT) MK_TEMPLATE=\$(MK_TEMPLATE) --directory=coupler_simple \$(@F) +\$(MAKE) SRCROOT=\$(SRCROOT) BUILDROOT=\$(BUILDROOT) MK_TEMPLATE=\$(MK_TEMPLATE) --directory=coupler_simple \$(@F) FORCE: From 492df39dae88c9b36b7e11c8d77224d632c0629a Mon Sep 17 00:00:00 2001 From: rem1776 Date: Fri, 5 Jul 2024 10:53:37 -0400 Subject: [PATCH 2/6] fix any lines over length limit --- .github/workflows/build.yml | 4 +- .github/workflows/docs.yml | 2 +- CHANGELOG.md | 14 +-- SHiELD/coupler_main.F90 | 20 ++-- full/atm_land_ice_flux_exchange.F90 | 139 ++++++++++++++++----------- full/atmos_ocean_dep_fluxes_calc.F90 | 6 +- full/atmos_ocean_fluxes_calc.F90 | 3 +- full/coupler_main.F90 | 2 +- full/flux_exchange.F90 | 39 +++++--- full/full_coupler_mod.F90 | 4 +- full/ice_ocean_flux_exchange.F90 | 94 +++++++++++------- full/land_ice_flux_exchange.F90 | 7 +- shared/surface_flux.F90 | 75 +++++++++------ simple/coupler_main.F90 | 17 ++-- simple/flux_exchange.F90 | 12 ++- simple/ice_model.F90 | 69 ++++++------- 16 files changed, 294 insertions(+), 213 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8a768cfc..80d493ce 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -10,7 +10,7 @@ jobs: credentials: username: ${{ github.actor }} password: ${{ secrets.github_token }} - env: + env: CC: mpicc FC: mpif90 CPPFLAGS: '-I/usr/include -Duse_LARGEFILE -DMAXFIELDMETHODS_=500' @@ -19,5 +19,5 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v2 - - name: Run build test + - name: Run build test run: t/null_model_build.sh diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index bd0f0f62..095a0333 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -1,4 +1,4 @@ -name: FMScoupler update doxygen site +name: FMScoupler update doxygen site on: [release, workflow_dispatch] diff --git a/CHANGELOG.md b/CHANGELOG.md index 5abf2147..59dd3e7e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -94,13 +94,13 @@ sequential patch number (starting from `01`). ### Changed - Changes routine names used for constants in order to compile with recent constants changes to FMS ### Fixed -- FULL: Replaced a deprecated OpenMP routine causing warnings +- FULL: Replaced a deprecated OpenMP routine causing warnings - SIMPLE: Fixed a missing variable allocation that was causing failures with certain compilers ### Tag Commit Hashes 2022.02-alpha1 de3e3cbca349021a545a500f5ba1af6af22acfae 2022.02-alpha2 c23b6f3ff1f902adf1fa43f8a5c9d2307bd01106 -2022.02-beta1 2bb8f35e2f579e738b58c610c35ca9afd7e36358 +2022.02-beta1 2bb8f35e2f579e738b58c610c35ca9afd7e36358 ## [2022.01] - 2022-03-25 ### Added @@ -121,8 +121,8 @@ sequential patch number (starting from `01`). ### Added - FMS2_IO was implemented to the full coupler: - The coupler restart files are now read with fms2_io's ascii_read - - Ascii writes are now done with fortran's open, close, and write. They are wrapped in an if, so that only the root pe does the io, newunit ensures that the unit number is unique for each file. - - The variables named `unit` have been renamed to avoid fortran conflicts. + - Ascii writes are now done with fortran's open, close, and write. They are wrapped in an if, so that only the root pe does the io, newunit ensures that the unit number is unique for each file. + - The variables named `unit` have been renamed to avoid fortran conflicts. - The coupler type restarts are now written with fms2_io. - The grid file is now read with fms2_io in: full/flux_exchange.F90:check_atm_grid - FMS2_IO was implemented to the simple coupler: @@ -130,7 +130,7 @@ sequential patch number (starting from `01`). - Removed the native formatted restart file code - Fms2_io ascii_read is used to read to the coupler_restart - Fotran's `open`, `close`, and `write` are used to write the coupler_restart - - Removed the read_grid_data and get_grid_size subroutines from simple/ice_model.F90. These are never used. + - Removed the read_grid_data and get_grid_size subroutines from simple/ice_model.F90. These are never used. - Test cases added for varying the latitude of SST maximum in the simple coupler ice model. ### Changed - Changes all imports from FMS to use the global `FMS` module and the `FMSconstants` module @@ -155,7 +155,7 @@ sequential patch number (starting from `01`). were written by default. - FMS2_io does not do this. Users can specify real long_names and units by calling register_variable_attribute. ### Removed -- FMS_io was almost completely removed from FMScoupler and replaced with fms2_io. +- FMS_io was almost completely removed from FMScoupler and replaced with fms2_io. ### Tag Commit Hashes - 2021.02-alpha1 (c1c8044a6c3efb8ddbbd01a3769bbf2610b34937) - 2021.02-alpha2 (c1c8044a6c3efb8ddbbd01a3769bbf2610b34937) @@ -168,7 +168,7 @@ sequential patch number (starting from `01`). - SURFACE_FLUX: Adds a new functionality to enable using NCAR surface fluxes in experiments ### Fixed -- SIMPLE_COUPLER: Fixed issue with simpler coupler not calling data_override_init during initialization, will now call if the data_table file exists +- SIMPLE_COUPLER: Fixed issue with simpler coupler not calling data_override_init during initialization, will now call if the data_table file exists ## Tag Commit Hashes - 2021.01-beta1 (7e7212c6db62aa7916af0f6ada59c5a83355c1b8) diff --git a/SHiELD/coupler_main.F90 b/SHiELD/coupler_main.F90 index d29ff504..1b1a0474 100644 --- a/SHiELD/coupler_main.F90 +++ b/SHiELD/coupler_main.F90 @@ -70,15 +70,16 @@ program coupler_main ! ----- namelist ----- integer, dimension(6) :: current_date = (/ 0, 0, 0, 0, 0, 0 /) !< The date that the current integration starts with - character(len=17) :: calendar = ' ' !< The calendar type used by the current integration. Valid values are - !! consistent with the time_manager module: 'gregorian', 'julian', - !! 'noleap', or 'thirty_day'. The value 'no_calendar' cannot be used - !! because the time_manager's date !! functions are used. + character(len=17) :: calendar = ' ' !< The calendar type used by the current integration. + !! Valid values are consistent with the time_manager module: + !! 'gregorian', 'julian', 'noleap', or 'thirty_day'. The value + !! 'no_calendar' cannot be used + !! because the time_manager's date functions are used. !! All values must be lower case. - logical :: force_date_from_namelist = .false. !< Flag that determines whether the namelist variable current_date should override - !! the date in the restart file `INPUT/coupler.res`. If the restart file does not - !! exist then force_date_from_namelist has no effect, the value of current_date - !! will be used. + logical :: force_date_from_namelist = .false. !< Flag that determines whether the namelist variable current_date + !! should override the date in the restart file `INPUT/coupler.res`. + !! If the restart file does not exist then force_date_from_namelist + !! has no effect, the value of current_date will be used. integer :: years=0 !< Number of years the current integration will be run integer :: months=0 !< Number of months the current integration will be run integer :: days=0 !< Number of days the current integration will be run @@ -322,7 +323,8 @@ subroutine coupler_init !----------------------------------------------------------------------- !----- write time stamps (for start time and end time) ------ - if ( fms_mpp_pe().EQ.fms_mpp_root_pe() ) open(newunit = time_stamp_unit, file='time_stamp.out', status='replace', form='formatted') + if ( fms_mpp_pe().EQ.fms_mpp_root_pe() ) + open(newunit = time_stamp_unit, file='time_stamp.out', status='replace', form='formatted') month = fms_time_manager_month_name(date(2)) if ( fms_mpp_pe() == fms_mpp_root_pe() ) write (time_stamp_unit,20) date, month(1:3) diff --git a/full/atm_land_ice_flux_exchange.F90 b/full/atm_land_ice_flux_exchange.F90 index 5cda7b4d..62081e36 100644 --- a/full/atm_land_ice_flux_exchange.F90 +++ b/full/atm_land_ice_flux_exchange.F90 @@ -146,14 +146,15 @@ module atm_land_ice_flux_exchange_mod real, allocatable, dimension(:,:) :: frac_precip !--- the following is from flux_exchange_nml - real :: z_ref_heat = 2. !< Reference height (meters) for temperature and relative humidity diagnostics (t_ref, rh_ref, del_h, del_q) + real :: z_ref_heat = 2. !< Reference height (meters) for temperature and relative humidity diagnostics + !! (t_ref, rh_ref, del_h, del_q) real :: z_ref_mom = 10. !< Reference height (meters) for mementum diagnostics (u_ref, v_ref, del_m) logical :: do_area_weighted_flux = .FALSE. logical :: do_forecast = .false. integer :: nblocks = 1 - logical :: partition_fprec_from_lprec = .FALSE. !< option for ATM override experiments where liquid+frozen precip are combined - !! This option will convert liquid precip to snow when t_ref is less than - !! tfreeze parameter + logical :: partition_fprec_from_lprec = .FALSE. !< option for ATM override experiments where liquid+frozen + !! precip are combined. This option will convert liquid precip to snow + !! when t_ref is less than tfreeze parameter logical :: scale_precip_2d = .false. integer :: my_nblocks = 1 @@ -290,9 +291,12 @@ subroutine atm_land_ice_flux_exchange_init(Time, Atm, Land, Ice, atmos_ice_bound type(atmos_data_type), intent(inout) :: Atm !< A derived data type to specify atmosphere boundary data type(land_data_type), intent(in) :: Land !< A derived data type to specify land boundary data type(ice_data_type), intent(inout) :: Ice !< A derived data type to specify ice boundary data - type(atmos_ice_boundary_type), intent(inout) :: atmos_ice_boundary !< A derived data type to specify properties and fluxes passed from atmosphere to ice - type(land_ice_atmos_boundary_type),intent(inout) :: land_ice_atmos_boundary !< A derived data type to specify properties and fluxes passed from exchange grid to - !! the atmosphere, land and ice + type(atmos_ice_boundary_type), intent(inout) :: atmos_ice_boundary !< A derived data type to specify properties + !! and fluxes passed from atmosphere to ice + type(land_ice_atmos_boundary_type),intent(inout) :: land_ice_atmos_boundary !< A derived data type to specify + !! properties and fluxes passed from + !! exchange grid to the atmosphere, land + !! and ice real, intent(in) :: Dt_atm_in !< Atmosphere time step in seconds real, intent(in) :: Dt_cpl_in !< Coupled time step in seconds real, intent(in) :: z_ref_heat_in, z_ref_mom_in @@ -658,8 +662,9 @@ subroutine sfc_boundary_layer ( dt, Time, Atm, Land, Ice, Land_Ice_Atmos_Boundar type(atmos_data_type), intent(inout) :: Atm !< A derived data type to specify atmosphere boundary data type(land_data_type), intent(inout) :: Land !< A derived data type to specify land boundary data type(ice_data_type), intent(inout) :: Ice !< A derived data type to specify ice boundary data - type(land_ice_atmos_boundary_type), intent(inout) :: Land_Ice_Atmos_Boundary !< A derived data type to specify properties and - !! fluxes passed from exchange grid to the atmosphere, + type(land_ice_atmos_boundary_type), intent(inout) :: Land_Ice_Atmos_Boundary !< A derived data type to specify + !! properties and fluxes passed from + !! exchange grid to the atmosphere, !! land and ice ! ---- local vars ---------------------------------------------------------- @@ -889,12 +894,16 @@ subroutine sfc_boundary_layer ( dt, Time, Atm, Land, Ice, Land_Ice_Atmos_Boundar atm%fields%bc(n)%field(m)%values, Time, override = atm%fields%bc(n)%field(m)%override) ex_gas_fields_atm%bc(n)%field(m)%override = atm%fields%bc(n)%field(m)%override ! 2017/08/08 jgj add co2_flux_pcair_atm diagnostic - if ( atm%fields%bc(n)%field(m)%override .and. fms_mpp_lowercase(trim(atm%fields%bc(n)%field(m)%name)) .eq. 'co2_flux_pcair_atm') then - if( id_co2_flux_pcair_atm > 0 ) used = fms_diag_send_data ( id_co2_flux_pcair_atm, atm%fields%bc(n)%field(m)%values, Time ) + if ( atm%fields%bc(n)%field(m)%override .and. & + fms_mpp_lowercase(trim(atm%fields%bc(n)%field(m)%name)) .eq. 'co2_flux_pcair_atm') then + if( id_co2_flux_pcair_atm > 0 ) & + used = fms_diag_send_data ( id_co2_flux_pcair_atm, atm%fields%bc(n)%field(m)%values, Time ) endif ! 2017/08/15 jgj add o2_flux_pcair_atm diagnostic - if ( atm%fields%bc(n)%field(m)%override .and. fms_mpp_lowercase(trim(atm%fields%bc(n)%field(m)%name)) .eq. 'o2_flux_pcair_atm') then - if( id_o2_flux_pcair_atm > 0 ) used = fms_diag_send_data ( id_o2_flux_pcair_atm, atm%fields%bc(n)%field(m)%values, Time ) + if ( atm%fields%bc(n)%field(m)%override .and. & + fms_mpp_lowercase(trim(atm%fields%bc(n)%field(m)%name)) .eq. 'o2_flux_pcair_atm') then + if( id_o2_flux_pcair_atm > 0 ) & + used = fms_diag_send_data ( id_o2_flux_pcair_atm, atm%fields%bc(n)%field(m)%values, Time ) endif enddo !} m enddo !} n @@ -1177,7 +1186,7 @@ subroutine sfc_boundary_layer ( dt, Time, Atm, Land, Ice, Land_Ice_Atmos_Boundar is=block_start(l) ie=block_end(l) call surface_flux (& - ex_t_atm(is:ie), ex_tr_atm(is:ie,isphum), ex_u_atm(is:ie), ex_v_atm(is:ie), ex_p_atm(is:ie), ex_z_atm(is:ie), & + ex_t_atm(is:ie), ex_tr_atm(is:ie,isphum), ex_u_atm(is:ie),ex_v_atm(is:ie),ex_p_atm(is:ie),ex_z_atm(is:ie),& ex_p_surf(is:ie),ex_t_surf(is:ie), ex_t_ca(is:ie), ex_tr_surf(is:ie,isphum), & ex_u_surf(is:ie), ex_v_surf(is:ie), & ex_rough_mom(is:ie), ex_rough_heat(is:ie), ex_rough_moist(is:ie), ex_rough_scale(is:ie), & @@ -1272,7 +1281,8 @@ subroutine sfc_boundary_layer ( dt, Time, Atm, Land, Ice, Land_Ice_Atmos_Boundar if (ex_gas_fluxes%bc(n)%atm_tr_index .gt. 0) then !{ m = tr_table_map(ex_gas_fluxes%bc(n)%atm_tr_index)%exch if (id_tr_mol_flux0(m) .gt. 0) then - call fms_xgrid_get_from_xgrid (diag_atm, 'ATM', ex_gas_fluxes%bc(n)%field(fms_coupler_ind_flux0)%values(:), xmap_sfc) + call fms_xgrid_get_from_xgrid (diag_atm, 'ATM', ex_gas_fluxes%bc(n)%field(fms_coupler_ind_flux0)%values(:),& + xmap_sfc) used = fms_diag_send_data ( id_tr_mol_flux0(m), diag_atm, Time ) end if end if @@ -1290,7 +1300,8 @@ subroutine sfc_boundary_layer ( dt, Time, Atm, Land, Ice, Land_Ice_Atmos_Boundar do n = 1, ex_gas_fluxes%num_bcs !{ if (ex_gas_fluxes%bc(n)%atm_tr_index .gt. 0) then !{ m = tr_table_map(ex_gas_fluxes%bc(n)%atm_tr_index)%exch - call fms_tracer_manager_get_tracer_names( MODEL_ATMOS, ex_gas_fluxes%bc(n)%atm_tr_index, tr_name, units=tr_units) + call fms_tracer_manager_get_tracer_names( MODEL_ATMOS, ex_gas_fluxes%bc(n)%atm_tr_index, tr_name, & + units=tr_units) do i = is,ie !{ if (ex_land(i)) cycle ! over land, don't do anything ! on ocean or ice cells, flux is explicit therefore we zero derivatives. @@ -1303,7 +1314,8 @@ subroutine sfc_boundary_layer ( dt, Time, Atm, Land, Ice, Land_Ice_Atmos_Boundar / (1.-ex_tr_atm(i,isphum)) else ! jgj: convert to kg co2/m2/sec for atm - ex_flux_tr(i,m) = ex_gas_fluxes%bc(n)%field(fms_coupler_ind_flux)%values(i) * ex_gas_fluxes%bc(n)%mol_wt * 1.0e-03 + ex_flux_tr(i,m) = ex_gas_fluxes%bc(n)%field(fms_coupler_ind_flux)%values(i) * & + ex_gas_fluxes%bc(n)%mol_wt * 1.0e-03 end if else ex_flux_tr(i,m) = 0.0 ! pure ice exchange cell @@ -1434,8 +1446,8 @@ subroutine sfc_boundary_layer ( dt, Time, Atm, Land, Ice, Land_Ice_Atmos_Boundar call fms_xgrid_get_from_xgrid (Land_Ice_Atmos_Boundary%b_star, 'ATM', ex_b_star , xmap_sfc, complete=.false.) call fms_xgrid_get_from_xgrid (Land_Ice_Atmos_Boundary%q_star, 'ATM', ex_q_star , xmap_sfc, complete=.true.) - call fms_xgrid_get_from_xgrid (Land_Ice_Atmos_Boundary%u_ref, 'ATM', ex_ref_u , xmap_sfc, complete=.false.) !bqx - call fms_xgrid_get_from_xgrid (Land_Ice_Atmos_Boundary%v_ref, 'ATM', ex_ref_v , xmap_sfc, complete=.true.) !bqx + call fms_xgrid_get_from_xgrid (Land_Ice_Atmos_Boundary%u_ref, 'ATM', ex_ref_u , xmap_sfc, complete=.false.) !bqx + call fms_xgrid_get_from_xgrid (Land_Ice_Atmos_Boundary%v_ref, 'ATM', ex_ref_v , xmap_sfc, complete=.true.) !bqx #ifndef use_AM3_physics call fms_xgrid_get_from_xgrid (Land_Ice_Atmos_Boundary%shflx, 'ATM', ex_flux_t , xmap_sfc) @@ -1573,7 +1585,8 @@ subroutine sfc_boundary_layer ( dt, Time, Atm, Land, Ice, Land_Ice_Atmos_Boundar do n = 1, Atm%fields%num_bcs !{ do m = 1, Atm%fields%bc(n)%num_fields !{ if ( Atm%fields%bc(n)%field(m)%id_diag > 0 ) then !{ - if (atm%fields%bc(n)%use_10m_wind_speed .and. m .eq. fms_coupler_ind_u10 .and. .not. Atm%fields%bc(n)%field(m)%override) then !{ + if (atm%fields%bc(n)%use_10m_wind_speed .and. m .eq. fms_coupler_ind_u10 .and. & + .not. Atm%fields%bc(n)%field(m)%override) then !{ call fms_xgrid_get_from_xgrid (Atm%fields%bc(n)%field(m)%values, 'ATM', & ex_gas_fields_atm%bc(n)%field(m)%values, xmap_sfc) endif !} @@ -1976,12 +1989,13 @@ subroutine flux_down_from_atmos (Time, Atm, Land, Ice, Atmos_boundary, Land_boun type(atmos_data_type), intent(inout) :: Atm !< A derived data type to specify atmosphere boundary data type(land_data_type), intent(in) :: Land !< A derived data type to specify land boundary data type(ice_data_type), intent(in) :: Ice !< A derived data type to specify ice boundary data - type(land_ice_atmos_boundary_type),intent(in) :: Atmos_boundary !< A derived data type to specify properties and fluxes - !! passed from exchange grid to the atmosphere, land and ice - type(atmos_land_boundary_type), intent(inout):: Land_boundary !< A derived data type to specify properties and fluxes - !! passed from atmosphere to land - type(atmos_ice_boundary_type), intent(inout):: Ice_boundary !< A derived data type to specify properties and fluxes passed - !! from atmosphere to ice + type(land_ice_atmos_boundary_type),intent(in) :: Atmos_boundary !< A derived data type to specify properties and + !!fluxes passed from exchange grid to the atmosphere + !! land and ice + type(atmos_land_boundary_type), intent(inout):: Land_boundary !< A derived data type to specify properties and + !! fluxes passed from atmosphere to land + type(atmos_ice_boundary_type), intent(inout):: Ice_boundary !< A derived data type to specify properties and + !! fluxes passed from atmosphere to ice real, dimension(n_xgrid_sfc) :: ex_flux_sw, ex_flux_lwd, & ex_flux_sw_dir, & @@ -2098,9 +2112,9 @@ subroutine flux_down_from_atmos (Time, Atm, Land, Ice, Atmos_boundary, Land_boun call fms_xgrid_put_to_xgrid (Atm%flux_sw_dif, 'ATM', ex_flux_sw_dif, xmap_sfc, complete=.false.) call fms_xgrid_put_to_xgrid (Atm%flux_sw_vis_dif, 'ATM', ex_flux_sw_vis_dif, xmap_sfc, complete=.false.) call fms_xgrid_put_to_xgrid (Atm%flux_sw_down_vis_dir, 'ATM', ex_flux_sw_down_vis_dir, xmap_sfc, complete=.false.) - call fms_xgrid_put_to_xgrid (Atm%flux_sw_down_total_dir, 'ATM', ex_flux_sw_down_total_dir, xmap_sfc, complete=.false.) - call fms_xgrid_put_to_xgrid (Atm%flux_sw_down_vis_dif, 'ATM', ex_flux_sw_down_vis_dif, xmap_sfc, complete=.false.) - call fms_xgrid_put_to_xgrid (Atm%flux_sw_down_total_dif, 'ATM', ex_flux_sw_down_total_dif, xmap_sfc, complete=.false.) + call fms_xgrid_put_to_xgrid (Atm%flux_sw_down_total_dir,'ATM', ex_flux_sw_down_total_dir, xmap_sfc,complete=.false.) + call fms_xgrid_put_to_xgrid (Atm%flux_sw_down_vis_dif,'ATM', ex_flux_sw_down_vis_dif, xmap_sfc,complete=.false.) + call fms_xgrid_put_to_xgrid (Atm%flux_sw_down_total_dif, 'ATM',ex_flux_sw_down_total_dif, xmap_sfc,complete=.false.) ! ccc = conservation_check(Atm%lprec, 'ATM', xmap_sfc) ! if (fms_mpp_pe()== fms_mpp_root_pe()) print *,'LPREC', ccc @@ -2123,8 +2137,10 @@ subroutine flux_down_from_atmos (Time, Atm, Land, Ice, Atmos_boundary, Land_boun ! on exchange grid instead of the stresses themselves so that only the ! implicit corrections are filtered through the atmospheric grid not the ! stresses themselves - call fms_xgrid_put_to_xgrid (Atm%Surf_Diff%delta_u, 'ATM', ex_delta_u, xmap_sfc, remap_method=remap_method, complete=.false.) - call fms_xgrid_put_to_xgrid (Atm%Surf_Diff%delta_v, 'ATM', ex_delta_v, xmap_sfc, remap_method=remap_method, complete=.true.) + call fms_xgrid_put_to_xgrid (Atm%Surf_Diff%delta_u, 'ATM', ex_delta_u, xmap_sfc, remap_method=remap_method, & + complete=.false.) + call fms_xgrid_put_to_xgrid (Atm%Surf_Diff%delta_v, 'ATM', ex_delta_v, xmap_sfc, remap_method=remap_method, & + complete=.true.) ! MOD update stresses using atmos delta's but derivatives on exchange grid !$OMP parallel do default(none) shared(my_nblocks,block_start,block_end,ex_flux_u,ex_delta_u, & @@ -2191,8 +2207,8 @@ subroutine flux_down_from_atmos (Time, Atm, Land, Ice, Atmos_boundary, Land_boun do tr = 1,n_exch_tr n = tr_table(tr)%atm - call fms_xgrid_put_to_xgrid (Atm%Surf_Diff%delta_tr(:,:,n), 'ATM', ex_delta_tr(:,tr), xmap_sfc, complete=.false. ) - call fms_xgrid_put_to_xgrid (Atm%Surf_Diff%dflux_tr(:,:,n), 'ATM', ex_dflux_tr(:,tr), xmap_sfc, complete=.false. ) + call fms_xgrid_put_to_xgrid (Atm%Surf_Diff%delta_tr(:,:,n), 'ATM', ex_delta_tr(:,tr), xmap_sfc, complete=.false.) + call fms_xgrid_put_to_xgrid (Atm%Surf_Diff%dflux_tr(:,:,n), 'ATM', ex_dflux_tr(:,tr), xmap_sfc, complete=.false.) enddo call fms_xgrid_put_to_xgrid (Atm%Surf_Diff%dtmass , 'ATM', ex_dtmass , xmap_sfc, complete=.false. ) @@ -2278,9 +2294,9 @@ subroutine flux_down_from_atmos (Time, Atm, Land, Ice, Atmos_boundary, Land_boun call fms_xgrid_get_from_xgrid_ug (Land_boundary%t_flux, 'LND', ex_flux_t, xmap_sfc) call fms_xgrid_get_from_xgrid_ug (Land_boundary%sw_flux, 'LND', ex_flux_sw, xmap_sfc) call fms_xgrid_get_from_xgrid_ug (Land_boundary%sw_flux_down_vis_dir, 'LND', ex_flux_sw_down_vis_dir, xmap_sfc) - call fms_xgrid_get_from_xgrid_ug (Land_boundary%sw_flux_down_total_dir, 'LND', ex_flux_sw_down_total_dir, xmap_sfc) + call fms_xgrid_get_from_xgrid_ug (Land_boundary%sw_flux_down_total_dir, 'LND', ex_flux_sw_down_total_dir, xmap_sfc) call fms_xgrid_get_from_xgrid_ug (Land_boundary%sw_flux_down_vis_dif, 'LND', ex_flux_sw_down_vis_dif, xmap_sfc) - call fms_xgrid_get_from_xgrid_ug (Land_boundary%sw_flux_down_total_dif, 'LND', ex_flux_sw_down_total_dif, xmap_sfc) + call fms_xgrid_get_from_xgrid_ug (Land_boundary%sw_flux_down_total_dif, 'LND', ex_flux_sw_down_total_dif, xmap_sfc) call fms_xgrid_get_from_xgrid_ug (Land_boundary%lw_flux, 'LND', ex_flux_lw, xmap_sfc) #ifdef SCM if (do_specified_land .and. do_specified_flux) then @@ -2478,19 +2494,22 @@ subroutine flux_down_from_atmos (Time, Atm, Land, Ice, Atmos_boundary, Land_boun call fms_xgrid_get_from_xgrid (Ice_boundary%q_flux, 'OCN', ex_flux_tr(:,isphum), xmap_sfc) call fms_xgrid_get_from_xgrid (Ice_boundary%sw_flux_vis_dir, 'OCN', ex_flux_sw_vis_dir, xmap_sfc) call fms_xgrid_get_from_xgrid (Ice_boundary%sw_flux_nir_dir, 'OCN', ex_flux_sw_dir,xmap_sfc) - Ice_boundary%sw_flux_nir_dir = Ice_boundary%sw_flux_nir_dir - Ice_boundary%sw_flux_vis_dir ! ice & ocean use these 4: dir/dif nir/vis - + ! ice & ocean use these 4: dir/dif nir/vis + Ice_boundary%sw_flux_nir_dir = Ice_boundary%sw_flux_nir_dir - Ice_boundary%sw_flux_vis_dir call fms_xgrid_get_from_xgrid (Ice_boundary%sw_flux_vis_dif, 'OCN', ex_flux_sw_vis_dif, xmap_sfc) call fms_xgrid_get_from_xgrid (Ice_boundary%sw_flux_nir_dif, 'OCN', ex_flux_sw_dif,xmap_sfc) - Ice_boundary%sw_flux_nir_dif = Ice_boundary%sw_flux_nir_dif - Ice_boundary%sw_flux_vis_dif ! ice & ocean use these 4: dir/dif nir/vis + ! ice & ocean use these 4: dir/dif nir/vis + Ice_boundary%sw_flux_nir_dif = Ice_boundary%sw_flux_nir_dif - Ice_boundary%sw_flux_vis_dif call fms_xgrid_get_from_xgrid (Ice_boundary%sw_down_vis_dir, 'OCN', ex_flux_sw_down_vis_dir, xmap_sfc) call fms_xgrid_get_from_xgrid (Ice_boundary%sw_down_nir_dir, 'OCN', ex_flux_sw_down_total_dir, xmap_sfc) - Ice_boundary%sw_down_nir_dir = Ice_boundary%sw_down_nir_dir - Ice_boundary%sw_down_vis_dir ! ice & ocean use these 4: dir/dif nir/vis + ! ice & ocean use these 4: dir/dif nir/vis + Ice_boundary%sw_down_nir_dir = Ice_boundary%sw_down_nir_dir - Ice_boundary%sw_down_vis_dir call fms_xgrid_get_from_xgrid (Ice_boundary%sw_down_vis_dif, 'OCN', ex_flux_sw_down_vis_dif, xmap_sfc) call fms_xgrid_get_from_xgrid (Ice_boundary%sw_down_nir_dif, 'OCN', ex_flux_sw_down_total_dif,xmap_sfc) - Ice_boundary%sw_down_nir_dif = Ice_boundary%sw_down_nir_dif - Ice_boundary%sw_down_vis_dif ! ice & ocean use these 4: dir/dif nir/vis + ! ice & ocean use these 4: dir/dif nir/vis + Ice_boundary%sw_down_nir_dif = Ice_boundary%sw_down_nir_dif - Ice_boundary%sw_down_vis_dif call fms_xgrid_get_from_xgrid (Ice_boundary%lw_flux, 'OCN', ex_flux_lw, xmap_sfc) call fms_xgrid_get_from_xgrid (Ice_boundary%dhdt, 'OCN', ex_dhdt_surf, xmap_sfc) @@ -2587,7 +2606,8 @@ subroutine flux_down_from_atmos (Time, Atm, Land, Ice, Atmos_boundary, Land_boun call fms_xgrid_stock_move_ug( & & FROM = fms_stock_constants_atm_stock(ISTOCK_HEAT), & & TO = fms_stock_constants_lnd_stock(ISTOCK_HEAT), & - & stock_ug_data3d = (-Land_boundary%t_flux + Land_boundary%lw_flux + Land_boundary%sw_flux - Land_boundary%fprec*HLF), & + & stock_ug_data3d = (-Land_boundary%t_flux + Land_boundary%lw_flux + Land_boundary%sw_flux - & + Land_boundary%fprec*HLF), & & grid_index=X1_GRID_LND, & & xmap=xmap_sfc, & & delta_t=Dt_atm, & @@ -2608,7 +2628,8 @@ subroutine flux_down_from_atmos (Time, Atm, Land, Ice, Atmos_boundary, Land_boun call fms_xgrid_stock_move( & & FROM = fms_stock_constants_atm_stock(ISTOCK_HEAT), & & TO = fms_stock_constants_lnd_stock(ISTOCK_HEAT), & - & stock_data3d = (-Land_boundary%t_flux + Land_boundary%lw_flux + Land_boundary%sw_flux - Land_boundary%fprec*HLF), & + & stock_data3d = (-Land_boundary%t_flux + Land_boundary%lw_flux + Land_boundary%sw_flux - & + Land_boundary%fprec*HLF), & & grid_index=X1_GRID_LND, & & xmap=xmap_sfc, & & delta_t=Dt_atm, & @@ -2631,7 +2652,8 @@ subroutine flux_down_from_atmos (Time, Atm, Land, Ice, Atmos_boundary, Land_boun call fms_xgrid_stock_move( & & FROM = fms_stock_constants_atm_stock(ISTOCK_HEAT), & & TO = fms_stock_constants_ice_stock(ISTOCK_HEAT), & - & stock_data3d = (-Ice_boundary%t_flux + Ice_boundary%lw_flux - Ice_boundary%fprec*HLF + Ice_boundary%sw_flux_vis_dir + & + & stock_data3d = (-Ice_boundary%t_flux + Ice_boundary%lw_flux - Ice_boundary%fprec*HLF + & + Ice_boundary%sw_flux_vis_dir + & Ice_boundary%sw_flux_vis_dif + Ice_boundary%sw_flux_nir_dir + Ice_boundary%sw_flux_nir_dif), & & grid_index=X1_GRID_ICE, & & xmap=xmap_sfc, & @@ -2718,8 +2740,10 @@ subroutine flux_up_to_atmos ( Time, Land, Ice, Land_Ice_Atmos_Boundary, Land_bou type(FmsTime_type), intent(in) :: Time !< Current time type(land_data_type), intent(inout) :: Land !< A derived data type to specify ice boundary data type(ice_data_type), intent(inout) :: Ice !< A derived data type to specify ice boundary data - type(land_ice_atmos_boundary_type), intent(inout) :: Land_Ice_Atmos_Boundary !< A derived data type to specify properties and fluxed - !! passed from exchange grid to the atmosphere, land and ice + type(land_ice_atmos_boundary_type), intent(inout) :: Land_Ice_Atmos_Boundary !< A derived data type to specify + !! properties and fluxes passed from + !! exchange grid to the atmosphere, + !! land and ice type(atmos_land_boundary_type), intent(inout) :: Land_boundary type(atmos_ice_boundary_type), intent(inout) :: Ice_boundary @@ -2746,7 +2770,8 @@ subroutine flux_up_to_atmos ( Time, Land, Ice, Land_Ice_Atmos_Boundary, Land_bou #ifndef _USE_LEGACY_LAND_ real, dimension(size(Land_boundary%lprec,1), size(Land_boundary%lprec,2)) :: data_lnd, diag_land #else - real, dimension(size(Land_boundary%lprec,1), size(Land_boundary%lprec,2), size(Land_boundary%lprec,3)) :: data_lnd, diag_land + real, dimension(size(Land_boundary%lprec,1), size(Land_boundary%lprec,2), size(Land_boundary%lprec,3)) :: data_lnd,& + diag_land #endif real, dimension(size(Ice_boundary%lprec,1), size(Ice_boundary%lprec,2), size(Ice_boundary%lprec,3)) :: data_ice real, dimension(size(Ice%albedo,1),size(Ice%albedo,2),size(Ice%albedo,3)) :: icegrid @@ -3050,7 +3075,8 @@ subroutine flux_up_to_atmos ( Time, Land, Ice, Land_Ice_Atmos_Boundary, Land_bou if (fms_mpp_lowercase(trim(tr_name))=='co2') then call send_tile_data (id_tr_mol_flux_land(tr), diag_land*1000./WTMCO2) elseif (fms_mpp_lowercase(trim(tr_units)).eq.'vmr') then - call fms_xgrid_get_from_xgrid_ug (diag_land, 'LND', ex_flux_tr(:,tr)*(1.-ex_tr_surf_new(:,isphum)), xmap_sfc) + call fms_xgrid_get_from_xgrid_ug (diag_land, 'LND', ex_flux_tr(:,tr)*(1.-ex_tr_surf_new(:,isphum)), & + xmap_sfc) call send_tile_data (id_tr_mol_flux_land(tr), diag_atm*1000./WTMAIR ) endif endif @@ -3245,8 +3271,8 @@ end subroutine flux_ex_arrays_dealloc subroutine flux_atmos_to_ocean(Time, Atm, Ice_boundary, Ice) type(FmsTime_type), intent(in) :: Time !< Current time type(atmos_data_type), intent(inout):: Atm !< A derived data type to specify atmosphere boundary data - type(atmos_ice_boundary_type), intent(inout):: Ice_boundary !< A derived data type to specify properties and fluxes passed - !! from atmosphere to ice + type(atmos_ice_boundary_type), intent(inout):: Ice_boundary !< A derived data type to specify properties and fluxes + !! passed from atmosphere to ice type(ice_data_type), intent(inout):: Ice integer :: n,m @@ -3282,7 +3308,8 @@ subroutine flux_atmos_to_ocean(Time, Atm, Ice_boundary, Ice) call fms_data_override('ICE', Ice_boundary%fluxes%bc(n)%field(m)%name, & Ice_boundary%fluxes%bc(n)%field(m)%values, Time) if ( Ice_boundary%fluxes%bc(n)%field(m)%id_diag > 0 ) then !{ - used = fms_diag_send_data(Ice_boundary%fluxes%bc(n)%field(m)%id_diag, Ice_boundary%fluxes%bc(n)%field(m)%values, Time ) + used = fms_diag_send_data(Ice_boundary%fluxes%bc(n)%field(m)%id_diag, & + Ice_boundary%fluxes%bc(n)%field(m)%values, Time ) endif !} enddo !} m endif @@ -3608,10 +3635,10 @@ subroutine diag_field_init ( Time, atmos_axes, land_axes, land_pe ) id_tr_flux_land(tr) = register_tiled_diag_field( 'flux_land', trim(name)//'_flux', Land_axes, Time, & 'flux of '//trim(longname), trim(units)//' kg air/(m2 s)', missing_value=-1.0 ) if ( fms_mpp_lowercase(trim(name))=='co2') then - id_tr_mol_flux_land(tr) = register_tiled_diag_field( 'flux_land', trim(name)//'_mol_flux', Land_axes, Time, & + id_tr_mol_flux_land(tr) = register_tiled_diag_field( 'flux_land', trim(name)//'_mol_flux', Land_axes,Time,& 'flux of '//trim(longname), 'mol CO2/(m2 s)', missing_value=-1.0 ) else - id_tr_mol_flux_land(tr) = register_tiled_diag_field( 'flux_land', trim(name)//'_mol_flux', Land_axes, Time, & + id_tr_mol_flux_land(tr) = register_tiled_diag_field( 'flux_land', trim(name)//'_mol_flux', Land_axes,Time,& 'flux of '//trim(longname), 'mol/(m2 s)', missing_value=-1.0 ) endif enddo @@ -3657,11 +3684,11 @@ subroutine diag_field_init ( Time, atmos_axes, land_axes, land_pe ) id_tr_flux_land(tr) = fms_diag_register_diag_field( 'flux_land', trim(name)//'_flux', Land_axes, Time, & 'flux of '//trim(longname), trim(units)//' kg air/(m2 s)', missing_value=-1.0 ) if ( fms_mpp_lowercase(trim(name))=='co2') then - id_tr_mol_flux_land(tr) = fms_diag_register_diag_field( 'flux_land', trim(name)//'_mol_flux', Land_axes, Time, & - 'flux of '//trim(longname), 'mol CO2/(m2 s)', missing_value=-1.0 ) + id_tr_mol_flux_land(tr) = fms_diag_register_diag_field( 'flux_land', trim(name)//'_mol_flux', Land_axes, & + Time, 'flux of '//trim(longname), 'mol CO2/(m2 s)', missing_value=-1.0 ) else - id_tr_mol_flux_land(tr) = fms_diag_register_diag_field( 'flux_land', trim(name)//'_mol_flux', Land_axes, Time, & - 'flux of '//trim(longname), 'mol/(m2 s)', missing_value=-1.0 ) + id_tr_mol_flux_land(tr) = fms_diag_register_diag_field( 'flux_land', trim(name)//'_mol_flux', Land_axes, & + Time, 'flux of '//trim(longname), 'mol/(m2 s)', missing_value=-1.0 ) endif enddo #endif diff --git a/full/atmos_ocean_dep_fluxes_calc.F90 b/full/atmos_ocean_dep_fluxes_calc.F90 index abf79e38..a9d0f35d 100644 --- a/full/atmos_ocean_dep_fluxes_calc.F90 +++ b/full/atmos_ocean_dep_fluxes_calc.F90 @@ -31,8 +31,10 @@ module atmos_ocean_dep_fluxes_calc_mod !> \brief atmos_ocean_dep_fluxes_calc ! !! \throw FATAL, "Number of gas fluxes not zero" - !! \throw FATAL, "atmos_ocean_dep_fluxes_calc: Bad parameter ([gas_fluxes%bc(n)%param(1)]) for air_sea_deposition for [gas_fluxes%bc(n)%name]" - !! \throw FATAL, "atmos_ocean_dep_fluxes_calc: Unknown implementation ([gas_fluxes%bc(n)%implementation] for [gas_fluxes%bc(n)%name]" + !! \throw FATAL, "atmos_ocean_dep_fluxes_calc: Bad parameter ([gas_fluxes%bc(n)%param(1)]) for air_sea_deposition for + !! [gas_fluxes%bc(n)%name]" + !! \throw FATAL, "atmos_ocean_dep_fluxes_calc: Unknown implementation ([gas_fluxes%bc(n)%implementation] for + !! [gas_fluxes%bc(n)%name]" subroutine atmos_ocean_dep_fluxes_calc(gas_fields_atm, gas_fields_ice, gas_fluxes, seawater) type(FmsCoupler1dBC_type), intent(in) :: gas_fields_atm !< Structure containing atmospheric surface !! variables that are used in the calculation diff --git a/full/atmos_ocean_fluxes_calc.F90 b/full/atmos_ocean_fluxes_calc.F90 index d551ecd5..9da6da57 100644 --- a/full/atmos_ocean_fluxes_calc.F90 +++ b/full/atmos_ocean_fluxes_calc.F90 @@ -161,7 +161,8 @@ subroutine atmos_ocean_fluxes_calc(gas_fields_atm, gas_fields_ice,& & calc_kw(tsurf(i),& & gas_fields_atm%bc(n)%field(fms_coupler_ind_psurf)%values(i),& & gas_fields_atm%bc(n)%field(fms_coupler_ind_u10)%values(i),& - & 101325./(rdgas*wtmair*1e-3*tsurf(i)*max(gas_fields_ice%bc(n)%field(fms_coupler_ind_alpha)%values(i),epsln)),& + & 101325./(rdgas*wtmair*1e-3*tsurf(i)* & + max(gas_fields_ice%bc(n)%field(fms_coupler_ind_alpha)%values(i),epsln)),& & gas_fluxes%bc(n)%param(2),& & gas_fluxes%bc(n)%param(1),& & gas_fields_ice%bc(n)%field(fms_coupler_ind_sc_no)%values(i)) diff --git a/full/coupler_main.F90 b/full/coupler_main.F90 index 7ccb02e2..bc0822a9 100644 --- a/full/coupler_main.F90 +++ b/full/coupler_main.F90 @@ -588,7 +588,7 @@ program coupler_main !$OMP& NUM_THREADS(1) & !$OMP& DEFAULT(NONE) & !$OMP& PRIVATE(dsec) & -!$OMP& SHARED(Atm, Land, Ice, Land_ice_atmos_boundary, Atmos_ice_boundary, Ocean_ice_boundary, Atmos_land_boundary) & +!$OMP& SHARED(Atm, Land, Ice, Land_ice_atmos_boundary, Atmos_ice_boundary, Ocean_ice_boundary,Atmos_land_boundary)& !$OMP& SHARED(do_chksum, do_debug, omp_sec, num_atmos_calls, na, radiation_nthreads) & !$OMP& SHARED(coupler_clocks) !$ call omp_set_num_threads(radiation_nthreads) diff --git a/full/flux_exchange.F90 b/full/flux_exchange.F90 index e7f07b59..d3d9ea72 100644 --- a/full/flux_exchange.F90 +++ b/full/flux_exchange.F90 @@ -349,17 +349,17 @@ !! ~~~~~~~~~~{.f90} !! type (surf_diff_type) :: Atm%Surf_Diff !! -!! real, dimension(:,:) :: Atm%Surf_Diff%dtmass & ! dt/mass where dt = atmospheric time step ((i+1) = (i-1) for leapfrog) (s) +!! real, dimension(:,:) :: Atm%Surf_Diff%dtmass & !dt/mass where dt=atmospheric time step ((i+1)=(i-1) for leapfrog)(s) !! ! mass = mass per unit area of lowest atmosphehic layer (Kg/m2)) !! Atm%Surf_Diff%delta_t & ! increment ((i+1) = (i-1) for leapfrog) in temperature of !! ! lowest atmospheric layer (K) !! Atm%Surf_Diff%delta_q & ! increment ((i+1) = (i-1) for leapfrog) in specific humidity of !! ! lowest atmospheric layer (nondimensional -- Kg/Kg) -!! Atm%Surf_Diff%dflux_t & ! derivative of implicit part of downward temperature flux at top of lowest -!! ! atmospheric layer with respect to temperature +!! Atm%Surf_Diff%dflux_t & ! derivative of implicit part of downward temperature flux at top of +!! ! lowestatmospheric layer with respect to temperature !! ! of lowest atmospheric layer (Kg/(m2 s)) -!! Atm%Surf_Diff%dflux_q ! derivative of implicit part of downward moisture flux at top of lowest -!! ! atmospheric layer with respect to specific humidity of +!! Atm%Surf_Diff%dflux_q ! derivative of implicit part of downward moisture flux at top of +!! ! lowest atmospheric layer with respect to specific humidity of !! ! of lowest atmospheric layer (Kg/(m2 s)) !! ~~~~~~~~~~ !! @@ -551,7 +551,8 @@ module flux_exchange_mod real, parameter :: d622 = rdgas/rvgas real, parameter :: d378 = 1.0-d622 - real :: z_ref_heat = 2. !< Reference height (meters) for temperature and relative humidity diagnostics (t_ref, rh_ref, del_h, del_q) + real :: z_ref_heat = 2. !< Reference height (meters) for temperature and relative humidity diagnostics + !! (t_ref, rh_ref, del_h, del_q) real :: z_ref_mom = 10. !< Reference height (meters) for mementum diagnostics (u_ref, v_ref, del_m) logical :: do_area_weighted_flux = .FALSE. logical :: debug_stocks = .FALSE. @@ -560,8 +561,8 @@ module flux_exchange_mod logical :: do_forecast = .false. integer :: nblocks = 1 - logical :: partition_fprec_from_lprec = .FALSE. !< option for ATM override experiments where liquid+frozen precip are combined - !! This option will convert liquid precip to snow when t_ref is less than + logical :: partition_fprec_from_lprec = .FALSE. !< option for ATM override experiments where liquid+frozen precip are + !! combined. This option will convert liquid precip to snow when t_ref is less than !! tfreeze parameter real, parameter :: tfreeze = 273.15 logical :: scale_precip_2d = .false. @@ -661,12 +662,17 @@ subroutine flux_exchange_init ( Time, Atm, Land, Ice, Ocean, Ocean_state,& ! COMPLETELY allocated here and in subroutines called from here; ! NO pointer components should have been allocated before entry if the ! derived type has intent(OUT) otherwise they may be lost. - type(atmos_ice_boundary_type), intent(inout) :: atmos_ice_boundary !< A derived data type to specify properties and fluxes passed from atmosphere to ice - type(land_ice_atmos_boundary_type),intent(inout) :: land_ice_atmos_boundary !< A derived data type to specify properties and fluxes passed from exchange grid to - !! the atmosphere, land and ice - type(land_ice_boundary_type), intent(inout) :: land_ice_boundary !< A derived data type to specify properties and fluxes passed from land to ice - type(ice_ocean_boundary_type), intent(inout) :: ice_ocean_boundary !< A derived data type to specify properties and fluxes passed from ice to ocean - type(ocean_ice_boundary_type), intent(inout) :: ocean_ice_boundary !< A derived data type to specify properties and fluxes passed from ocean to ice + type(atmos_ice_boundary_type), intent(inout) :: atmos_ice_boundary !< A derived data type to specify properties + !! and fluxes passed from atmosphere to ice + type(land_ice_atmos_boundary_type),intent(inout) :: land_ice_atmos_boundary !< A derived data type to specify + !! properties and fluxes passed from exchange grid to + !! the atmosphere, land and ice + type(land_ice_boundary_type), intent(inout) :: land_ice_boundary !< A derived data type to specify properties + !! and fluxes passed from land to ice + type(ice_ocean_boundary_type), intent(inout) :: ice_ocean_boundary !< A derived data type to specify properties + !! and fluxes passed from ice to ocean + type(ocean_ice_boundary_type), intent(inout) :: ocean_ice_boundary !< A derived data type to specify properties + !! and fluxes passed from ocean to ice logical, intent(in) :: do_ocean integer, dimension(:), intent(in) :: slow_ice_ocean_pelist integer, optional, intent(in) :: dt_atmos !< Atmosphere time step in seconds @@ -745,7 +751,7 @@ subroutine flux_exchange_init ( Time, Atm, Land, Ice, Ocean, Ocean_state,& call fms_mpp_set_current_pelist() call ice_ocean_flux_exchange_init(Time, Ice, Ocean, Ocean_state,ice_ocean_boundary, ocean_ice_boundary, & - Dt_cpl, debug_stocks, do_area_weighted_flux, ex_gas_fields_ice, ex_gas_fluxes, do_ocean, slow_ice_ocean_pelist ) + Dt_cpl, debug_stocks, do_area_weighted_flux, ex_gas_fields_ice, ex_gas_fluxes, do_ocean, slow_ice_ocean_pelist) !---- done ---- do_init = .false. @@ -1023,7 +1029,8 @@ subroutine check_atm_grid(Atm, grid_file) end do deallocate(tmpx, tmpy) else - call fms_mpp_error(FATAL, 'atm_land_ice_flux_exchange_mod: both AREA_ATMxOCN and ocn_mosaic_file does not exist in '//trim(grid_file)) + call fms_mpp_error(FATAL, & + 'atm_land_ice_flux_exchange_mod: both AREA_ATMxOCN and ocn_mosaic_file does not exist in '//trim(grid_file)) end if call fms2_io_close_file(grid_file_obj) diff --git a/full/full_coupler_mod.F90 b/full/full_coupler_mod.F90 index 29d7eb4b..4f8d294d 100644 --- a/full/full_coupler_mod.F90 +++ b/full/full_coupler_mod.F90 @@ -322,8 +322,8 @@ module full_coupler_mod subroutine coupler_init(Atm, Ocean, Land, Ice, Ocean_state, Atmos_land_boundary, Atmos_ice_boundary, & Ocean_ice_boundary, Ice_ocean_boundary, Land_ice_atmos_boundary, Land_ice_boundary, & Ice_ocean_driver_CS, Ice_bc_restart, Ocn_bc_restart, ensemble_pelist, slow_ice_ocean_pelist, conc_nthreads, & - coupler_clocks, coupler_components_obj, coupler_chksum_obj, Time_step_cpld, Time_step_atmos, Time_atmos, Time_ocean, & - num_cpld_calls, num_atmos_calls, Time, Time_start, Time_end, Time_restart, Time_restart_current) + coupler_clocks, coupler_components_obj, coupler_chksum_obj, Time_step_cpld, Time_step_atmos, Time_atmos, & + Time_ocean, num_cpld_calls, num_atmos_calls, Time, Time_start, Time_end, Time_restart, Time_restart_current) implicit none diff --git a/full/ice_ocean_flux_exchange.F90 b/full/ice_ocean_flux_exchange.F90 index 2e437bdd..4131c3ba 100644 --- a/full/ice_ocean_flux_exchange.F90 +++ b/full/ice_ocean_flux_exchange.F90 @@ -63,8 +63,10 @@ subroutine ice_ocean_flux_exchange_init(Time, Ice, Ocean, Ocean_state, ice_ocean type(ice_data_type), intent(inout) :: Ice !< A derived data type to specify ice boundary data type(ocean_public_type), intent(inout) :: Ocean !< A derived data type to specify ocean boundary data type(ocean_state_type), pointer :: Ocean_state - type(ice_ocean_boundary_type), intent(inout) :: ice_ocean_boundary !< A derived data type to specify properties and fluxes passed from ice to ocean - type(ocean_ice_boundary_type), intent(inout) :: ocean_ice_boundary !< A derived data type to specify properties and fluxes passed from ocean to ice + type(ice_ocean_boundary_type), intent(inout) :: ice_ocean_boundary !< A derived data type to specify properties and + !! fluxes passed from ice to ocean + type(ocean_ice_boundary_type), intent(inout) :: ocean_ice_boundary !< A derived data type to specify properties and + !! fluxes passed from ocean to ice real, intent(in) :: Dt_cpl_in logical, intent(in) :: debug_stocks_in logical, intent(in) :: do_area_weighted_flux_in @@ -228,8 +230,8 @@ subroutine flux_ice_to_ocean ( Ice, Ocean, Ice_Ocean_Boundary ) type(ice_data_type), intent(in) :: Ice !< A derived data type to specify ice boundary data type(ocean_public_type), intent(in) :: Ocean !< A derived data type to specify ocean boundary data - type(ice_ocean_boundary_type), intent(inout) :: Ice_Ocean_Boundary !< A derived data type to specify properties and fluxes - !! passed from ice to ocean + type(ice_ocean_boundary_type), intent(inout) :: Ice_Ocean_Boundary !< A derived data type to specify properties and + !! fluxes passed from ice to ocean integer :: m integer :: n @@ -322,8 +324,8 @@ end subroutine flux_ice_to_ocean subroutine flux_ice_to_ocean_finish ( Time, Ice_Ocean_Boundary ) type(FmsTime_type), intent(in) :: Time !< Current time - type(ice_ocean_boundary_type), intent(inout) :: Ice_Ocean_Boundary !< A derived data type to specify properties and fluxes - !! passed from ice to ocean + type(ice_ocean_boundary_type), intent(inout) :: Ice_Ocean_Boundary !< A derived data type to specify properties and + !! fluxes passed from ice to ocean call fms_data_override('OCN', 'u_flux', Ice_Ocean_Boundary%u_flux , Time ) call fms_data_override('OCN', 'v_flux', Ice_Ocean_Boundary%v_flux , Time ) @@ -379,8 +381,8 @@ subroutine flux_ocean_to_ice ( Ocean, Ice, Ocean_Ice_Boundary ) type(ocean_public_type), intent(in) :: Ocean !< A derived data type to specify ocean boundary data type(ice_data_type), intent(in) :: Ice !< A derived data type to specify ice boundary data - type(ocean_ice_boundary_type), intent(inout) :: Ocean_Ice_Boundary !< A derived data type to specify properties and fluxes - !! passed from ocean to ice + type(ocean_ice_boundary_type), intent(inout) :: Ocean_Ice_Boundary !< A derived data type to specify properties and + !! fluxes passed from ocean to ice real, allocatable, dimension(:,:) :: tmp integer :: m integer :: n @@ -421,7 +423,8 @@ subroutine flux_ocean_to_ice ( Ocean, Ice, Ocean_Ice_Boundary ) call fms_mpp_domains_redistribute(Ocean%Domain, Ocean%s_surf, Ice%slow_Domain_NH, Ocean_Ice_Boundary%s) if( ASSOCIATED(Ocean_Ice_Boundary%sea_level) ) & - call fms_mpp_domains_redistribute(Ocean%Domain, Ocean%sea_lev, Ice%slow_Domain_NH, Ocean_Ice_Boundary%sea_level) + call fms_mpp_domains_redistribute(Ocean%Domain, Ocean%sea_lev, Ice%slow_Domain_NH, & + Ocean_Ice_Boundary%sea_level) if( ASSOCIATED(Ocean_Ice_Boundary%frazil) ) then if(do_area_weighted_flux) then @@ -434,7 +437,7 @@ subroutine flux_ocean_to_ice ( Ocean, Ice, Ocean_Ice_Boundary ) call divide_by_area(data=Ocean_Ice_Boundary%frazil, area=Ice%area) if (Ocean%is_ocean_pe) deallocate(tmp) else - call fms_mpp_domains_redistribute(Ocean%Domain, Ocean%frazil, Ice%slow_Domain_NH, Ocean_Ice_Boundary%frazil) + call fms_mpp_domains_redistribute(Ocean%Domain,Ocean%frazil, Ice%slow_Domain_NH, Ocean_Ice_Boundary%frazil) endif endif @@ -457,8 +460,8 @@ subroutine flux_ocean_to_ice_finish( Time, Ice, Ocean_Ice_Boundary ) type(FmsTime_type), intent(in) :: Time !< Current time type(ice_data_type), intent(in) :: Ice !< A derived data type to specify ice boundary data - type(ocean_ice_boundary_type), intent(inout) :: Ocean_Ice_Boundary !< A derived data type to specify properties and fluxes - !! passed from ocean to ice + type(ocean_ice_boundary_type), intent(inout) :: Ocean_Ice_Boundary !< A derived data type to specify properties and + !! fluxes passed from ocean to ice real :: from_dq call fms_data_override('ICE', 'u', Ocean_Ice_Boundary%u, Time) @@ -474,8 +477,10 @@ subroutine flux_ocean_to_ice_finish( Time, Ice, Ocean_Ice_Boundary ) ! frazil (already in J/m^2 so no need to multiply by Dt_cpl) from_dq = SUM( Ice%area * Ocean_Ice_Boundary%frazil ) - fms_stock_constants_ice_stock(ISTOCK_HEAT)%dq(ISTOCK_BOTTOM) = fms_stock_constants_ice_stock(ISTOCK_HEAT)%dq(ISTOCK_BOTTOM) - from_dq - fms_stock_constants_ocn_stock(ISTOCK_HEAT)%dq(ISTOCK_SIDE ) = fms_stock_constants_ocn_stock(ISTOCK_HEAT)%dq(ISTOCK_SIDE ) + from_dq + fms_stock_constants_ice_stock(ISTOCK_HEAT)%dq(ISTOCK_BOTTOM) = & + fms_stock_constants_ice_stock(ISTOCK_HEAT)%dq(ISTOCK_BOTTOM) - from_dq + fms_stock_constants_ocn_stock(ISTOCK_HEAT)%dq(ISTOCK_SIDE ) = & + fms_stock_constants_ocn_stock(ISTOCK_HEAT)%dq(ISTOCK_SIDE ) + from_dq end subroutine flux_ocean_to_ice_finish @@ -495,33 +500,43 @@ subroutine flux_ice_to_ocean_stocks(Ice) ! precip - evap from_dq = Dt_cpl * SUM( Ice%area * (Ice%lprec+Ice%fprec-Ice%flux_q) ) - fms_stock_constants_ice_stock(ISTOCK_WATER)%dq(ISTOCK_BOTTOM) = fms_stock_constants_ice_stock(ISTOCK_WATER)%dq(ISTOCK_BOTTOM) - from_dq - fms_stock_constants_ocn_stock(ISTOCK_WATER)%dq(ISTOCK_TOP ) = fms_stock_constants_ocn_stock(ISTOCK_WATER)%dq(ISTOCK_TOP ) + from_dq + fms_stock_constants_ice_stock(ISTOCK_WATER)%dq(ISTOCK_BOTTOM) = & + fms_stock_constants_ice_stock(ISTOCK_WATER)%dq(ISTOCK_BOTTOM) - from_dq + fms_stock_constants_ocn_stock(ISTOCK_WATER)%dq(ISTOCK_TOP ) = & + fms_stock_constants_ocn_stock(ISTOCK_WATER)%dq(ISTOCK_TOP ) + from_dq ! river from_dq = Dt_cpl * SUM( Ice%area * (Ice%runoff + Ice%calving) ) - fms_stock_constants_ice_stock(ISTOCK_WATER)%dq(ISTOCK_BOTTOM) = fms_stock_constants_ice_stock(ISTOCK_WATER)%dq(ISTOCK_BOTTOM) - from_dq - fms_stock_constants_ocn_stock(ISTOCK_WATER)%dq(ISTOCK_SIDE ) = fms_stock_constants_ocn_stock(ISTOCK_WATER)%dq(ISTOCK_SIDE ) + from_dq + fms_stock_constants_ice_stock(ISTOCK_WATER)%dq(ISTOCK_BOTTOM) = & + fms_stock_constants_ice_stock(ISTOCK_WATER)%dq(ISTOCK_BOTTOM) - from_dq + fms_stock_constants_ocn_stock(ISTOCK_WATER)%dq(ISTOCK_SIDE ) = & + fms_stock_constants_ocn_stock(ISTOCK_WATER)%dq(ISTOCK_SIDE ) + from_dq ! sensible heat + shortwave + longwave + latent heat from_dq = Dt_cpl * SUM( Ice%area * ( & & Ice%flux_sw_vis_dir+Ice%flux_sw_vis_dif & & + Ice%flux_sw_nir_dir+Ice%flux_sw_nir_dif + Ice%flux_lw & & - (Ice%fprec + Ice%calving)*HLF - Ice%flux_t - Ice%flux_q*HLV) ) - fms_stock_constants_ice_stock(ISTOCK_HEAT)%dq(ISTOCK_BOTTOM) = fms_stock_constants_ice_stock(ISTOCK_HEAT)%dq(ISTOCK_BOTTOM) - from_dq - fms_stock_constants_ocn_stock(ISTOCK_HEAT)%dq(ISTOCK_SIDE ) = fms_stock_constants_ocn_stock(ISTOCK_HEAT)%dq(ISTOCK_SIDE ) + from_dq + fms_stock_constants_ice_stock(ISTOCK_HEAT)%dq(ISTOCK_BOTTOM) = & + fms_stock_constants_ice_stock(ISTOCK_HEAT)%dq(ISTOCK_BOTTOM) - from_dq + fms_stock_constants_ocn_stock(ISTOCK_HEAT)%dq(ISTOCK_SIDE ) = & + fms_stock_constants_ocn_stock(ISTOCK_HEAT)%dq(ISTOCK_SIDE ) + from_dq ! heat carried by river + pme (assuming reference temperature of 0 degC and river/pme temp = surface temp) ! Note: it does not matter what the ref temperature is but it must be consistent with that in OCN and ICE from_dq = Dt_cpl * SUM( Ice%area * ( & & (Ice%lprec+Ice%fprec-Ice%flux_q + Ice%runoff+Ice%calving)*CP_OCEAN*Ice%SST_C(:,:)) ) - fms_stock_constants_ice_stock(ISTOCK_HEAT)%dq(ISTOCK_BOTTOM) = fms_stock_constants_ice_stock(ISTOCK_HEAT)%dq(ISTOCK_BOTTOM) - from_dq - fms_stock_constants_ocn_stock(ISTOCK_HEAT)%dq(ISTOCK_SIDE ) = fms_stock_constants_ocn_stock(ISTOCK_HEAT)%dq(ISTOCK_SIDE ) + from_dq + fms_stock_constants_ice_stock(ISTOCK_HEAT)%dq(ISTOCK_BOTTOM) = & + fms_stock_constants_ice_stock(ISTOCK_HEAT)%dq(ISTOCK_BOTTOM) - from_dq + fms_stock_constants_ocn_stock(ISTOCK_HEAT)%dq(ISTOCK_SIDE ) = & + fms_stock_constants_ocn_stock(ISTOCK_HEAT)%dq(ISTOCK_SIDE ) + from_dq !SALT flux from_dq = Dt_cpl* SUM( Ice%area * ( -Ice%flux_salt )) - fms_stock_constants_ice_stock(ISTOCK_SALT)%dq(ISTOCK_BOTTOM) = fms_stock_constants_ice_stock(ISTOCK_SALT)%dq(ISTOCK_BOTTOM) - from_dq - fms_stock_constants_ocn_stock(ISTOCK_SALT)%dq(ISTOCK_TOP ) = fms_stock_constants_ocn_stock(ISTOCK_SALT)%dq(ISTOCK_TOP ) + from_dq + fms_stock_constants_ice_stock(ISTOCK_SALT)%dq(ISTOCK_BOTTOM) = & + fms_stock_constants_ice_stock(ISTOCK_SALT)%dq(ISTOCK_BOTTOM) - from_dq + fms_stock_constants_ocn_stock(ISTOCK_SALT)%dq(ISTOCK_TOP ) = & + fms_stock_constants_ocn_stock(ISTOCK_SALT)%dq(ISTOCK_TOP ) + from_dq end subroutine flux_ice_to_ocean_stocks @@ -530,10 +545,10 @@ end subroutine flux_ice_to_ocean_stocks !> \brief Updates Ocean stocks due to input that the Ocean model gets. !! !! This subroutine updates the stocks of Ocean by the amount of input that the Ocean gets from Ice component. - !! Unlike subroutine flux_ice_to_ocean_stocks() that uses Ice%fluxes to update the stocks due to the amount of output from Ice - !! this subroutine uses Ice_Ocean_boundary%fluxes to calculate the amount of input to the Ocean. These fluxes are the ones - !! that Ocean model uses internally to calculate its budgets. Hence there should be no difference between this input and what - !! Ocean model internal diagnostics uses. + !! Unlike subroutine flux_ice_to_ocean_stocks() that uses Ice%fluxes to update the stocks due to the amount of output + !! from Ice,this subroutine uses Ice_Ocean_boundary%fluxes to calculate the amount of input to the Ocean. These fluxes + !! are the ones that Ocean model uses internally to calculate its budgets. Hence there should be no difference between + !! this input and what Ocean model internal diagnostics uses. !! This bypasses the possible mismatch in cell areas between Ice and Ocean in diagnosing the stocks of Ocean !! and should report a conserving Ocean component regardless of the glitches in fluxes. !! @@ -562,11 +577,13 @@ subroutine flux_ocean_from_ice_stocks(ocean_state,Ocean,Ice_Ocean_boundary) ! fluxes from ice -> ocean, integrate over surface and in time ! precip - evap - from_dq = SUM( ocean_cell_area * wet * (Ice_Ocean_Boundary%lprec+Ice_Ocean_Boundary%fprec-Ice_Ocean_Boundary%q_flux) ) - fms_stock_constants_ocn_stock(ISTOCK_WATER)%dq_IN(ISTOCK_TOP ) = fms_stock_constants_ocn_stock(ISTOCK_WATER)%dq_IN(ISTOCK_TOP ) + from_dq * Dt_cpl + from_dq = SUM(ocean_cell_area * wet * (Ice_Ocean_Boundary%lprec+Ice_Ocean_Boundary%fprec-Ice_Ocean_Boundary%q_flux)) + fms_stock_constants_ocn_stock(ISTOCK_WATER)%dq_IN(ISTOCK_TOP ) = & + fms_stock_constants_ocn_stock(ISTOCK_WATER)%dq_IN(ISTOCK_TOP ) + from_dq * Dt_cpl from_dq = SUM( ocean_cell_area * wet * (Ice_Ocean_Boundary%runoff+Ice_Ocean_Boundary%calving) ) - fms_stock_constants_ocn_stock(ISTOCK_WATER)%dq_IN(ISTOCK_SIDE ) = fms_stock_constants_ocn_stock(ISTOCK_WATER)%dq_IN(ISTOCK_SIDE ) + from_dq * Dt_cpl + fms_stock_constants_ocn_stock(ISTOCK_WATER)%dq_IN(ISTOCK_SIDE ) = & + fms_stock_constants_ocn_stock(ISTOCK_WATER)%dq_IN(ISTOCK_SIDE ) + from_dq * Dt_cpl ! sensible heat + shortwave + longwave + latent heat @@ -576,7 +593,8 @@ subroutine flux_ocean_from_ice_stocks(ocean_state,Ocean,Ice_Ocean_boundary) - (Ice_Ocean_Boundary%fprec + Ice_Ocean_Boundary%calving)*HLF & - Ice_Ocean_Boundary%t_flux - Ice_Ocean_Boundary%q_flux*HLV )) - fms_stock_constants_ocn_stock(ISTOCK_HEAT)%dq_IN(ISTOCK_SIDE ) = fms_stock_constants_ocn_stock(ISTOCK_HEAT)%dq_IN(ISTOCK_SIDE ) + from_dq * Dt_cpl + fms_stock_constants_ocn_stock(ISTOCK_HEAT)%dq_IN(ISTOCK_SIDE ) = & + fms_stock_constants_ocn_stock(ISTOCK_HEAT)%dq_IN(ISTOCK_SIDE ) + from_dq * Dt_cpl ! heat carried by river + pme (assuming reference temperature of 0 degC and river/pme temp = surface temp) ! Note: it does not matter what the ref temperature is but it must be consistent with that in OCN and ICE @@ -586,21 +604,25 @@ subroutine flux_ocean_from_ice_stocks(ocean_state,Ocean,Ice_Ocean_boundary) +Ice_Ocean_Boundary%calving * t_calving & +Ice_Ocean_Boundary%runoff * t_runoff )) - fms_stock_constants_ocn_stock(ISTOCK_HEAT)%dq_IN(ISTOCK_SIDE ) = fms_stock_constants_ocn_stock(ISTOCK_HEAT)%dq_IN(ISTOCK_SIDE ) + from_dq * Dt_cpl + fms_stock_constants_ocn_stock(ISTOCK_HEAT)%dq_IN(ISTOCK_SIDE ) = & + fms_stock_constants_ocn_stock(ISTOCK_HEAT)%dq_IN(ISTOCK_SIDE ) + from_dq * Dt_cpl ! Bottom heat flux from_dq = - SUM( ocean_cell_area * wet * btfHeat) - fms_stock_constants_ocn_stock(ISTOCK_HEAT)%dq_IN( ISTOCK_BOTTOM ) = fms_stock_constants_ocn_stock(ISTOCK_HEAT)%dq_IN(ISTOCK_BOTTOM ) + from_dq * Dt_cpl + fms_stock_constants_ocn_stock(ISTOCK_HEAT)%dq_IN( ISTOCK_BOTTOM ) = & + fms_stock_constants_ocn_stock(ISTOCK_HEAT)%dq_IN(ISTOCK_BOTTOM ) + from_dq * Dt_cpl ! Frazil heat from_dq = SUM( ocean_cell_area *wet * Ocean%frazil ) - fms_stock_constants_ocn_stock(ISTOCK_HEAT)%dq_IN(ISTOCK_SIDE ) = fms_stock_constants_ocn_stock(ISTOCK_HEAT)%dq_IN(ISTOCK_SIDE ) + from_dq + fms_stock_constants_ocn_stock(ISTOCK_HEAT)%dq_IN(ISTOCK_SIDE ) = & + fms_stock_constants_ocn_stock(ISTOCK_HEAT)%dq_IN(ISTOCK_SIDE ) + from_dq !SALT flux from_dq = SUM( ocean_cell_area * wet * ( -Ice_Ocean_Boundary%salt_flux)) - fms_stock_constants_ocn_stock(ISTOCK_SALT)%dq_IN(ISTOCK_TOP ) = fms_stock_constants_ocn_stock(ISTOCK_SALT)%dq_IN(ISTOCK_TOP ) + from_dq * Dt_cpl + fms_stock_constants_ocn_stock(ISTOCK_SALT)%dq_IN(ISTOCK_TOP ) = & + fms_stock_constants_ocn_stock(ISTOCK_SALT)%dq_IN(ISTOCK_TOP ) + from_dq * Dt_cpl end subroutine flux_ocean_from_ice_stocks diff --git a/full/land_ice_flux_exchange.F90 b/full/land_ice_flux_exchange.F90 index 7a6e6312..6240a4ad 100644 --- a/full/land_ice_flux_exchange.F90 +++ b/full/land_ice_flux_exchange.F90 @@ -105,8 +105,8 @@ subroutine flux_land_to_ice( Time, Land, Ice, Land_Ice_Boundary ) type(land_data_type), intent(in) :: Land !< A derived data type to specify land boundary data type(ice_data_type), intent(in) :: Ice !< A derived data type to specify ice boundary data !real, dimension(:,:), intent(out) :: runoff_ice, calving_ice - type(land_ice_boundary_type), intent(inout):: Land_Ice_Boundary !< A derived data type to specify properties and fluxes passed - !! from land to ice + type(land_ice_boundary_type), intent(inout):: Land_Ice_Boundary !< A derived data type to specify properties and + !! fluxes passed from land to ice integer :: ier real, dimension(n_xgrid_runoff) :: ex_runoff, ex_calving, ex_runoff_hflx, ex_calving_hflx @@ -140,7 +140,8 @@ subroutine flux_land_to_ice( Time, Land, Ice, Land_Ice_Boundary ) ! compute stock increment ice_buf(:,:,1) = Land_Ice_Boundary%runoff + Land_Ice_Boundary%calving - call fms_xgrid_stock_move(from=fms_stock_constants_lnd_stock(ISTOCK_WATER), to=fms_stock_constants_ice_stock(ISTOCK_WATER), & + call fms_xgrid_stock_move(from=fms_stock_constants_lnd_stock(ISTOCK_WATER), & + & to=fms_stock_constants_ice_stock(ISTOCK_WATER), & & grid_index=X2_GRID_ICE, & & stock_data3d=ice_buf, & & xmap=xmap_runoff, & diff --git a/shared/surface_flux.F90 b/shared/surface_flux.F90 index 16036c0f..b0f4fd7e 100644 --- a/shared/surface_flux.F90 +++ b/shared/surface_flux.F90 @@ -157,26 +157,27 @@ module surface_flux_mod character(len=32) :: rough_scheme_ocean !< ocean roughness length scheme to be read from ocean_rough_nml ! ---- namelist with default values ------------------------------------------ -logical :: no_neg_q = .false. !< If a_atm_in (specific humidity) is negative (because of numerical truncation), - !! then override with 0.0 -logical :: use_virtual_temp = .true. !< If .TRUE., use virtual potential temp to calculate the stability of the surface - !! layer. If .FALSE., use potential temp. -logical :: alt_gustiness = .false. !< An alternaive formulation for gustiness calculation. A minimum bound on the wind - !! speed used influx calculations, with the bound equal to gust_const -logical :: old_dtaudv = .false. !< The derivative of surface wind stress with respect to the zonal wind and meridional - !! wind are approximated by the same tendency -logical :: use_mixing_ratio = .false. !< An option to provide capability to run the Manabe Climate form of the surface flux - !! (coded for legacy purposes). +logical :: no_neg_q = .false. !< If a_atm_in (specific humidity) is negative + !! (because of numerical truncation), then override with 0.0 +logical :: use_virtual_temp = .true. !< If .TRUE., use virtual potential temp to calculate the stability of the + !! surface layer. If .FALSE., use potential temp. +logical :: alt_gustiness = .false. !< An alternaive formulation for gustiness calculation. A minimum bound on + !! the wind speed used influx calculations,with the bound equal to gust_const +logical :: old_dtaudv = .false. !< The derivative of surface wind stress with respect to the zonal wind and + !! meridional wind are approximated by the same tendency +logical :: use_mixing_ratio = .false. !< An option to provide capability to run the Manabe Climate form of the + !! surface flux (coded for legacy purposes). real :: gust_const = 1.0 !< Constant for alternative gustiness calculation real :: gust_min = 0.0 !< Minimum gustiness used when alt_gustiness is .FALSE. -logical :: ncar_ocean_flux = .false. !< Use NCAR climate model turbulent flux calculation described by Large and Yeager, - !! NCAR Technical Document, 2004 -logical :: ncar_ocean_flux_orig = .false. !< Use NCAR climate model turbulent flux calculation described by Large and Yeager, - !! NCAR Technical Document, 2004, using the original GFDL implementation, which - !! contains a bug in the specification of the exchange coefficient for the sensible - !! heat. This option is available for legacy purposes, and is not recommended for - !! new experiments. -logical :: ncar_ocean_flux_multilevel = .false. !< Use NCAR climate model turbulent flux calculation described by Large and Yeager, allows for different reference height for wind, temp and spec. hum. +logical :: ncar_ocean_flux = .false. !< Use NCAR climate model turbulent flux calculation described by Large and + !! Yeager, NCAR Technical Document, 2004 +logical :: ncar_ocean_flux_orig = .false. !< Use NCAR climate model turbulent flux calculation described by Large and + !! Yeager, NCAR Technical Document, 2004, using the original GFDL + !! implementation, which contains a bug in the specification of the exchange + !! coefficient for the sensible heat. This option is available for legacy + !! purposes, and is not recommended for new experiments. +logical :: ncar_ocean_flux_multilevel = .false. !< Use NCAR climate model turbulent flux calculation described by Large + !! and Yeager, allows for different reference height for wind, temp and spec. hum. logical :: do_iter_monin_obukhov = .false. !< If .TRUE, call monin obukhov funtcions a couple of times to update !! rough_mom, rough_heat, rough_moist, cd, ch, b_star, u_star logical :: use_u10_neutral = .false. !< If .TRUE., use 10m neutral wind rather than the standard 10m wind @@ -186,8 +187,8 @@ module surface_flux_mod real :: bulk_zq = 10. !< Reference height for atm humidity (meters) logical :: raoult_sat_vap = .false. !< Reduce saturation vapor pressure to account for seawater logical :: do_simple = .false. -integer :: niter_monin_obukhov = 5 !< iteration times to call iter_monin_obukhov_ocean. Typically 3-5 times should converge -! +integer :: niter_monin_obukhov = 5 !< iteration times to call iter_monin_obukhov_ocean. + !! Typically 3-5 times should converge namelist /surface_flux_nml/ no_neg_q, & use_virtual_temp, & @@ -226,7 +227,8 @@ subroutine surface_flux_1d ( & dt, land, seawater, avail ) ! ---- arguments ----------------------------------------------------------- logical, intent(in), dimension(:) :: land, & !< Indicates where land exists (.TRUE. if exchange cell is on land - seawater, & !< Indicates where liquid ocean water exists (.TRUE. if exchange cell is on liquid ocean water) + seawater, & !< Indicates where liquid ocean water exists + !! (.TRUE. if exchange cell is on liquid ocean water) avail !< .TRUE. where the exchange cell is active real, intent(in), dimension(:) :: t_atm, & !< Air temp lowest atmospheric level. q_atm_in, & !< Mixing ratio at lowest atmospheric level (kg/kg). @@ -252,8 +254,10 @@ subroutine surface_flux_1d ( & drdt_surf, & !< Radiative energy flux temperature sensitivity dhdt_atm, & !< Derivative of sensible heat flux over temp at the lowest atmos level dedq_atm, & !< Derivative of water vapor flux over temp at the lowest atmos level - dtaudu_atm, & !< Derivative of zonal wind stress with respect to the lowest level zonal wind speed of the atmos - dtaudv_atm, & !< Derivative of meridional wind stress with respect to the lowest level meridional wind speed of the atmos + dtaudu_atm, & !< Derivative of zonal wind stress with respect to the lowest level + !! zonal wind speed of the atmos + dtaudv_atm, & !< Derivative of meridional wind stress with respect to the lowest + !! level meridional wind speed of the atmos w_atm, & !< Absolute wind at the lowest atmospheric level u_star, & !< Turbulent velocity scale b_star, & !< Turbulent buoyant scale @@ -512,7 +516,8 @@ subroutine surface_flux_0d ( & ! ---- arguments ----------------------------------------------------------- logical, intent(in) :: land_0, & !< Indicates where land exists (.TRUE. if exchange cell is on land - seawater_0, & !< Indicates where liquid ocean water exists (.TRUE. if exchange cell is on liquid ocean water) + seawater_0, & !< Indicates where liquid ocean water exists + !! (.TRUE. if exchange cell is on liquid ocean water) avail_0 !< .TRUE. where the exchange cell is active real, intent(in) :: t_atm_0, & !< Air temp lowest atmospheric level. q_atm_0, & !< Mixing ratio at lowest atmospheric level (kg/kg). @@ -541,8 +546,10 @@ subroutine surface_flux_0d ( & drdt_surf_0, & !< Radiative energy flux temperature sensitivity dhdt_atm_0, & !< Derivative of sensible heat flux over temp at the lowest atmos level dedq_atm_0, & !< Derivative of water vapor flux over temp at the lowest atmos level - dtaudu_atm_0, & !< Derivative of zonal wind stress with respect to the lowest level zonal wind speed of the atmos - dtaudv_atm_0, & !< Derivative of meridional wind stress with respect to the lowest level meridional wind speed of the atmos + dtaudu_atm_0, & !< Derivative of zonal wind stress with respect to the lowest level zonal wind + !! speed of the atmos + dtaudv_atm_0, & !< Derivative of meridional wind stress with respect to the lowest level + !! meridional wind speed of the atmos w_atm_0, & !< Absolute wind at the lowest atmospheric level u_star_0, & !< Turbulent velocity scale b_star_0, & !< Turbulent buoyant scale @@ -649,7 +656,8 @@ subroutine surface_flux_2d ( & ! ---- arguments ----------------------------------------------------------- logical, intent(in), dimension(:,:) :: land, & !< Indicates where land exists (.TRUE. if exchange cell is on land - seawater, & !< Indicates where liquid ocean water exists (.TRUE. if exchange cell is on liquid ocean water) + seawater, & !< Indicates where liquid ocean water exists + !! (.TRUE. if exchange cell is on liquid ocean water) avail !< .TRUE. where the exchange cell is active real, intent(in), dimension(:,:) :: t_atm, & !< Air temp lowest atmospheric level. q_atm_in, & !< Mixing ratio at lowest atmospheric level (kg/kg). @@ -673,10 +681,13 @@ subroutine surface_flux_2d ( & dedt_surf, & !< Moisture flux temperature sensitivity dedq_surf, & !< Moisture flux humidity sensitivity drdt_surf, & !< Radiative energy flux temperature sensitivity - dhdt_atm, & !< Derivative of sensible heat flux over temp at the lowest atmos level + dhdt_atm, & !< Derivative of sensible heat flux over temp at the lowest + !! atmos level dedq_atm, & !< Derivative of water vapor flux over temp at the lowest atmos level - dtaudu_atm, & !< Derivative of zonal wind stress with respect to the lowest level zonal wind speed of the atmos - dtaudv_atm, & !< Derivative of meridional wind stress with respect to the lowest level meridional wind speed of the atmos + dtaudu_atm, & !< Derivative of zonal wind stress with respect to the lowest level + !! zonal wind speed of the atmos + dtaudv_atm, & !< Derivative of meridional wind stress with respect to the lowest + !! level meridional wind speed of the atmos w_atm, & !< Absolute wind at the lowest atmospheric level u_star, & !< Turbulent velocity scale b_star, & !< Turbulent buoyant scale @@ -928,7 +939,7 @@ subroutine ncar_ocean_fluxes_multilevel (u_del, t, ts, q, qs, zu, zt, zq, avail, do i=1,size(u_del(:)) if (avail(i)) then - u = max(u_del(i), 0.5) ! 0.5 m/s floor on wind (undocumented NCAR) + u = max(u_del(i), 0.5) ! 0.5 m/s floor on wind (undocumented NCAR) u10 = u ! first guess 10m wind t10 = t(i) ! first guess: T(z=10) = T(zt) q10 = q(i) ! first guess: Q(z=10) = Q(zq) @@ -939,7 +950,7 @@ subroutine ncar_ocean_fluxes_multilevel (u_del, t, ts, q, qs, zu, zt, zq, avail, stab = 0.5 + sign(0.5,t10-ts(i)) ch_n10 = (18.0*stab+32.7*(1-stab))*cd_n10_rt/1e3 ! L-Y eqn. 6c - cd(i) = cd_n10 ! first guess for exchange coeff's at z + cd(i) = cd_n10 ! first guess for exchange coeff's at z ch(i) = ch_n10 ce(i) = ce_n10 do kiter=1,n_itts ! loop twice diff --git a/simple/coupler_main.F90 b/simple/coupler_main.F90 index 3c199ede..ec33878e 100644 --- a/simple/coupler_main.F90 +++ b/simple/coupler_main.F90 @@ -113,12 +113,14 @@ program coupler_main !----------------------------------------------------------------------- - integer, dimension(6) :: current_date = (/ 0, 0, 0, 0, 0, 0 /) !< The date that the current integration starts with. (See - !! force_date_from_namelist.) - character(len=17) :: calendar = ' ' !< The calendar type used by the current integration. Valid values are - !! consistent with the time_manager module: 'gregorian', 'julian', 'noleap', or 'thirty_day'. - !! The value 'no_calendar' cannot be used because the time_manager's date - !! functions are used. All values must be lower case. + integer, dimension(6) :: current_date = (/ 0, 0, 0, 0, 0, 0 /) !< The date that the current integration starts + !! with. (See force_date_from_namelist.) + character(len=17) :: calendar = ' ' !< The calendar type used by the current integration. + !! Valid values are consistent with the time_manager module: + !! 'gregorian', 'julian', 'noleap', or 'thirty_day'. + !! The value 'no_calendar' cannot be used because the + !! time_manager's date functions are used. + !! All values must be lower case. logical :: force_date_from_namelist = .false. !> override restart values for date integer :: months=0 !< Number of months the current integration will be run integer :: days=0 !< Number of days the current integration will be run @@ -386,7 +388,8 @@ subroutine coupler_init !----------------------------------------------------------------------- !----- write time stamps (for start time and end time) ------ - if ( fms_mpp_pe().EQ.fms_mpp_root_pe() ) open(newunit = time_stamp_unit, file='time_stamp.out', status='replace', form='formatted') + if ( fms_mpp_pe().EQ.fms_mpp_root_pe() ) & + open(newunit = time_stamp_unit, file='time_stamp.out', status='replace', form='formatted') month = fms_time_manager_month_name(date(2)) if ( fms_mpp_pe() == fms_mpp_root_pe() ) write (time_stamp_unit,20) date, month(1:3) diff --git a/simple/flux_exchange.F90 b/simple/flux_exchange.F90 index 175c4890..97083b64 100644 --- a/simple/flux_exchange.F90 +++ b/simple/flux_exchange.F90 @@ -617,10 +617,14 @@ subroutine flux_up_to_atmos (Time, Land, Ice, Boundary ) Boundary%dt_tr(:,:,isphum) = f_q_delt_n + dt_t_surf*e_q_n endwhere -!print *, 'PE,dt_t(L)(mn,mx)=',fms_mpp_pe(),minval(Boundary%dt_t,mask=Land%mask(:,:,1)),maxval(Boundary%dt_t,mask=Land%mask(:,:,1)) -!print *, 'PE,dt_q(L)(mn,mx)=',fms_mpp_pe(),minval(Boundary%dt_q,mask=Land%mask(:,:,1)),maxval(Boundary%dt_q,mask=Land%mask(:,:,1)) -!print *, 'PE,dt_t(I)(mn,mx)=',fms_mpp_pe(),minval(Boundary%dt_t,mask=Ice%mask),maxval(Boundary%dt_t,mask=Ice%mask) -!print *, 'PE,dt_q(I)(mn,mx)=',fms_mpp_pe(),minval(Boundary%dt_q,mask=Ice%mask),maxval(Boundary%dt_q,mask=Ice%mask) +#ifdef DEBUG_COUPLER_FLUX_TO_ATMOS +print *, 'PE,dt_t(L)(mn,mx)=',fms_mpp_pe(),minval(Boundary%dt_t,mask=Land%mask(:,:,1)), & + maxval(Boundary%dt_t,mask=Land%mask(:,:,1)) +print *, 'PE,dt_q(L)(mn,mx)=',fms_mpp_pe(),minval(Boundary%dt_q,mask=Land%mask(:,:,1)), & + maxval(Boundary%dt_q,mask=Land%mask(:,:,1)) +print *, 'PE,dt_t(I)(mn,mx)=',fms_mpp_pe(),minval(Boundary%dt_t,mask=Ice%mask),maxval(Boundary%dt_t,mask=Ice%mask) +print *, 'PE,dt_q(I)(mn,mx)=',fms_mpp_pe(),minval(Boundary%dt_q,mask=Ice%mask),maxval(Boundary%dt_q,mask=Ice%mask) +#endif !======================================================================= !-------------------- diagnostics section ------------------------------ diff --git a/simple/ice_model.F90 b/simple/ice_model.F90 index 24a037fc..5d31f3cb 100644 --- a/simple/ice_model.F90 +++ b/simple/ice_model.F90 @@ -57,39 +57,39 @@ module ice_model_mod logical :: use_climo_sst = .false. logical :: use_annual_sst = .false. character(len=64) :: ice_method = 'prognostic' ! none, uniform, or prognostic -character(len=64) :: sst_method = 'specified' ! specified, uniform, or mixed_layer - ! Additional sst specifications: 'aqua_planet_#' test cases are derived - ! from the 2000 paper by Neale and Hoskins, 'A standard test for AGCMs including - ! their physical parameterizations: I. The proposal, Atmospheric Science Letters'. - ! The 'aqua_planet_1' testcase corresponds to the 'Control' SST test case and - ! provides the pattern which is shifted for the subsequent cases. - ! The test cases Control, and aqua_planet_5N-aqua_planet_60N were documented and used - ! in Burnett et al., 2021, GRL, https://doi.org/10.1029/2020GL091980 - ! aqua_planet_1 = Control profile - ! aqua_planet_2 = Peaked - ! aqua_planet_3 = Flat - ! aqua_planet_4 = Qobs - ! aqua_planet_5 = Control shifted by 5N - ! aqua_planet_6 = 1KEQ - ! aqua_planet_7 = 3KEQ - ! aqua_planet_8 = 3KW1 - ! aqua_planet_10N = Control shifted by 10N - ! aqua_planet_15N = Control shifted by 15N - ! aqua_planet_20N = Control shifted by 20N - ! aqua_planet_25N = Control shifted by 25N - ! aqua_planet_30N = Control shifted by 20N - ! aqua_planet_35N = Control shifted by 35N - ! aqua_planet_40N = Control shifted by 30N - ! aqua_planet_45N = Control shifted by 45N - ! aqua_planet_50N = Control shifted by 50N - ! aqua_planet_55N = Control shifted by 55N - ! aqua_planet_60N = Control shifted by 60N - ! aqua_planet_65N = Control shifted by 65N - ! aqua_planet_70N = Control shifted by 70N - ! aqua_planet_75N = Control shifted by 75N - ! aqua_planet_80N = Control shifted by 80N - ! aqua_planet_85N = Control shifted by 85N - ! aqua_planet_90N = Control shifted by 90N +character(len=64) :: sst_method = 'specified' !> specified, uniform, or mixed_layer + !! Additional sst specifications: 'aqua_planet_#' test cases are derived + !! from the 2000 paper by Neale and Hoskins, 'A standard test for AGCMs including + !! their physical parameterizations: I. The proposal, Atmospheric Science Letters'. + !! The 'aqua_planet_1' testcase corresponds to the 'Control' SST test case and + !! provides the pattern which is shifted for the subsequent cases. + !! The test cases Control, and aqua_planet_5N-aqua_planet_60N were documented and used + !! in Burnett et al., 2021, GRL, https://doi.org/10.1029/2020GL091980 + !! aqua_planet_1 = Control profile + !! aqua_planet_2 = Peaked + !! aqua_planet_3 = Flat + !! aqua_planet_4 = Qobs + !! aqua_planet_5 = Control shifted by 5N + !! aqua_planet_6 = 1KEQ + !! aqua_planet_7 = 3KEQ + !! aqua_planet_8 = 3KW1 + !! aqua_planet_10N = Control shifted by 10N + !! aqua_planet_15N = Control shifted by 15N + !! aqua_planet_20N = Control shifted by 20N + !! aqua_planet_25N = Control shifted by 25N + !! aqua_planet_30N = Control shifted by 20N + !! aqua_planet_35N = Control shifted by 35N + !! aqua_planet_40N = Control shifted by 30N + !! aqua_planet_45N = Control shifted by 45N + !! aqua_planet_50N = Control shifted by 50N + !! aqua_planet_55N = Control shifted by 55N + !! aqua_planet_60N = Control shifted by 60N + !! aqua_planet_65N = Control shifted by 65N + !! aqua_planet_70N = Control shifted by 70N + !! aqua_planet_75N = Control shifted by 75N + !! aqua_planet_80N = Control shifted by 80N + !! aqua_planet_85N = Control shifted by 85N + !! aqua_planet_90N = Control shifted by 90N real :: temp_ice = 270. ! used when ice_method = 'uniform' real :: temp_sst = 280. ! used when sst_method = 'uniform' real :: sst_anom = 0. ! sst perturbation used for sensitivity experiments @@ -1104,7 +1104,8 @@ subroutine ice_model_init ( Ice, Time_Init, Time, & endif endif -print *, 'pe,count(ice,all,ocean)=',fms_mpp_pe(),count(Ice%ice_mask),count(Ice%mask),count(Ice%mask .and. .not.Ice%ice_mask) +print *, 'pe,count(ice,all,ocean)=',fms_mpp_pe(),count(Ice%ice_mask),count(Ice%mask), & + count(Ice%mask .and. .not.Ice%ice_mask) ! add on non-zero sea surface temperature perturbation (namelist option) ! this perturbation may be useful in accessing model sensitivities From 2a39e28b6bda23b627c465ef412b16f302b2eade Mon Sep 17 00:00:00 2001 From: rem1776 Date: Fri, 5 Jul 2024 10:58:03 -0400 Subject: [PATCH 3/6] fix linter limit --- .github/workflows/lint.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 5dc2634e..71f0bc90 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -10,3 +10,5 @@ jobs: uses: actions/checkout@v2 - name: Run linter uses: NOAA-GFDL/simple_lint@f5aa1fe976bd4c231db0536ba00cbfdc26708253 + with: + ftn_line_len: 121 From 4a71effbe0d5beaa5e0269fa3b1861ecaac491fd Mon Sep 17 00:00:00 2001 From: rem1776 Date: Fri, 5 Jul 2024 11:18:39 -0400 Subject: [PATCH 4/6] undo change to pdf --- full/earth_system_model.pdf | Bin 112912 -> 112975 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/full/earth_system_model.pdf b/full/earth_system_model.pdf index 562b712d50466fec6aba09c39495e21c4acb6b09..3aa2e3e29273083c135fee48eade6726a6b4ba09 100644 GIT binary patch delta 1176 zcmZWoJ5Iwu6qF@|1Rdf67E%f--fz8c@4+!pt`H$E0F{rBf(F7b1sw<(aC*V0D zwlm%)(RgM(Z|3=abNszIep=3|`eivgx{061hp)Oixtp&(=Bw(rx~xxWdooF`xBu$- z9wQRzvG(@0I$!J`Wip_19HpMVzm}5%RvJkLST524kD1CuyC5e=F=fdKE@a~}G2?8A zu?h1;tAaey%<%c|^+p~2a8kNQj29K{P1c#w@Sa!gegkZ+*%f^5@%we1Pf;sj8FXS|8ru|%3*MGC~ B>aYL+ delta 1163 zcmZWoJ5EC}5L6_Tf>WePzdzf%_uvvp2q`Cc1s8ydBS3?Mk|OjRfRoUqrD6RbN<498 zjdr{6+%#NZM+?t?vIJA`yU`$pC6( zBa!ncVHFo0p{P>wt*Q4swrnAFEMulXCOP?q3Tb70pN#`mI2%AbnJ^<$1dwG(^)WBiuBkr~v0 znN>7B|2B^6C!& From 332ad0d7f363b957ec79fc58f58afb8427e84ce0 Mon Sep 17 00:00:00 2001 From: rem1776 Date: Fri, 5 Jul 2024 12:49:46 -0400 Subject: [PATCH 5/6] fix a typo --- full/flux_exchange.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/full/flux_exchange.F90 b/full/flux_exchange.F90 index d3d9ea72..95ba9e8c 100644 --- a/full/flux_exchange.F90 +++ b/full/flux_exchange.F90 @@ -356,7 +356,7 @@ !! Atm%Surf_Diff%delta_q & ! increment ((i+1) = (i-1) for leapfrog) in specific humidity of !! ! lowest atmospheric layer (nondimensional -- Kg/Kg) !! Atm%Surf_Diff%dflux_t & ! derivative of implicit part of downward temperature flux at top of -!! ! lowestatmospheric layer with respect to temperature +!! ! lowest atmospheric layer with respect to temperature !! ! of lowest atmospheric layer (Kg/(m2 s)) !! Atm%Surf_Diff%dflux_q ! derivative of implicit part of downward moisture flux at top of !! ! lowest atmospheric layer with respect to specific humidity of From 408f90d66422a3ca86e35cc3a482b03fa4d191c6 Mon Sep 17 00:00:00 2001 From: rem1776 Date: Mon, 8 Jul 2024 15:15:14 -0400 Subject: [PATCH 6/6] update changelog and remove debug macro --- CHANGELOG.md | 3 ++- simple/flux_exchange.F90 | 8 -------- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 59dd3e7e..fca6a5dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -155,7 +155,8 @@ sequential patch number (starting from `01`). were written by default. - FMS2_io does not do this. Users can specify real long_names and units by calling register_variable_attribute. ### Removed -- FMS_io was almost completely removed from FMScoupler and replaced with fms2_io. +- FMS_io was almost completely removed from FMScoupler and replaced with fms2_io + - The only remaining usage is `fms_io_exit` calls. These calls are made at the end of each coupler driver and only called if the CPP macro `use_deprecated_io` is set. ### Tag Commit Hashes - 2021.02-alpha1 (c1c8044a6c3efb8ddbbd01a3769bbf2610b34937) - 2021.02-alpha2 (c1c8044a6c3efb8ddbbd01a3769bbf2610b34937) diff --git a/simple/flux_exchange.F90 b/simple/flux_exchange.F90 index 97083b64..307a45b5 100644 --- a/simple/flux_exchange.F90 +++ b/simple/flux_exchange.F90 @@ -617,14 +617,6 @@ subroutine flux_up_to_atmos (Time, Land, Ice, Boundary ) Boundary%dt_tr(:,:,isphum) = f_q_delt_n + dt_t_surf*e_q_n endwhere -#ifdef DEBUG_COUPLER_FLUX_TO_ATMOS -print *, 'PE,dt_t(L)(mn,mx)=',fms_mpp_pe(),minval(Boundary%dt_t,mask=Land%mask(:,:,1)), & - maxval(Boundary%dt_t,mask=Land%mask(:,:,1)) -print *, 'PE,dt_q(L)(mn,mx)=',fms_mpp_pe(),minval(Boundary%dt_q,mask=Land%mask(:,:,1)), & - maxval(Boundary%dt_q,mask=Land%mask(:,:,1)) -print *, 'PE,dt_t(I)(mn,mx)=',fms_mpp_pe(),minval(Boundary%dt_t,mask=Ice%mask),maxval(Boundary%dt_t,mask=Ice%mask) -print *, 'PE,dt_q(I)(mn,mx)=',fms_mpp_pe(),minval(Boundary%dt_q,mask=Ice%mask),maxval(Boundary%dt_q,mask=Ice%mask) -#endif !======================================================================= !-------------------- diagnostics section ------------------------------