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/.github/workflows/lint.yml b/.github/workflows/lint.yml
index c186dc1e..71f0bc90 100644
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
@@ -9,4 +9,6 @@ jobs:
- name: Checkout code
uses: actions/checkout@v2
- name: Run linter
- uses: NOAA-GFDL/simple_lint@v2
+ uses: NOAA-GFDL/simple_lint@f5aa1fe976bd4c231db0536ba00cbfdc26708253
+ with:
+ ftn_line_len: 121
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5abf2147..fca6a5dd 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,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)
@@ -168,7 +169,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 d62d404e..9da6da57 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
@@ -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..95ba9e8c 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
+!! ! 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
+!! 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 531dfafe..b0f4fd7e 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
@@ -157,37 +157,38 @@ 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 :: 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 :: 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
!! 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)
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
@@ -727,14 +738,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
@@ -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
@@ -1044,7 +1055,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 +1081,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..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)
@@ -513,7 +516,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..307a45b5 100644
--- a/simple/flux_exchange.F90
+++ b/simple/flux_exchange.F90
@@ -617,10 +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
-!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)
!=======================================================================
!-------------------- diagnostics section ------------------------------
@@ -1204,7 +1200,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..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
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: