Newer
Older
MODULE sbccpl
!!======================================================================
!! *** MODULE sbccpl ***
!! Surface Boundary Condition : momentum, heat and freshwater fluxes in coupled mode
!!======================================================================
!! History : 2.0 ! 2007-06 (R. Redler, N. Keenlyside, W. Park) Original code split into flxmod & taumod
!! 3.0 ! 2008-02 (G. Madec, C Talandier) surface module
!! 3.1 ! 2009_02 (G. Madec, S. Masson, E. Maisonave, A. Caubel) generic coupled interface
!! 3.4 ! 2011_11 (C. Harris) more flexibility + multi-category fields
!! 4.2 ! 2020-12 (G. Madec, E. Clementi) wave coupling updates
!!----------------------------------------------------------------------
!!----------------------------------------------------------------------
!! namsbc_cpl : coupled formulation namlist
!! sbc_cpl_init : initialisation of the coupled exchanges
!! sbc_cpl_rcv : receive fields from the atmosphere over the ocean (ocean only)
!! receive stress from the atmosphere over the ocean (ocean-ice case)
!! sbc_cpl_ice_tau : receive stress from the atmosphere over ice
!! sbc_cpl_ice_flx : receive fluxes from the atmosphere over ice
!! sbc_cpl_snd : send fields to the atmosphere
!!----------------------------------------------------------------------
USE dom_oce ! ocean space and time domain
USE sbc_oce ! Surface boundary condition: ocean fields
USE trc_oce ! share SMS/Ocean variables
USE sbc_ice ! Surface boundary condition: ice fields
USE sbcapr ! Stochastic param. : ???
USE sbcdcy ! surface boundary condition: diurnal cycle
USE sbcwave ! surface boundary condition: waves
USE phycst ! physical constants
USE isf_oce , ONLY : l_isfoasis, fwfisf_oasis ! ice shelf boundary condition
#if defined key_si3
USE ice ! ice variables
#endif
USE cpl_oasis3 ! OASIS3 coupling
USE geo2ocean !
USE oce
#if defined key_medusa
USE oce , ONLY: CO2Flux_out_cpl, DMS_out_cpl, chloro_out_cpl, &
PCO2a_in_cpl, Dust_in_cpl
#endif
USE ocealb !
USE eosbn2 !
USE sbcrnf , ONLY : l_rnfcpl
USE cpl_rnf_1d, ONLY: nn_cpl_river, cpl_rnf_1d_init, cpl_rnf_1d_to_2d ! Variables used in 1D river outflow
#if defined key_medusa
USE par_trc , ONLY : ln_medusa
#endif
#if defined key_cice
USE ice_domain_size, only: ncat
#endif
#if defined key_si3
USE icevar ! for CALL ice_var_snwblow
#endif
!
USE in_out_manager ! I/O manager
USE iom ! NetCDF library
USE lib_mpp ! distribued memory computing library
USE lbclnk ! ocean lateral boundary conditions (or mpp link)
#if defined key_oasis3
USE mod_oasis, ONLY : OASIS_Sent, OASIS_ToRest, OASIS_SentOut, OASIS_ToRestOut
#endif

Guillaume Samson
committed
USE sbc_phy, ONLY : pp_cldf, rpref
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
IMPLICIT NONE
PRIVATE
PUBLIC sbc_cpl_init ! routine called by sbcmod.F90
PUBLIC sbc_cpl_rcv ! routine called by icestp.F90
PUBLIC sbc_cpl_snd ! routine called by step.F90
PUBLIC sbc_cpl_ice_tau ! routine called by icestp.F90
PUBLIC sbc_cpl_ice_flx ! routine called by icestp.F90
PUBLIC sbc_cpl_alloc ! routine called in sbcice_cice.F90
INTEGER, PARAMETER :: jpr_otx1 = 1 ! 3 atmosphere-ocean stress components on grid 1
INTEGER, PARAMETER :: jpr_oty1 = 2 !
INTEGER, PARAMETER :: jpr_otz1 = 3 !
INTEGER, PARAMETER :: jpr_otx2 = 4 ! 3 atmosphere-ocean stress components on grid 2
INTEGER, PARAMETER :: jpr_oty2 = 5 !
INTEGER, PARAMETER :: jpr_otz2 = 6 !
INTEGER, PARAMETER :: jpr_itx1 = 7 ! 3 atmosphere-ice stress components on grid 1
INTEGER, PARAMETER :: jpr_ity1 = 8 !
INTEGER, PARAMETER :: jpr_itz1 = 9 !
INTEGER, PARAMETER :: jpr_itx2 = 10 ! 3 atmosphere-ice stress components on grid 2
INTEGER, PARAMETER :: jpr_ity2 = 11 !
INTEGER, PARAMETER :: jpr_itz2 = 12 !
INTEGER, PARAMETER :: jpr_qsroce = 13 ! Qsr above the ocean
INTEGER, PARAMETER :: jpr_qsrice = 14 ! Qsr above the ice
INTEGER, PARAMETER :: jpr_qsrmix = 15
INTEGER, PARAMETER :: jpr_qnsoce = 16 ! Qns above the ocean
INTEGER, PARAMETER :: jpr_qnsice = 17 ! Qns above the ice
INTEGER, PARAMETER :: jpr_qnsmix = 18
INTEGER, PARAMETER :: jpr_rain = 19 ! total liquid precipitation (rain)
INTEGER, PARAMETER :: jpr_snow = 20 ! solid precipitation over the ocean (snow)
INTEGER, PARAMETER :: jpr_tevp = 21 ! total evaporation
INTEGER, PARAMETER :: jpr_ievp = 22 ! solid evaporation (sublimation)
INTEGER, PARAMETER :: jpr_sbpr = 23 ! sublimation - liquid precipitation - solid precipitation
INTEGER, PARAMETER :: jpr_semp = 24 ! solid freshwater budget (sublimation - snow)
INTEGER, PARAMETER :: jpr_oemp = 25 ! ocean freshwater budget (evap - precip)
INTEGER, PARAMETER :: jpr_w10m = 26 ! 10m wind
INTEGER, PARAMETER :: jpr_dqnsdt = 27 ! d(Q non solar)/d(temperature)
INTEGER, PARAMETER :: jpr_rnf = 28 ! runoffs
INTEGER, PARAMETER :: jpr_cal = 29 ! calving
INTEGER, PARAMETER :: jpr_taum = 30 ! wind stress module
INTEGER, PARAMETER :: jpr_co2 = 31
INTEGER, PARAMETER :: jpr_topm = 32 ! topmeltn
INTEGER, PARAMETER :: jpr_botm = 33 ! botmeltn
INTEGER, PARAMETER :: jpr_sflx = 34 ! salt flux
INTEGER, PARAMETER :: jpr_toce = 35 ! ocean temperature
INTEGER, PARAMETER :: jpr_soce = 36 ! ocean salinity
INTEGER, PARAMETER :: jpr_ocx1 = 37 ! ocean current on grid 1
INTEGER, PARAMETER :: jpr_ocy1 = 38 !
INTEGER, PARAMETER :: jpr_ssh = 39 ! sea surface height
INTEGER, PARAMETER :: jpr_fice = 40 ! ice fraction
INTEGER, PARAMETER :: jpr_e3t1st = 41 ! first T level thickness
INTEGER, PARAMETER :: jpr_fraqsr = 42 ! fraction of solar net radiation absorbed in the first ocean level
INTEGER, PARAMETER :: jpr_mslp = 43 ! mean sea level pressure
!** surface wave coupling **
INTEGER, PARAMETER :: jpr_hsig = 44 ! Hsig
INTEGER, PARAMETER :: jpr_phioc = 45 ! Wave=>ocean energy flux
INTEGER, PARAMETER :: jpr_sdrftx = 46 ! Stokes drift on grid 1
INTEGER, PARAMETER :: jpr_sdrfty = 47 ! Stokes drift on grid 2
INTEGER, PARAMETER :: jpr_wper = 48 ! Mean wave period
INTEGER, PARAMETER :: jpr_wnum = 49 ! Mean wavenumber
INTEGER, PARAMETER :: jpr_wstrf = 50 ! Stress fraction adsorbed by waves
INTEGER, PARAMETER :: jpr_wdrag = 51 ! Neutral surface drag coefficient
INTEGER, PARAMETER :: jpr_charn = 52 ! Chranock coefficient
INTEGER, PARAMETER :: jpr_twox = 53 ! wave to ocean momentum flux
INTEGER, PARAMETER :: jpr_twoy = 54 ! wave to ocean momentum flux
INTEGER, PARAMETER :: jpr_tawx = 55 ! net wave-supported stress
INTEGER, PARAMETER :: jpr_tawy = 56 ! net wave-supported stress
INTEGER, PARAMETER :: jpr_bhd = 57 ! Bernoulli head. waves' induced surface pressure
INTEGER, PARAMETER :: jpr_tusd = 58 ! zonal stokes transport
INTEGER, PARAMETER :: jpr_tvsd = 59 ! meridional stokes tranmport
INTEGER, PARAMETER :: jpr_isf = 60
INTEGER, PARAMETER :: jpr_icb = 61
INTEGER, PARAMETER :: jpr_ts_ice = 62 ! Sea ice surface temp
!!INTEGER, PARAMETER :: jpr_qtrice = 63 ! Transmitted solar thru sea-ice
INTEGER, PARAMETER :: jpr_grnm = 63 ! Greenland ice mass
INTEGER, PARAMETER :: jpr_antm = 64 ! Antarctic ice mass
INTEGER, PARAMETER :: jpr_rnf_1d = 65 ! 1D river runoff
INTEGER, PARAMETER :: jpr_qtr = 66 ! Transmitted solar
#if defined key_medusa
INTEGER, PARAMETER :: jpr_atm_pco2 = 67 ! Incoming atm pCO2 flux
INTEGER, PARAMETER :: jpr_atm_dust = 68 ! Incoming atm aggregate dust
INTEGER, PARAMETER :: jprcv = 69 ! total number of fields received
#else
INTEGER, PARAMETER :: jprcv = 66 ! total number of fields received
#endif
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
INTEGER, PARAMETER :: jps_fice = 1 ! ice fraction sent to the atmosphere
INTEGER, PARAMETER :: jps_toce = 2 ! ocean temperature
INTEGER, PARAMETER :: jps_tice = 3 ! ice temperature
INTEGER, PARAMETER :: jps_tmix = 4 ! mixed temperature (ocean+ice)
INTEGER, PARAMETER :: jps_albice = 5 ! ice albedo
INTEGER, PARAMETER :: jps_albmix = 6 ! mixed albedo
INTEGER, PARAMETER :: jps_hice = 7 ! ice thickness
INTEGER, PARAMETER :: jps_hsnw = 8 ! snow thickness
INTEGER, PARAMETER :: jps_ocx1 = 9 ! ocean current on grid 1
INTEGER, PARAMETER :: jps_ocy1 = 10 !
INTEGER, PARAMETER :: jps_ocz1 = 11 !
INTEGER, PARAMETER :: jps_ivx1 = 12 ! ice current on grid 1
INTEGER, PARAMETER :: jps_ivy1 = 13 !
INTEGER, PARAMETER :: jps_ivz1 = 14 !
INTEGER, PARAMETER :: jps_co2 = 15
INTEGER, PARAMETER :: jps_soce = 16 ! ocean salinity
INTEGER, PARAMETER :: jps_ssh = 17 ! sea surface height
INTEGER, PARAMETER :: jps_qsroce = 18 ! Qsr above the ocean
INTEGER, PARAMETER :: jps_qnsoce = 19 ! Qns above the ocean
INTEGER, PARAMETER :: jps_oemp = 20 ! ocean freshwater budget (evap - precip)
INTEGER, PARAMETER :: jps_sflx = 21 ! salt flux
INTEGER, PARAMETER :: jps_otx1 = 22 ! 2 atmosphere-ocean stress components on grid 1
INTEGER, PARAMETER :: jps_oty1 = 23 !
INTEGER, PARAMETER :: jps_rnf = 24 ! runoffs
INTEGER, PARAMETER :: jps_taum = 25 ! wind stress module
INTEGER, PARAMETER :: jps_fice2 = 26 ! ice fraction sent to OCE (by SAS when doing SAS-OCE coupling)
INTEGER, PARAMETER :: jps_e3t1st = 27 ! first level depth (vvl)
INTEGER, PARAMETER :: jps_fraqsr = 28 ! fraction of solar net radiation absorbed in the first ocean level
INTEGER, PARAMETER :: jps_ficet = 29 ! total ice fraction
INTEGER, PARAMETER :: jps_ocxw = 30 ! currents on grid 1
INTEGER, PARAMETER :: jps_ocyw = 31 ! currents on grid 2
INTEGER, PARAMETER :: jps_wlev = 32 ! water level
INTEGER, PARAMETER :: jps_fice1 = 33 ! first-order ice concentration (for semi-implicit coupling of atmos-ice fluxes)
INTEGER, PARAMETER :: jps_a_p = 34 ! meltpond area fraction
INTEGER, PARAMETER :: jps_ht_p = 35 ! meltpond thickness
INTEGER, PARAMETER :: jps_kice = 36 ! sea ice effective conductivity
INTEGER, PARAMETER :: jps_sstfrz = 37 ! sea surface freezing temperature
INTEGER, PARAMETER :: jps_ttilyr = 38 ! sea ice top layer temp
#if defined key_medusa
INTEGER, PARAMETER :: jps_bio_co2 = 39 ! MEDUSA air-sea CO2 flux
INTEGER, PARAMETER :: jps_bio_dms = 40 ! MEDUSA DMS surface concentration
INTEGER, PARAMETER :: jps_bio_chloro = 41 ! MEDUSA chlorophyll surface concentration
INTEGER, PARAMETER :: jpsnd = 41 ! total number of fields sent
#else
INTEGER, PARAMETER :: jpsnd = 38 ! total number of fields sent
#if ! defined key_oasis3
! Dummy variables to enable compilation when oasis3 is not being used
INTEGER :: OASIS_Sent = -1
INTEGER :: OASIS_SentOut = -1
INTEGER :: OASIS_ToRest = -1
INTEGER :: OASIS_ToRestOut = -1
#endif
! !!** namelist namsbc_cpl **
TYPE :: FLD_C !
CHARACTER(len = 32) :: cldes ! desciption of the coupling strategy
CHARACTER(len = 32) :: clcat ! multiple ice categories strategy
CHARACTER(len = 32) :: clvref ! reference of vector ('spherical' or 'cartesian')
CHARACTER(len = 32) :: clvor ! orientation of vector fields ('eastward-northward' or 'local grid')
CHARACTER(len = 32) :: clvgrd ! grids on which is located the vector fields
END TYPE FLD_C
! ! Send to the atmosphere
TYPE(FLD_C) :: sn_snd_temp , sn_snd_alb , sn_snd_thick, sn_snd_crt , sn_snd_co2, &
& sn_snd_thick1, sn_snd_cond, sn_snd_mpnd , sn_snd_sstfrz, sn_snd_ttilyr
! ! Received from the atmosphere
#if defined key_medusa
TYPE(FLD_C) :: sn_snd_bio_co2, sn_snd_bio_dms, sn_snd_bio_chloro
#endif
TYPE(FLD_C) :: sn_rcv_w10m, sn_rcv_taumod, sn_rcv_tau, sn_rcv_tauw, sn_rcv_dqnsdt, sn_rcv_qsr, &
TYPE(FLD_C) :: sn_rcv_cal, sn_rcv_iceflx, sn_rcv_co2, sn_rcv_mslp, sn_rcv_icb, sn_rcv_isf, &
sn_rcv_grnm, sn_rcv_antm
#if defined key_medusa
TYPE(FLD_C) :: sn_rcv_atm_pco2, sn_rcv_atm_dust
#endif
! Send to waves
TYPE(FLD_C) :: sn_snd_ifrac, sn_snd_crtw, sn_snd_wlev
TYPE(FLD_C) :: sn_rcv_hsig, sn_rcv_phioc, sn_rcv_sdrfx, sn_rcv_sdrfy, sn_rcv_wper, sn_rcv_wnum, &
& sn_rcv_wstrf, sn_rcv_wdrag, sn_rcv_charn, sn_rcv_taw, sn_rcv_bhd, sn_rcv_tusd, sn_rcv_tvsd
! Received from waves
TYPE(FLD_C) :: sn_rcv_tauwoc, sn_rcv_wfreq
! Transmitted solar
TYPE(FLD_C) :: sn_rcv_qtr
! ! Other namelist parameters
!! TYPE(FLD_C) :: sn_rcv_qtrice
INTEGER :: nn_cplmodel ! Maximum number of models to/from which NEMO is potentialy sending/receiving data
LOGICAL :: ln_usecplmask ! use a coupling mask file to merge data received from several models
! -> file cplmask.nc with the float variable called cplmask (jpi,jpj,nn_cplmodel)
LOGICAL :: ln_scale_ice_flux ! use ice fluxes that are already "ice weighted" ( i.e. multiplied ice concentration)
LOGICAL :: ln_couple_ocean_evap ! Do we couple total (ocean+sea ice) evaporation (FALSE)
! or ocean only evaporation (TRUE)
TYPE :: DYNARR
REAL(wp), POINTER, DIMENSION(:,:,:) :: z3
END TYPE DYNARR
TYPE( DYNARR ), SAVE, DIMENSION(jprcv) :: frcv ! all fields recieved from the atmosphere
REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: alb_oce_mix ! ocean albedo sent to atmosphere (mix clear/overcast sky)
INTEGER , ALLOCATABLE, SAVE, DIMENSION(:) :: nrcvinfo ! OASIS info argument
!! Substitution
# include "do_loop_substitute.h90"

sparonuz
committed
# include "single_precision_substitute.h90"
# include "domzgr_substitute.h90"
!!----------------------------------------------------------------------
!! NEMO/OCE 4.0 , NEMO Consortium (2018)

Guillaume Samson
committed
!! $Id: sbccpl.F90 15551 2021-11-28 20:19:36Z gsamson $
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
!! Software governed by the CeCILL license (see ./LICENSE)
!!----------------------------------------------------------------------
CONTAINS
INTEGER FUNCTION sbc_cpl_alloc()
!!----------------------------------------------------------------------
!! *** FUNCTION sbc_cpl_alloc ***
!!----------------------------------------------------------------------
INTEGER :: ierr(4)
!!----------------------------------------------------------------------
ierr(:) = 0
!
ALLOCATE( alb_oce_mix(jpi,jpj), nrcvinfo(jprcv), STAT=ierr(1) )
#if ! defined key_si3 && ! defined key_cice
ALLOCATE( a_i(jpi,jpj,1) , STAT=ierr(2) ) ! used in sbcice_if.F90 (done here as there is no sbc_ice_if_init)
#endif
ALLOCATE( xcplmask(jpi,jpj,0:nn_cplmodel) , STAT=ierr(3) )
!
IF( .NOT. ln_apr_dyn ) ALLOCATE( ssh_ib(jpi,jpj), ssh_ibb(jpi,jpj), apr(jpi, jpj), STAT=ierr(4) )
sbc_cpl_alloc = MAXVAL( ierr )
CALL mpp_sum ( 'sbccpl', sbc_cpl_alloc )
IF( sbc_cpl_alloc > 0 ) CALL ctl_warn('sbc_cpl_alloc: allocation of arrays failed')
!
END FUNCTION sbc_cpl_alloc
SUBROUTINE sbc_cpl_init( k_ice )
!!----------------------------------------------------------------------
!! *** ROUTINE sbc_cpl_init ***
!!
!! ** Purpose : Initialisation of send and received information from
!! the atmospheric component
!!
!! ** Method : * Read namsbc_cpl namelist
!! * define the receive interface
!! * define the send interface
!! * initialise the OASIS coupler
!!----------------------------------------------------------------------
INTEGER, INTENT(in) :: k_ice ! ice management in the sbc (=0/1/2/3)
!
INTEGER :: jn ! dummy loop index
INTEGER :: ios, inum ! Local integer
REAL(wp), DIMENSION(jpi,jpj) :: zacs, zaos
!!
NAMELIST/namsbc_cpl/ nn_cplmodel , ln_usecplmask, nn_cats_cpl , ln_scale_ice_flux, &
& sn_snd_temp , sn_snd_alb , sn_snd_thick, sn_snd_crt , sn_snd_co2 , &
& sn_snd_ttilyr, sn_snd_cond , sn_snd_mpnd , sn_snd_sstfrz, sn_snd_thick1, &
& sn_snd_ifrac , sn_snd_crtw , sn_snd_wlev , sn_rcv_hsig , sn_rcv_phioc , &
& sn_rcv_w10m , sn_rcv_taumod, sn_rcv_tau , sn_rcv_dqnsdt, sn_rcv_qsr , &
& sn_rcv_sdrfx , sn_rcv_sdrfy , sn_rcv_wper , sn_rcv_wnum , sn_rcv_wstrf , &
& sn_rcv_charn , sn_rcv_taw , sn_rcv_bhd , sn_rcv_tusd , sn_rcv_tvsd, &
& sn_rcv_wdrag , sn_rcv_qns , sn_rcv_emp , sn_rcv_rnf , sn_rcv_cal , &
& sn_rcv_iceflx, sn_rcv_co2 , sn_rcv_icb , sn_rcv_isf , sn_rcv_ts_ice, & !!, sn_rcv_qtrice
& sn_rcv_mslp, &
sn_rcv_grnm , sn_rcv_antm , &
& nn_coupled_iceshelf_fluxes , ln_iceshelf_init_atmos , &
& rn_greenland_total_fw_flux , rn_greenland_calving_fraction , &
& rn_antarctica_total_fw_flux , rn_antarctica_calving_fraction , &
#if defined key_medusa
& rn_iceshelf_fluxes_tolerance, &
! Add MEDUSA related fields to namelist
sn_snd_bio_co2 , sn_snd_bio_dms, sn_snd_bio_chloro, &
& sn_rcv_atm_pco2, sn_rcv_atm_dust
#else
& rn_iceshelf_fluxes_tolerance
#endif
!!---------------------------------------------------------------------
!
! ================================ !
! Namelist informations !
! ================================ !
!
IF (ln_timing) CALL timing_start('sbc_cpl_init')
READ ( numnam_ref, namsbc_cpl, IOSTAT = ios, ERR = 901)
901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namsbc_cpl in reference namelist' )
!
READ ( numnam_cfg, namsbc_cpl, IOSTAT = ios, ERR = 902 )
902 IF( ios > 0 ) CALL ctl_nam ( ios , 'namsbc_cpl in configuration namelist' )
IF(lwm) WRITE ( numond, namsbc_cpl )
!
IF(lwp) THEN ! control print
WRITE(numout,*)
WRITE(numout,*)'sbc_cpl_init : namsbc_cpl namelist '
WRITE(numout,*)'~~~~~~~~~~~~'
ENDIF
IF( lwp .AND. ln_cpl ) THEN ! control print
WRITE(numout,*)' nn_cplmodel = ', nn_cplmodel
WRITE(numout,*)' ln_usecplmask = ', ln_usecplmask
WRITE(numout,*)' ln_scale_ice_flux = ', ln_scale_ice_flux
WRITE(numout,*)' ln_couple_ocean_evap = ', ln_couple_ocean_evap
WRITE(numout,*)' nn_cats_cpl = ', nn_cats_cpl
WRITE(numout,*)' received fields (mutiple ice categogies)'
WRITE(numout,*)' 10m wind module = ', TRIM(sn_rcv_w10m%cldes ), ' (', TRIM(sn_rcv_w10m%clcat ), ')'
WRITE(numout,*)' stress module = ', TRIM(sn_rcv_taumod%cldes), ' (', TRIM(sn_rcv_taumod%clcat), ')'
WRITE(numout,*)' surface stress = ', TRIM(sn_rcv_tau%cldes ), ' (', TRIM(sn_rcv_tau%clcat ), ')'
WRITE(numout,*)' - referential = ', sn_rcv_tau%clvref
WRITE(numout,*)' - orientation = ', sn_rcv_tau%clvor
WRITE(numout,*)' - mesh = ', sn_rcv_tau%clvgrd
WRITE(numout,*)' non-solar heat flux sensitivity = ', TRIM(sn_rcv_dqnsdt%cldes), ' (', TRIM(sn_rcv_dqnsdt%clcat), ')'
WRITE(numout,*)' solar heat flux = ', TRIM(sn_rcv_qsr%cldes ), ' (', TRIM(sn_rcv_qsr%clcat ), ')'
WRITE(numout,*)' non-solar heat flux = ', TRIM(sn_rcv_qns%cldes ), ' (', TRIM(sn_rcv_qns%clcat ), ')'
WRITE(numout,*)' freshwater budget = ', TRIM(sn_rcv_emp%cldes ), ' (', TRIM(sn_rcv_emp%clcat ), ')'
WRITE(numout,*)' runoffs = ', TRIM(sn_rcv_rnf%cldes ), ' (', TRIM(sn_rcv_rnf%clcat ), ')'
WRITE(numout,*)' calving = ', TRIM(sn_rcv_cal%cldes ), ' (', TRIM(sn_rcv_cal%clcat ), ')'
WRITE(numout,*)' Greenland ice mass = ', TRIM(sn_rcv_grnm%cldes ), ' (', TRIM(sn_rcv_grnm%clcat ), ')'
WRITE(numout,*)' Antarctica ice mass = ', TRIM(sn_rcv_antm%cldes ), ' (', TRIM(sn_rcv_antm%clcat ), ')'
WRITE(numout,*)' iceberg = ', TRIM(sn_rcv_icb%cldes ), ' (', TRIM(sn_rcv_icb%clcat ), ')'
WRITE(numout,*)' ice shelf = ', TRIM(sn_rcv_isf%cldes ), ' (', TRIM(sn_rcv_isf%clcat ), ')'
WRITE(numout,*)' sea ice heat fluxes = ', TRIM(sn_rcv_iceflx%cldes), ' (', TRIM(sn_rcv_iceflx%clcat), ')'
WRITE(numout,*)' transmitted solar = ', TRIM(sn_rcv_qtr%cldes ), ' (', TRIM(sn_rcv_qtr%clcat ), ')'
WRITE(numout,*)' atm co2 = ', TRIM(sn_rcv_co2%cldes ), ' (', TRIM(sn_rcv_co2%clcat ), ')'
WRITE(numout,*)' Sea ice surface skin temperature= ', TRIM(sn_rcv_ts_ice%cldes), ' (', TRIM(sn_rcv_ts_ice%clcat), ')'
WRITE(numout,*)' surface waves:'
WRITE(numout,*)' significant wave heigth = ', TRIM(sn_rcv_hsig%cldes ), ' (', TRIM(sn_rcv_hsig%clcat ), ')'
WRITE(numout,*)' wave to oce energy flux = ', TRIM(sn_rcv_phioc%cldes ), ' (', TRIM(sn_rcv_phioc%clcat ), ')'
WRITE(numout,*)' Surface Stokes drift grid u = ', TRIM(sn_rcv_sdrfx%cldes ), ' (', TRIM(sn_rcv_sdrfx%clcat ), ')'
WRITE(numout,*)' Surface Stokes drift grid v = ', TRIM(sn_rcv_sdrfy%cldes ), ' (', TRIM(sn_rcv_sdrfy%clcat ), ')'
WRITE(numout,*)' Mean wave period = ', TRIM(sn_rcv_wper%cldes ), ' (', TRIM(sn_rcv_wper%clcat ), ')'
WRITE(numout,*)' Mean wave number = ', TRIM(sn_rcv_wnum%cldes ), ' (', TRIM(sn_rcv_wnum%clcat ), ')'
WRITE(numout,*)' Stress frac adsorbed by waves = ', TRIM(sn_rcv_wstrf%cldes ), ' (', TRIM(sn_rcv_wstrf%clcat ), ')'
WRITE(numout,*)' Neutral surf drag coefficient = ', TRIM(sn_rcv_wdrag%cldes ), ' (', TRIM(sn_rcv_wdrag%clcat ), ')'
WRITE(numout,*)' Charnock coefficient = ', TRIM(sn_rcv_charn%cldes ), ' (', TRIM(sn_rcv_charn%clcat ), ')'
WRITE(numout,*)' sent fields (multiple ice categories)'
WRITE(numout,*)' surface temperature = ', TRIM(sn_snd_temp%cldes ), ' (', TRIM(sn_snd_temp%clcat ), ')'
WRITE(numout,*)' top ice layer temperature = ', TRIM(sn_snd_ttilyr%cldes), ' (', TRIM(sn_snd_ttilyr%clcat), ')'
WRITE(numout,*)' albedo = ', TRIM(sn_snd_alb%cldes ), ' (', TRIM(sn_snd_alb%clcat ), ')'
WRITE(numout,*)' ice/snow thickness = ', TRIM(sn_snd_thick%cldes ), ' (', TRIM(sn_snd_thick%clcat ), ')'
WRITE(numout,*)' total ice fraction = ', TRIM(sn_snd_ifrac%cldes ), ' (', TRIM(sn_snd_ifrac%clcat ), ')'
WRITE(numout,*)' surface current = ', TRIM(sn_snd_crt%cldes ), ' (', TRIM(sn_snd_crt%clcat ), ')'
WRITE(numout,*)' - referential = ', sn_snd_crt%clvref
WRITE(numout,*)' - orientation = ', sn_snd_crt%clvor
WRITE(numout,*)' - mesh = ', sn_snd_crt%clvgrd
#if defined key_medusa
WRITE(numout,*)' bio co2 flux = ', TRIM(sn_snd_bio_co2%cldes),' (', TRIM(sn_snd_bio_co2%clcat), ')'
WRITE(numout,*)' bio dms flux = ', TRIM(sn_snd_bio_dms%cldes),' (', TRIM(sn_snd_bio_dms%clcat), ')'
WRITE(numout,*)' bio dms chlorophyll = ', TRIM(sn_snd_bio_chloro%cldes), ' (', TRIM(sn_snd_bio_chloro%clcat), ')'
#endif
WRITE(numout,*)' oce co2 flux = ', TRIM(sn_snd_co2%cldes ), ' (', TRIM(sn_snd_co2%clcat ), ')'
WRITE(numout,*)' ice effective conductivity = ', TRIM(sn_snd_cond%cldes ), ' (', TRIM(sn_snd_cond%clcat ), ')'
WRITE(numout,*)' meltponds fraction and depth = ', TRIM(sn_snd_mpnd%cldes ), ' (', TRIM(sn_snd_mpnd%clcat ), ')'
WRITE(numout,*)' sea surface freezing temp = ', TRIM(sn_snd_sstfrz%cldes), ' (', TRIM(sn_snd_sstfrz%clcat), ')'
WRITE(numout,*)' water level = ', TRIM(sn_snd_wlev%cldes ), ' (', TRIM(sn_snd_wlev%clcat ), ')'
WRITE(numout,*)' mean sea level pressure = ', TRIM(sn_rcv_mslp%cldes ), ' (', TRIM(sn_rcv_mslp%clcat ), ')'
WRITE(numout,*)' surface current to waves = ', TRIM(sn_snd_crtw%cldes ), ' (', TRIM(sn_snd_crtw%clcat ), ')'
WRITE(numout,*)' - referential = ', sn_snd_crtw%clvref
WRITE(numout,*)' - orientation = ', sn_snd_crtw%clvor
WRITE(numout,*)' - mesh = ', sn_snd_crtw%clvgrd
#if defined key_medusa
WRITE(numout,*)' atm pco2 = ', TRIM(sn_rcv_atm_pco2%cldes),'(', TRIM(sn_rcv_atm_pco2%clcat ), ')'
WRITE(numout,*)' atm dust = ', TRIM(sn_rcv_atm_dust%cldes),'(', TRIM(sn_rcv_atm_dust%clcat),')'
#endif
WRITE(numout,*)' nn_coupled_iceshelf_fluxes = ', nn_coupled_iceshelf_fluxes
WRITE(numout,*)' ln_iceshelf_init_atmos = ', ln_iceshelf_init_atmos
WRITE(numout,*)' rn_greenland_total_fw_flux = ', rn_greenland_total_fw_flux
WRITE(numout,*)' rn_antarctica_total_fw_flux = ', rn_antarctica_total_fw_flux
WRITE(numout,*)' rn_greenland_calving_fraction = ', rn_greenland_calving_fraction
WRITE(numout,*)' rn_antarctica_calving_fraction = ', rn_antarctica_calving_fraction
WRITE(numout,*)' rn_iceshelf_fluxes_tolerance = ', rn_iceshelf_fluxes_tolerance
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
ENDIF
IF( lwp .AND. ln_wave) THEN ! control print
WRITE(numout,*)' surface waves:'
WRITE(numout,*)' Significant wave heigth = ', TRIM(sn_rcv_hsig%cldes ), ' (', TRIM(sn_rcv_hsig%clcat ), ')'
WRITE(numout,*)' Wave to oce energy flux = ', TRIM(sn_rcv_phioc%cldes ), ' (', TRIM(sn_rcv_phioc%clcat ), ')'
WRITE(numout,*)' Surface Stokes drift grid u = ', TRIM(sn_rcv_sdrfx%cldes ), ' (', TRIM(sn_rcv_sdrfx%clcat ), ')'
WRITE(numout,*)' Surface Stokes drift grid v = ', TRIM(sn_rcv_sdrfy%cldes ), ' (', TRIM(sn_rcv_sdrfy%clcat ), ')'
WRITE(numout,*)' Mean wave period = ', TRIM(sn_rcv_wper%cldes ), ' (', TRIM(sn_rcv_wper%clcat ), ')'
WRITE(numout,*)' Mean wave number = ', TRIM(sn_rcv_wnum%cldes ), ' (', TRIM(sn_rcv_wnum%clcat ), ')'
WRITE(numout,*)' Stress frac adsorbed by waves = ', TRIM(sn_rcv_wstrf%cldes ), ' (', TRIM(sn_rcv_wstrf%clcat ), ')'
WRITE(numout,*)' Neutral surf drag coefficient = ', TRIM(sn_rcv_wdrag%cldes ), ' (', TRIM(sn_rcv_wdrag%clcat ), ')'
WRITE(numout,*)' Charnock coefficient = ', TRIM(sn_rcv_charn%cldes ), ' (', TRIM(sn_rcv_charn%clcat ), ')'
WRITE(numout,*)' Transport associated to Stokes drift grid u = ', TRIM(sn_rcv_tusd%cldes ), ' (', TRIM(sn_rcv_tusd%clcat ), ')'
WRITE(numout,*)' Transport associated to Stokes drift grid v = ', TRIM(sn_rcv_tvsd%cldes ), ' (', TRIM(sn_rcv_tvsd%clcat ), ')'
WRITE(numout,*)' Bernouilli pressure head = ', TRIM(sn_rcv_bhd%cldes ), ' (', TRIM(sn_rcv_bhd%clcat ), ')'
WRITE(numout,*)'Wave to ocean momentum flux and Net wave-supported stress = ', TRIM(sn_rcv_taw%cldes ), ' (', TRIM(sn_rcv_taw%clcat ), ')'
WRITE(numout,*)' Surface current to waves = ', TRIM(sn_snd_crtw%cldes ), ' (', TRIM(sn_snd_crtw%clcat ), ')'
WRITE(numout,*)' - referential = ', sn_snd_crtw%clvref
WRITE(numout,*)' - orientation = ', sn_snd_crtw%clvor
WRITE(numout,*)' - mesh = ', sn_snd_crtw%clvgrd
ENDIF
! ! allocate sbccpl arrays
IF( sbc_cpl_alloc() /= 0 ) CALL ctl_stop( 'STOP', 'sbc_cpl_alloc : unable to allocate arrays' )
! ================================ !
! Define the receive interface !
! ================================ !
nrcvinfo(:) = OASIS_idle ! needed by nrcvinfo(jpr_otx1) if we do not receive ocean stress
! for each field: define the OASIS name (srcv(:)%clname)
! define receive or not from the namelist parameters (srcv(:)%laction)
! define the north fold type of lbc (srcv(:)%nsgn)
! default definitions of srcv
srcv(:)%laction = .FALSE.
srcv(:)%clgrid = 'T'
srcv(:)%nsgn = 1.
srcv(:)%nct = 1
srcv(:)%dimensions = 2
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
! ! ------------------------- !
! ! ice and ocean wind stress !
! ! ------------------------- !
! ! Name
srcv(jpr_otx1)%clname = 'O_OTaux1' ! 1st ocean component on grid ONE (T or U)
srcv(jpr_oty1)%clname = 'O_OTauy1' ! 2nd - - - -
srcv(jpr_otz1)%clname = 'O_OTauz1' ! 3rd - - - -
srcv(jpr_otx2)%clname = 'O_OTaux2' ! 1st ocean component on grid TWO (V)
srcv(jpr_oty2)%clname = 'O_OTauy2' ! 2nd - - - -
srcv(jpr_otz2)%clname = 'O_OTauz2' ! 3rd - - - -
!
srcv(jpr_itx1)%clname = 'O_ITaux1' ! 1st ice component on grid ONE (T, F, I or U)
srcv(jpr_ity1)%clname = 'O_ITauy1' ! 2nd - - - -
srcv(jpr_itz1)%clname = 'O_ITauz1' ! 3rd - - - -
srcv(jpr_itx2)%clname = 'O_ITaux2' ! 1st ice component on grid TWO (V)
srcv(jpr_ity2)%clname = 'O_ITauy2' ! 2nd - - - -
srcv(jpr_itz2)%clname = 'O_ITauz2' ! 3rd - - - -
!
! Vectors: change of sign at north fold ONLY if on the local grid
IF( TRIM( sn_rcv_tau%cldes ) == 'oce only' .OR. TRIM( sn_rcv_tau%cldes ) == 'oce and ice' &
.OR. TRIM( sn_rcv_tau%cldes ) == 'mixed oce-ice' ) THEN ! avoid working with the atmospheric fields if they are not coupled
!
IF( TRIM( sn_rcv_tau%clvor ) == 'local grid' ) srcv(jpr_otx1:jpr_itz2)%nsgn = -1.
! ! Set grid and action
SELECT CASE( TRIM( sn_rcv_tau%clvgrd ) ) ! 'T', 'U,V', 'U,V,I', 'U,V,F', 'T,I', 'T,F', or 'T,U,V'
CASE( 'T' )
srcv(jpr_otx1:jpr_itz2)%clgrid = 'T' ! oce and ice components given at T-point
srcv(jpr_otx1:jpr_otz1)%laction = .TRUE. ! receive oce components on grid 1
srcv(jpr_itx1:jpr_itz1)%laction = .TRUE. ! receive ice components on grid 1
CASE( 'U,V' )
srcv(jpr_otx1:jpr_otz1)%clgrid = 'U' ! oce components given at U-point
srcv(jpr_otx2:jpr_otz2)%clgrid = 'V' ! and V-point
srcv(jpr_itx1:jpr_itz1)%clgrid = 'U' ! ice components given at U-point
srcv(jpr_itx2:jpr_itz2)%clgrid = 'V' ! and V-point
srcv(jpr_otx1:jpr_itz2)%laction = .TRUE. ! receive oce and ice components on both grid 1 & 2
CASE( 'U,V,T' )
srcv(jpr_otx1:jpr_otz1)%clgrid = 'U' ! oce components given at U-point
srcv(jpr_otx2:jpr_otz2)%clgrid = 'V' ! and V-point
srcv(jpr_itx1:jpr_itz1)%clgrid = 'T' ! ice components given at T-point
srcv(jpr_otx1:jpr_otz2)%laction = .TRUE. ! receive oce components on grid 1 & 2
srcv(jpr_itx1:jpr_itz1)%laction = .TRUE. ! receive ice components on grid 1 only
CASE( 'U,V,I' )
srcv(jpr_otx1:jpr_otz1)%clgrid = 'U' ! oce components given at U-point
srcv(jpr_otx2:jpr_otz2)%clgrid = 'V' ! and V-point
srcv(jpr_itx1:jpr_itz1)%clgrid = 'I' ! ice components given at I-point
srcv(jpr_otx1:jpr_otz2)%laction = .TRUE. ! receive oce components on grid 1 & 2
srcv(jpr_itx1:jpr_itz1)%laction = .TRUE. ! receive ice components on grid 1 only
CASE( 'U,V,F' )
srcv(jpr_otx1:jpr_otz1)%clgrid = 'U' ! oce components given at U-point
srcv(jpr_otx2:jpr_otz2)%clgrid = 'V' ! and V-point
srcv(jpr_itx1:jpr_itz1)%clgrid = 'F' ! ice components given at F-point
!srcv(jpr_otx1:jpr_otz2)%laction = .TRUE. ! receive oce components on grid 1 & 2
! Currently needed for HadGEM3 - but shouldn't affect anyone else for the moment
srcv(jpr_otx1)%laction = .TRUE.
srcv(jpr_oty1)%laction = .TRUE.
!
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
srcv(jpr_itx1:jpr_itz1)%laction = .TRUE. ! receive ice components on grid 1 only
CASE( 'T,I' )
srcv(jpr_otx1:jpr_itz2)%clgrid = 'T' ! oce and ice components given at T-point
srcv(jpr_itx1:jpr_itz1)%clgrid = 'I' ! ice components given at I-point
srcv(jpr_otx1:jpr_otz1)%laction = .TRUE. ! receive oce components on grid 1
srcv(jpr_itx1:jpr_itz1)%laction = .TRUE. ! receive ice components on grid 1
CASE( 'T,F' )
srcv(jpr_otx1:jpr_itz2)%clgrid = 'T' ! oce and ice components given at T-point
srcv(jpr_itx1:jpr_itz1)%clgrid = 'F' ! ice components given at F-point
srcv(jpr_otx1:jpr_otz1)%laction = .TRUE. ! receive oce components on grid 1
srcv(jpr_itx1:jpr_itz1)%laction = .TRUE. ! receive ice components on grid 1
CASE( 'T,U,V' )
srcv(jpr_otx1:jpr_otz1)%clgrid = 'T' ! oce components given at T-point
srcv(jpr_itx1:jpr_itz1)%clgrid = 'U' ! ice components given at U-point
srcv(jpr_itx2:jpr_itz2)%clgrid = 'V' ! and V-point
srcv(jpr_otx1:jpr_otz1)%laction = .TRUE. ! receive oce components on grid 1 only
srcv(jpr_itx1:jpr_itz2)%laction = .TRUE. ! receive ice components on grid 1 & 2
CASE default
CALL ctl_stop( 'sbc_cpl_init: wrong definition of sn_rcv_tau%clvgrd' )
END SELECT
!
IF( TRIM( sn_rcv_tau%clvref ) == 'spherical' ) & ! spherical: 3rd component not received
& srcv( (/jpr_otz1, jpr_otz2, jpr_itz1, jpr_itz2/) )%laction = .FALSE.
!
IF( TRIM( sn_rcv_tau%clvor ) == 'local grid' ) THEN ! already on local grid -> no need of the second grid
srcv(jpr_otx2:jpr_otz2)%laction = .FALSE.
srcv(jpr_itx2:jpr_itz2)%laction = .FALSE.
srcv(jpr_oty1)%clgrid = srcv(jpr_oty2)%clgrid ! not needed but cleaner...
srcv(jpr_ity1)%clgrid = srcv(jpr_ity2)%clgrid ! not needed but cleaner...
ENDIF
!
IF( TRIM( sn_rcv_tau%cldes ) /= 'oce and ice' ) THEN ! 'oce and ice' case ocean stress on ocean mesh used
srcv(jpr_itx1:jpr_itz2)%laction = .FALSE. ! ice components not received
srcv(jpr_itx1)%clgrid = 'U' ! ocean stress used after its transformation
srcv(jpr_ity1)%clgrid = 'V' ! i.e. it is always at U- & V-points for i- & j-comp. resp.
ENDIF
ENDIF
! ! ------------------------- !
! ! freshwater budget ! E-P
! ! ------------------------- !
! we suppose that atmosphere modele do not make the difference between precipiration (liquide or solid)
! over ice of free ocean within the same atmospheric cell.cd
srcv(jpr_rain)%clname = 'OTotRain' ! Rain = liquid precipitation
srcv(jpr_snow)%clname = 'OTotSnow' ! Snow = solid precipitation
srcv(jpr_tevp)%clname = 'OTotEvap' ! total evaporation (over oce + ice sublimation)
srcv(jpr_ievp)%clname = 'OIceEvap' ! evaporation over ice = sublimation
srcv(jpr_sbpr)%clname = 'OSubMPre' ! sublimation - liquid precipitation - solid precipitation
srcv(jpr_semp)%clname = 'OISubMSn' ! ice solid water budget = sublimation - solid precipitation
srcv(jpr_oemp)%clname = 'OOEvaMPr' ! ocean water budget = ocean Evap - ocean precip
SELECT CASE( TRIM( sn_rcv_emp%cldes ) )
CASE( 'none' ) ! nothing to do
CASE( 'oce only' ) ; srcv(jpr_oemp)%laction = .TRUE.
CASE( 'conservative' )
srcv( (/jpr_rain, jpr_snow, jpr_ievp, jpr_tevp/) )%laction = .TRUE.
IF( k_ice <= 1 ) srcv(jpr_ievp)%laction = .FALSE.
CASE( 'oce and ice' ) ; srcv( (/jpr_ievp, jpr_sbpr, jpr_semp, jpr_oemp/) )%laction = .TRUE.
CASE default ; CALL ctl_stop( 'sbc_cpl_init: wrong definition of sn_rcv_emp%cldes' )
END SELECT
!
! ! ------------------------- !
! ! Runoffs & Calving !
! ! ------------------------- !
srcv(jpr_rnf )%clname = 'O_Runoff'
srcv(jpr_rnf_1d )%clname = 'ORunff1D'
IF( TRIM( sn_rcv_rnf%cldes ) == 'coupled' .OR. TRIM( sn_rcv_rnf%cldes ) == 'coupled1d' ) THEN
IF( TRIM( sn_rcv_rnf%cldes ) == 'coupled' ) srcv(jpr_rnf)%laction = .TRUE.
IF( TRIM( sn_rcv_rnf%cldes ) == 'coupled1d' ) THEN
srcv(jpr_rnf_1d)%laction = .TRUE.
srcv(jpr_rnf_1d)%dimensions = 1 ! 1D field passed through coupler
END IF
l_rnfcpl = .TRUE. ! -> no need to read runoffs in sbcrnf
ln_rnf = nn_components /= jp_iam_sas ! -> force to go through sbcrnf if not sas
IF(lwp) WRITE(numout,*)
IF(lwp) WRITE(numout,*) ' runoffs received from oasis -> force ln_rnf = ', ln_rnf
ENDIF
!
srcv(jpr_cal )%clname = 'OCalving'
IF( TRIM( sn_rcv_cal%cldes ) == 'coupled' ) srcv(jpr_cal)%laction = .TRUE.
srcv(jpr_grnm )%clname = 'OGrnmass'
IF( TRIM( sn_rcv_grnm%cldes ) == 'coupled' ) THEN
srcv(jpr_grnm)%laction = .TRUE.
srcv(jpr_grnm)%dimensions = 0 ! Scalar field
ENDIF
srcv(jpr_antm )%clname = 'OAntmass'
IF( TRIM( sn_rcv_antm%cldes ) == 'coupled' ) THEN
srcv(jpr_antm)%laction = .TRUE.
srcv(jpr_antm)%dimensions = 0 ! Scalar field
ENDIF
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
srcv(jpr_isf)%clname = 'OIcshelf' ; IF( TRIM( sn_rcv_isf%cldes) == 'coupled' ) srcv(jpr_isf)%laction = .TRUE.
srcv(jpr_icb)%clname = 'OIceberg' ; IF( TRIM( sn_rcv_icb%cldes) == 'coupled' ) srcv(jpr_icb)%laction = .TRUE.
IF( srcv(jpr_isf)%laction ) THEN
l_isfoasis = .TRUE. ! -> isf fwf comes from oasis
IF(lwp) WRITE(numout,*)
IF(lwp) WRITE(numout,*) ' iceshelf received from oasis '
ENDIF
!
!
! ! ------------------------- !
! ! non solar radiation ! Qns
! ! ------------------------- !
srcv(jpr_qnsoce)%clname = 'O_QnsOce'
srcv(jpr_qnsice)%clname = 'O_QnsIce'
srcv(jpr_qnsmix)%clname = 'O_QnsMix'
SELECT CASE( TRIM( sn_rcv_qns%cldes ) )
CASE( 'none' ) ! nothing to do
CASE( 'oce only' ) ; srcv( jpr_qnsoce )%laction = .TRUE.
CASE( 'conservative' ) ; srcv( (/jpr_qnsice, jpr_qnsmix/) )%laction = .TRUE.
CASE( 'oce and ice' ) ; srcv( (/jpr_qnsice, jpr_qnsoce/) )%laction = .TRUE.
CASE( 'mixed oce-ice' ) ; srcv( jpr_qnsmix )%laction = .TRUE.
CASE default ; CALL ctl_stop( 'sbc_cpl_init: wrong definition of sn_rcv_qns%cldes' )
END SELECT
IF( TRIM( sn_rcv_qns%cldes ) == 'mixed oce-ice' .AND. nn_cats_cpl > 1 ) &
CALL ctl_stop( 'sbc_cpl_init: sn_rcv_qns%cldes not currently allowed to be mixed oce-ice for multi-category ice' )
!
! ! ------------------------- !
! ! solar radiation ! Qsr
! ! ------------------------- !
srcv(jpr_qsroce)%clname = 'O_QsrOce'
srcv(jpr_qsrice)%clname = 'O_QsrIce'
srcv(jpr_qsrmix)%clname = 'O_QsrMix'
SELECT CASE( TRIM( sn_rcv_qsr%cldes ) )
CASE( 'none' ) ! nothing to do
CASE( 'oce only' ) ; srcv( jpr_qsroce )%laction = .TRUE.
CASE( 'conservative' ) ; srcv( (/jpr_qsrice, jpr_qsrmix/) )%laction = .TRUE.
CASE( 'oce and ice' ) ; srcv( (/jpr_qsrice, jpr_qsroce/) )%laction = .TRUE.
CASE( 'mixed oce-ice' ) ; srcv( jpr_qsrmix )%laction = .TRUE.
CASE default ; CALL ctl_stop( 'sbc_cpl_init: wrong definition of sn_rcv_qsr%cldes' )
END SELECT
IF( TRIM( sn_rcv_qsr%cldes ) == 'mixed oce-ice' .AND. nn_cats_cpl > 1 ) &
CALL ctl_stop( 'sbc_cpl_init: sn_rcv_qsr%cldes not currently allowed to be mixed oce-ice for multi-category ice' )
!
! ! ------------------------- !
! ! non solar sensitivity ! d(Qns)/d(T)
! ! ------------------------- !
srcv(jpr_dqnsdt)%clname = 'O_dQnsdT'
IF( TRIM( sn_rcv_dqnsdt%cldes ) == 'coupled' ) srcv(jpr_dqnsdt)%laction = .TRUE.
!
! non solar sensitivity mandatory for mixed oce-ice solar radiation coupling technique
IF( TRIM( sn_rcv_dqnsdt%cldes ) == 'none' .AND. TRIM( sn_rcv_qns%cldes ) == 'mixed oce-ice' ) &
& CALL ctl_stop( 'sbc_cpl_init: namsbc_cpl namelist mismatch between sn_rcv_qns%cldes and sn_rcv_dqnsdt%cldes' )
!
! ! ------------------------- !
! ! 10m wind module !
! ! ------------------------- !
srcv(jpr_w10m)%clname = 'O_Wind10' ; IF( TRIM(sn_rcv_w10m%cldes ) == 'coupled' ) srcv(jpr_w10m)%laction = .TRUE.
!
! ! ------------------------- !
! ! wind stress module !
! ! ------------------------- !
srcv(jpr_taum)%clname = 'O_TauMod' ; IF( TRIM(sn_rcv_taumod%cldes) == 'coupled' ) srcv(jpr_taum)%laction = .TRUE.
!
! ! ------------------------- !
! ! Atmospheric CO2 !
! ! ------------------------- !
srcv(jpr_co2 )%clname = 'O_AtmCO2'
IF( TRIM(sn_rcv_co2%cldes ) == 'coupled' ) THEN
srcv(jpr_co2 )%laction = .TRUE.
l_co2cpl = .TRUE.
IF(lwp) WRITE(numout,*)
IF(lwp) WRITE(numout,*) ' Atmospheric pco2 received from oasis '
IF(lwp) WRITE(numout,*)
ENDIF
#if defined key_medusa
! ! --------------------------------------- !
! ! Incoming CO2 and DUST fluxes for MEDUSA !
! ! --------------------------------------- !
srcv(jpr_atm_pco2)%clname = 'OATMPCO2'
IF (TRIM(sn_rcv_atm_pco2%cldes) == 'medusa') THEN
srcv(jpr_atm_pco2)%laction = .TRUE.
END IF
srcv(jpr_atm_dust)%clname = 'OATMDUST'
IF (TRIM(sn_rcv_atm_dust%cldes) == 'medusa') THEN
srcv(jpr_atm_dust)%laction = .TRUE.
END IF
#endif
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
!
! ! ------------------------- !
! ! Mean Sea Level Pressure !
! ! ------------------------- !
srcv(jpr_mslp)%clname = 'O_MSLP' ; IF( TRIM(sn_rcv_mslp%cldes ) == 'coupled' ) srcv(jpr_mslp)%laction = .TRUE.
!
! ! --------------------------------- !
! ! ice topmelt and conduction flux !
! ! --------------------------------- !
srcv(jpr_topm )%clname = 'OTopMlt'
srcv(jpr_botm )%clname = 'OBotMlt'
IF( TRIM(sn_rcv_iceflx%cldes) == 'coupled' ) THEN
IF( TRIM( sn_rcv_iceflx%clcat ) == 'yes' ) THEN
srcv(jpr_topm:jpr_botm)%nct = nn_cats_cpl
ELSE
CALL ctl_stop( 'sbc_cpl_init: sn_rcv_iceflx%clcat should always be set to yes currently' )
ENDIF
srcv(jpr_topm:jpr_botm)%laction = .TRUE.
ENDIF
!! ! ! --------------------------- !
!! ! ! transmitted solar thru ice !
!! ! ! --------------------------- !
!! srcv(jpr_qtrice)%clname = 'OQtr'
!! IF( TRIM(sn_rcv_qtrice%cldes) == 'coupled' ) THEN
!! IF ( TRIM( sn_rcv_qtrice%clcat ) == 'yes' ) THEN
!! srcv(jpr_qtrice)%nct = nn_cats_cpl
!! ELSE
!! CALL ctl_stop( 'sbc_cpl_init: sn_rcv_qtrice%clcat should always be set to yes currently' )
!! ENDIF
!! srcv(jpr_qtrice)%laction = .TRUE.
!! ENDIF
! ! ------------------------- !
! ! transmitted solar !
! ! ------------------------- !
srcv(jpr_qtr )%clname = 'OQtr'
IF( TRIM(sn_rcv_qtr%cldes) == 'coupled' ) THEN
IF ( TRIM( sn_rcv_qtr%clcat ) == 'yes' ) THEN
srcv(jpr_qtr)%nct = nn_cats_cpl
ELSE
CALL ctl_stop( 'sbc_cpl_init: sn_rcv_qtr%clcat should always be set to yes currently' )
ENDIF
srcv(jpr_qtr)%laction = .TRUE.
ENDIF
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
! ! ------------------------- !
! ! ice skin temperature !
! ! ------------------------- !
srcv(jpr_ts_ice)%clname = 'OTsfIce' ! needed by Met Office
IF( TRIM( sn_rcv_ts_ice%cldes ) == 'ice' ) srcv(jpr_ts_ice)%laction = .TRUE.
IF( TRIM( sn_rcv_ts_ice%clcat ) == 'yes' ) srcv(jpr_ts_ice)%nct = nn_cats_cpl
IF( TRIM( sn_rcv_emp%clcat ) == 'yes' ) srcv(jpr_ievp)%nct = nn_cats_cpl
#if defined key_si3
IF( ln_cndflx .AND. .NOT.ln_cndemulate ) THEN
IF( .NOT.srcv(jpr_ts_ice)%laction ) &
& CALL ctl_stop( 'sbc_cpl_init: srcv(jpr_ts_ice)%laction should be set to true when ln_cndflx=T' )
ENDIF
#endif
! ! ------------------------- !
! ! Wave breaking !
! ! ------------------------- !
srcv(jpr_hsig)%clname = 'O_Hsigwa' ! significant wave height
IF( TRIM(sn_rcv_hsig%cldes ) == 'coupled' ) THEN
srcv(jpr_hsig)%laction = .TRUE.
cpl_hsig = .TRUE.
ENDIF
srcv(jpr_phioc)%clname = 'O_PhiOce' ! wave to ocean energy
IF( TRIM(sn_rcv_phioc%cldes ) == 'coupled' ) THEN
srcv(jpr_phioc)%laction = .TRUE.
cpl_phioc = .TRUE.
ENDIF
srcv(jpr_sdrftx)%clname = 'O_Sdrfx' ! Stokes drift in the u direction
IF( TRIM(sn_rcv_sdrfx%cldes ) == 'coupled' ) THEN
srcv(jpr_sdrftx)%laction = .TRUE.
cpl_sdrftx = .TRUE.
ENDIF
srcv(jpr_sdrfty)%clname = 'O_Sdrfy' ! Stokes drift in the v direction
IF( TRIM(sn_rcv_sdrfy%cldes ) == 'coupled' ) THEN
srcv(jpr_sdrfty)%laction = .TRUE.
cpl_sdrfty = .TRUE.
ENDIF
srcv(jpr_wper)%clname = 'O_WPer' ! mean wave period
IF( TRIM(sn_rcv_wper%cldes ) == 'coupled' ) THEN
srcv(jpr_wper)%laction = .TRUE.
cpl_wper = .TRUE.
ENDIF
srcv(jpr_wnum)%clname = 'O_WNum' ! mean wave number
IF( TRIM(sn_rcv_wnum%cldes ) == 'coupled' ) THEN
srcv(jpr_wnum)%laction = .TRUE.
cpl_wnum = .TRUE.
ENDIF
srcv(jpr_wstrf)%clname = 'O_WStrf' ! stress fraction adsorbed by the wave
IF( TRIM(sn_rcv_wstrf%cldes ) == 'coupled' ) THEN
srcv(jpr_wstrf)%laction = .TRUE.
cpl_wstrf = .TRUE.
ENDIF
srcv(jpr_wdrag)%clname = 'O_WDrag' ! neutral surface drag coefficient
IF( TRIM(sn_rcv_wdrag%cldes ) == 'coupled' ) THEN
srcv(jpr_wdrag)%laction = .TRUE.
cpl_wdrag = .TRUE.
ENDIF
srcv(jpr_charn)%clname = 'O_Charn' ! Chranock coefficient
IF( TRIM(sn_rcv_charn%cldes ) == 'coupled' ) THEN
srcv(jpr_charn)%laction = .TRUE.
cpl_charn = .TRUE.
ENDIF
srcv(jpr_bhd)%clname = 'O_Bhd' ! Bernoulli head. waves' induced surface pressure
IF( TRIM(sn_rcv_bhd%cldes ) == 'coupled' ) THEN
srcv(jpr_bhd)%laction = .TRUE.
cpl_bhd = .TRUE.
ENDIF
srcv(jpr_tusd)%clname = 'O_Tusd' ! zonal stokes transport
IF( TRIM(sn_rcv_tusd%cldes ) == 'coupled' ) THEN
srcv(jpr_tusd)%laction = .TRUE.
cpl_tusd = .TRUE.
ENDIF
srcv(jpr_tvsd)%clname = 'O_Tvsd' ! meridional stokes tranmport
IF( TRIM(sn_rcv_tvsd%cldes ) == 'coupled' ) THEN
srcv(jpr_tvsd)%laction = .TRUE.
cpl_tvsd = .TRUE.
ENDIF
srcv(jpr_twox)%clname = 'O_Twox' ! wave to ocean momentum flux in the u direction
srcv(jpr_twoy)%clname = 'O_Twoy' ! wave to ocean momentum flux in the v direction
srcv(jpr_tawx)%clname = 'O_Tawx' ! Net wave-supported stress in the u direction
srcv(jpr_tawy)%clname = 'O_Tawy' ! Net wave-supported stress in the v direction
IF( TRIM(sn_rcv_taw%cldes ) == 'coupled' ) THEN
srcv(jpr_twox)%laction = .TRUE.
srcv(jpr_twoy)%laction = .TRUE.
srcv(jpr_tawx)%laction = .TRUE.
srcv(jpr_tawy)%laction = .TRUE.
cpl_taw = .TRUE.
ENDIF
!
! ! ------------------------------- !
! ! OCE-SAS coupling - rcv by opa !
! ! ------------------------------- !
srcv(jpr_sflx)%clname = 'O_SFLX'
srcv(jpr_fice)%clname = 'RIceFrc'
!
IF( nn_components == jp_iam_oce ) THEN ! OCE coupled to SAS via OASIS: force received field by OCE (sent by SAS)
srcv(:)%laction = .FALSE. ! force default definition in case of opa <-> sas coupling
srcv(:)%clgrid = 'T' ! force default definition in case of opa <-> sas coupling
srcv(:)%nsgn = 1. ! force default definition in case of opa <-> sas coupling
srcv( (/jpr_qsroce, jpr_qnsoce, jpr_oemp, jpr_sflx, jpr_fice, jpr_otx1, jpr_oty1, jpr_taum/) )%laction = .TRUE.
srcv(jpr_otx1)%clgrid = 'U' ! oce components given at U-point
srcv(jpr_oty1)%clgrid = 'V' ! and V-point
! Vectors: change of sign at north fold ONLY if on the local grid
srcv( (/jpr_otx1,jpr_oty1/) )%nsgn = -1.
sn_rcv_tau%clvgrd = 'U,V'
sn_rcv_tau%clvor = 'local grid'
sn_rcv_tau%clvref = 'spherical'
sn_rcv_emp%cldes = 'oce only'
!
IF(lwp) THEN ! control print
WRITE(numout,*)
WRITE(numout,*)' Special conditions for SAS-OCE coupling '
WRITE(numout,*)' OCE component '
WRITE(numout,*)
WRITE(numout,*)' received fields from SAS component '
WRITE(numout,*)' ice cover '
WRITE(numout,*)' oce only EMP '
WRITE(numout,*)' salt flux '
WRITE(numout,*)' mixed oce-ice solar flux '
WRITE(numout,*)' mixed oce-ice non solar flux '
WRITE(numout,*)' wind stress U,V on local grid and sperical coordinates '
WRITE(numout,*)' wind stress module'
WRITE(numout,*)
ENDIF
ENDIF
! ! -------------------------------- !
! ! OCE-SAS coupling - rcv by sas !
! ! -------------------------------- !
srcv(jpr_toce )%clname = 'I_SSTSST'
srcv(jpr_soce )%clname = 'I_SSSal'
srcv(jpr_ocx1 )%clname = 'I_OCurx1'
srcv(jpr_ocy1 )%clname = 'I_OCury1'
srcv(jpr_ssh )%clname = 'I_SSHght'
srcv(jpr_e3t1st)%clname = 'I_E3T1st'
srcv(jpr_fraqsr)%clname = 'I_FraQsr'
!
IF( nn_components == jp_iam_sas ) THEN
IF( .NOT. ln_cpl ) srcv(:)%laction = .FALSE. ! force default definition in case of opa <-> sas coupling
IF( .NOT. ln_cpl ) srcv(:)%clgrid = 'T' ! force default definition in case of opa <-> sas coupling
IF( .NOT. ln_cpl ) srcv(:)%nsgn = 1. ! force default definition in case of opa <-> sas coupling
srcv( (/jpr_toce, jpr_soce, jpr_ssh, jpr_fraqsr, jpr_ocx1, jpr_ocy1/) )%laction = .TRUE.
srcv( jpr_e3t1st )%laction = .NOT.ln_linssh
srcv(jpr_ocx1)%clgrid = 'U' ! oce components given at U-point
srcv(jpr_ocy1)%clgrid = 'V' ! and V-point
! Vectors: change of sign at north fold ONLY if on the local grid
srcv(jpr_ocx1:jpr_ocy1)%nsgn = -1.
! Change first letter to couple with atmosphere if already coupled OCE
! this is nedeed as each variable name used in the namcouple must be unique:
! for example O_Runoff received by OCE from SAS and therefore S_Runoff received by SAS from the Atmosphere
DO jn = 1, jprcv
IF( srcv(jn)%clname(1:1) == "O" ) srcv(jn)%clname = "S"//srcv(jn)%clname(2:LEN(srcv(jn)%clname))
END DO
!
IF(lwp) THEN ! control print
WRITE(numout,*)
WRITE(numout,*)' Special conditions for SAS-OCE coupling '
WRITE(numout,*)' SAS component '
WRITE(numout,*)
IF( .NOT. ln_cpl ) THEN
WRITE(numout,*)' received fields from OCE component '
ELSE
WRITE(numout,*)' Additional received fields from OCE component : '
ENDIF
WRITE(numout,*)' sea surface temperature (Celsius) '
WRITE(numout,*)' sea surface salinity '
WRITE(numout,*)' surface currents '
WRITE(numout,*)' sea surface height '
WRITE(numout,*)' thickness of first ocean T level '
WRITE(numout,*)' fraction of solar net radiation absorbed in the first ocean level'
WRITE(numout,*)
ENDIF
ENDIF
! ================================ !
! Define the send interface !
! ================================ !
! for each field: define the OASIS name (ssnd(:)%clname)
! define send or not from the namelist parameters (ssnd(:)%laction)
! define the north fold type of lbc (ssnd(:)%nsgn)
! default definitions of nsnd
ssnd(:)%laction = .FALSE.
ssnd(:)%clgrid = 'T'
ssnd(:)%nsgn = 1.
ssnd(:)%nct = 1
ssnd(:)%dimensions = 2
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
! ! ------------------------- !
! ! Surface temperature !
! ! ------------------------- !
ssnd(jps_toce)%clname = 'O_SSTSST'
ssnd(jps_tice)%clname = 'O_TepIce'
ssnd(jps_ttilyr)%clname = 'O_TtiLyr'
ssnd(jps_tmix)%clname = 'O_TepMix'
SELECT CASE( TRIM( sn_snd_temp%cldes ) )
CASE( 'none' ) ! nothing to do
CASE( 'oce only' ) ; ssnd( jps_toce )%laction = .TRUE.
CASE( 'oce and ice' , 'weighted oce and ice' , 'oce and weighted ice' )
ssnd( (/jps_toce, jps_tice/) )%laction = .TRUE.
IF( TRIM( sn_snd_temp%clcat ) == 'yes' ) ssnd(jps_tice)%nct = nn_cats_cpl
CASE( 'mixed oce-ice' ) ; ssnd( jps_tmix )%laction = .TRUE.
CASE default ; CALL ctl_stop( 'sbc_cpl_init: wrong definition of sn_snd_temp%cldes' )
END SELECT
! ! ------------------------- !
! ! Albedo !
! ! ------------------------- !
ssnd(jps_albice)%clname = 'O_AlbIce'
ssnd(jps_albmix)%clname = 'O_AlbMix'
SELECT CASE( TRIM( sn_snd_alb%cldes ) )
CASE( 'none' ) ! nothing to do
CASE( 'ice' , 'weighted ice' ) ; ssnd(jps_albice)%laction = .TRUE.
CASE( 'mixed oce-ice' ) ; ssnd(jps_albmix)%laction = .TRUE.
CASE default ; CALL ctl_stop( 'sbc_cpl_init: wrong definition of sn_snd_alb%cldes' )
END SELECT
!
! Need to calculate oceanic albedo if
! 1. sending mixed oce-ice albedo or
! 2. receiving mixed oce-ice solar radiation
IF( TRIM ( sn_snd_alb%cldes ) == 'mixed oce-ice' .OR. TRIM ( sn_rcv_qsr%cldes ) == 'mixed oce-ice' ) THEN
CALL oce_alb( zaos, zacs )
! Due to lack of information on nebulosity : mean clear/overcast sky
alb_oce_mix(:,:) = ( zacs(:,:) + zaos(:,:) ) * 0.5
ENDIF
! ! ------------------------- !
! ! Ice fraction & Thickness !
! ! ------------------------- !
ssnd(jps_fice)%clname = 'OIceFrc'
ssnd(jps_ficet)%clname = 'OIceFrcT'
ssnd(jps_hice)%clname = 'OIceTck'
ssnd(jps_a_p)%clname = 'OPndFrc'
ssnd(jps_ht_p)%clname = 'OPndTck'
ssnd(jps_hsnw)%clname = 'OSnwTck'
ssnd(jps_fice1)%clname = 'OIceFrd'
IF( k_ice /= 0 ) THEN
ssnd(jps_fice)%laction = .TRUE. ! if ice treated in the ocean (even in climato case)
ssnd(jps_fice1)%laction = .TRUE. ! First-order regridded ice concentration, to be used producing atmos-to-ice fluxes (Met Office requirement)
! Currently no namelist entry to determine sending of multi-category ice fraction so use the thickness entry for now
IF( TRIM( sn_snd_thick%clcat ) == 'yes' ) ssnd(jps_fice)%nct = nn_cats_cpl
IF( TRIM( sn_snd_thick1%clcat ) == 'yes' ) ssnd(jps_fice1)%nct = nn_cats_cpl
ENDIF