- Timestamp:
- 2015-10-26T15:59:39+01:00 (9 years ago)
- Location:
- branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC
- Files:
-
- 2 deleted
- 25 edited
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/cpl_oasis3.F90
r3294 r5837 2 2 !!====================================================================== 3 3 !! *** MODULE cpl_oasis *** 4 !! Coupled O/A : coupled ocean-atmosphere case using OASIS3 V. prism_2_4 5 !! special case: NEMO OPA/LIM coupled to ECHAM5 4 !! Coupled O/A : coupled ocean-atmosphere case using OASIS3-MCT 6 5 !!===================================================================== 7 6 !! History : … … 15 14 !! 3.4 ! 11-11 (C. Harris) Changes to allow mutiple category fields 16 15 !!---------------------------------------------------------------------- 16 !!---------------------------------------------------------------------- 17 !! 'key_oasis3' coupled Ocean/Atmosphere via OASIS3-MCT 18 !! 'key_oa3mct_v3' to be added for OASIS3-MCT version 3 19 !!---------------------------------------------------------------------- 20 !! cpl_init : initialization of coupled mode communication 21 !! cpl_define : definition of grid and fields 22 !! cpl_snd : snd out fields in coupled mode 23 !! cpl_rcv : receive fields in coupled mode 24 !! cpl_finalize : finalize the coupled mode communication 25 !!---------------------------------------------------------------------- 17 26 #if defined key_oasis3 18 !!---------------------------------------------------------------------- 19 !! 'key_oasis3' coupled Ocean/Atmosphere via OASIS3 20 !!---------------------------------------------------------------------- 21 !! cpl_prism_init : initialization of coupled mode communication 22 !! cpl_prism_define : definition of grid and fields 23 !! cpl_prism_snd : snd out fields in coupled mode 24 !! cpl_prism_rcv : receive fields in coupled mode 25 !! cpl_prism_finalize : finalize the coupled mode communication 26 !!---------------------------------------------------------------------- 27 USE mod_prism_proto ! OASIS3 prism module 28 USE mod_prism_def_partition_proto! OASIS3 prism module for partitioning 29 USE mod_prism_put_proto ! OASIS3 prism module for snding 30 USE mod_prism_get_proto ! OASIS3 prism module for receiving 31 USE mod_comprism_proto ! OASIS3 prism module to get coupling frequency 27 USE mod_oasis ! OASIS3-MCT module 28 #endif 32 29 USE par_oce ! ocean parameters 33 30 USE dom_oce ! ocean space and time domain … … 38 35 PRIVATE 39 36 40 PUBLIC cpl_prism_init 41 PUBLIC cpl_prism_define 42 PUBLIC cpl_prism_snd 43 PUBLIC cpl_prism_rcv 44 PUBLIC cpl_prism_freq 45 PUBLIC cpl_prism_finalize 46 47 LOGICAL, PUBLIC, PARAMETER :: lk_cpl = .TRUE. !: coupled flag 37 PUBLIC cpl_init 38 PUBLIC cpl_define 39 PUBLIC cpl_snd 40 PUBLIC cpl_rcv 41 PUBLIC cpl_freq 42 PUBLIC cpl_finalize 43 48 44 INTEGER, PUBLIC :: OASIS_Rcv = 1 !: return code if received field 49 45 INTEGER, PUBLIC :: OASIS_idle = 0 !: return code if nothing done by oasis 50 INTEGER :: ncomp_id ! id returned by prism_init_comp46 INTEGER :: ncomp_id ! id returned by oasis_init_comp 51 47 INTEGER :: nerror ! return error code 52 53 INTEGER, PARAMETER :: nmaxfld=40 ! Maximum number of coupling fields 48 #if ! defined key_oasis3 49 ! OASIS Variables not used. defined only for compilation purpose 50 INTEGER :: OASIS_Out = -1 51 INTEGER :: OASIS_REAL = -1 52 INTEGER :: OASIS_Ok = -1 53 INTEGER :: OASIS_In = -1 54 INTEGER :: OASIS_Sent = -1 55 INTEGER :: OASIS_SentOut = -1 56 INTEGER :: OASIS_ToRest = -1 57 INTEGER :: OASIS_ToRestOut = -1 58 INTEGER :: OASIS_Recvd = -1 59 INTEGER :: OASIS_RecvOut = -1 60 INTEGER :: OASIS_FromRest = -1 61 INTEGER :: OASIS_FromRestOut = -1 62 #endif 63 64 INTEGER :: nrcv ! total number of fields received 65 INTEGER :: nsnd ! total number of fields sent 66 INTEGER :: ncplmodel ! Maximum number of models to/from which NEMO is potentialy sending/receiving data 67 INTEGER, PUBLIC, PARAMETER :: nmaxfld=50 ! Maximum number of coupling fields 68 INTEGER, PUBLIC, PARAMETER :: nmaxcat=5 ! Maximum number of coupling fields 69 INTEGER, PUBLIC, PARAMETER :: nmaxcpl=5 ! Maximum number of coupling fields 54 70 55 71 TYPE, PUBLIC :: FLD_CPL !: Type for coupling field information … … 58 74 CHARACTER(len = 1) :: clgrid ! Grid type 59 75 REAL(wp) :: nsgn ! Control of the sign change 60 INTEGER, DIMENSION( 9) :: nid ! Id of the field (no more than 9 categories)76 INTEGER, DIMENSION(nmaxcat,nmaxcpl) :: nid ! Id of the field (no more than 9 categories and 9 extrena models) 61 77 INTEGER :: nct ! Number of categories in field 78 INTEGER :: ncplmodel ! Maximum number of models to/from which this variable may be sent/received 62 79 END TYPE FLD_CPL 63 80 … … 73 90 CONTAINS 74 91 75 SUBROUTINE cpl_ prism_init(kl_comm )92 SUBROUTINE cpl_init( cd_modname, kl_comm ) 76 93 !!------------------------------------------------------------------- 77 !! *** ROUTINE cpl_ prism_init ***94 !! *** ROUTINE cpl_init *** 78 95 !! 79 96 !! ** Purpose : Initialize coupled mode communication for ocean … … 82 99 !! ** Method : OASIS3 MPI communication 83 100 !!-------------------------------------------------------------------- 84 INTEGER, INTENT(out) :: kl_comm ! local communicator of the model 101 CHARACTER(len = *), INTENT(in) :: cd_modname ! model name as set in namcouple file 102 INTEGER , INTENT(out) :: kl_comm ! local communicator of the model 85 103 !!-------------------------------------------------------------------- 86 104 … … 89 107 90 108 !------------------------------------------------------------------ 91 ! 1st Initialize the PRISMsystem for the application109 ! 1st Initialize the OASIS system for the application 92 110 !------------------------------------------------------------------ 93 CALL prism_init_comp_proto ( ncomp_id, 'oceanx', nerror )94 IF ( nerror /= PRISM_Ok ) &95 CALL prism_abort_proto (ncomp_id, 'cpl_prism_init', 'Failure in prism_init_comp_proto')111 CALL oasis_init_comp ( ncomp_id, TRIM(cd_modname), nerror ) 112 IF ( nerror /= OASIS_Ok ) & 113 CALL oasis_abort (ncomp_id, 'cpl_init', 'Failure in oasis_init_comp') 96 114 97 115 !------------------------------------------------------------------ … … 99 117 !------------------------------------------------------------------ 100 118 101 CALL prism_get_localcomm_proto( kl_comm, nerror )102 IF ( nerror /= PRISM_Ok ) &103 CALL prism_abort_proto (ncomp_id, 'cpl_prism_init','Failure in prism_get_localcomm_proto' )104 ! 105 END SUBROUTINE cpl_ prism_init106 107 108 SUBROUTINE cpl_ prism_define( krcv, ksnd)119 CALL oasis_get_localcomm ( kl_comm, nerror ) 120 IF ( nerror /= OASIS_Ok ) & 121 CALL oasis_abort (ncomp_id, 'cpl_init','Failure in oasis_get_localcomm' ) 122 ! 123 END SUBROUTINE cpl_init 124 125 126 SUBROUTINE cpl_define( krcv, ksnd, kcplmodel ) 109 127 !!------------------------------------------------------------------- 110 !! *** ROUTINE cpl_ prism_define ***128 !! *** ROUTINE cpl_define *** 111 129 !! 112 130 !! ** Purpose : Define grid and field information for ocean … … 116 134 !!-------------------------------------------------------------------- 117 135 INTEGER, INTENT(in) :: krcv, ksnd ! Number of received and sent coupling fields 136 INTEGER, INTENT(in) :: kcplmodel ! Maximum number of models to/from which NEMO is potentialy sending/receiving data 118 137 ! 119 138 INTEGER :: id_part 120 139 INTEGER :: paral(5) ! OASIS3 box partition 121 140 INTEGER :: ishape(2,2) ! shape of arrays passed to PSMILe 122 INTEGER :: ji,jc ! local loop indicees 123 CHARACTER(LEN=8) :: zclname 141 INTEGER :: ji,jc,jm ! local loop indicees 142 CHARACTER(LEN=64) :: zclname 143 CHARACTER(LEN=2) :: cli2 124 144 !!-------------------------------------------------------------------- 125 145 126 146 IF(lwp) WRITE(numout,*) 127 IF(lwp) WRITE(numout,*) 'cpl_ prism_define : initialization in coupled ocean/atmosphere case'147 IF(lwp) WRITE(numout,*) 'cpl_define : initialization in coupled ocean/atmosphere case' 128 148 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~~~~' 129 149 IF(lwp) WRITE(numout,*) 150 151 ncplmodel = kcplmodel 152 IF( kcplmodel > nmaxcpl ) THEN 153 CALL oasis_abort ( ncomp_id, 'cpl_define', 'ncplmodel is larger than nmaxcpl, increase nmaxcpl') ; RETURN 154 ENDIF 155 156 nrcv = krcv 157 IF( nrcv > nmaxfld ) THEN 158 CALL oasis_abort ( ncomp_id, 'cpl_define', 'nrcv is larger than nmaxfld, increase nmaxfld') ; RETURN 159 ENDIF 160 161 nsnd = ksnd 162 IF( nsnd > nmaxfld ) THEN 163 CALL oasis_abort ( ncomp_id, 'cpl_define', 'nsnd is larger than nmaxfld, increase nmaxfld') ; RETURN 164 ENDIF 130 165 131 166 ! … … 141 176 ALLOCATE(exfld(nlei-nldi+1, nlej-nldj+1), stat = nerror) 142 177 IF( nerror > 0 ) THEN 143 CALL prism_abort_proto ( ncomp_id, 'cpl_prism_define', 'Failure in allocating exfld') ; RETURN178 CALL oasis_abort ( ncomp_id, 'cpl_define', 'Failure in allocating exfld') ; RETURN 144 179 ENDIF 145 180 ! … … 161 196 ENDIF 162 197 163 CALL prism_def_partition_proto( id_part, paral, nerror )198 CALL oasis_def_partition ( id_part, paral, nerror ) 164 199 ! 165 200 ! ... Announce send variables. 166 201 ! 202 ssnd(:)%ncplmodel = kcplmodel 203 ! 167 204 DO ji = 1, ksnd 168 IF ( ssnd(ji)%laction ) THEN 205 IF ( ssnd(ji)%laction ) THEN 206 207 IF( ssnd(ji)%nct > nmaxcat ) THEN 208 CALL oasis_abort ( ncomp_id, 'cpl_define', 'Number of categories of '// & 209 & TRIM(ssnd(ji)%clname)//' is larger than nmaxcat, increase nmaxcat' ) 210 RETURN 211 ENDIF 212 169 213 DO jc = 1, ssnd(ji)%nct 170 IF ( ssnd(ji)%nct .gt. 1 ) THEN 171 WRITE(zclname,'( a7, i1)') ssnd(ji)%clname,jc 172 ELSE 173 zclname=ssnd(ji)%clname 174 ENDIF 175 WRITE(numout,*) "Define",ji,jc,zclname," for",PRISM_Out 176 CALL prism_def_var_proto (ssnd(ji)%nid(jc), zclname, id_part, (/ 2, 0/), & 177 PRISM_Out, ishape, PRISM_REAL, nerror) 178 IF ( nerror /= PRISM_Ok ) THEN 179 WRITE(numout,*) 'Failed to define transient ', ji, TRIM(zclname) 180 CALL prism_abort_proto ( ssnd(ji)%nid(jc), 'cpl_prism_define', 'Failure in prism_def_var') 181 ENDIF 214 DO jm = 1, kcplmodel 215 216 IF ( ssnd(ji)%nct .GT. 1 ) THEN 217 WRITE(cli2,'(i2.2)') jc 218 zclname = TRIM(ssnd(ji)%clname)//'_cat'//cli2 219 ELSE 220 zclname = ssnd(ji)%clname 221 ENDIF 222 IF ( kcplmodel > 1 ) THEN 223 WRITE(cli2,'(i2.2)') jm 224 zclname = 'model'//cli2//'_'//TRIM(zclname) 225 ENDIF 226 #if defined key_agrif 227 IF( agrif_fixed() /= 0 ) THEN 228 zclname=TRIM(Agrif_CFixed())//'_'//TRIM(zclname) 229 END IF 230 #endif 231 IF( ln_ctl ) WRITE(numout,*) "Define", ji, jc, jm, " "//TRIM(zclname), " for ", OASIS_Out 232 CALL oasis_def_var (ssnd(ji)%nid(jc,jm), zclname, id_part , (/ 2, 0 /), & 233 & OASIS_Out , ishape , OASIS_REAL, nerror ) 234 IF ( nerror /= OASIS_Ok ) THEN 235 WRITE(numout,*) 'Failed to define transient ', ji, jc, jm, " "//TRIM(zclname) 236 CALL oasis_abort ( ssnd(ji)%nid(jc,jm), 'cpl_define', 'Failure in oasis_def_var' ) 237 ENDIF 238 IF( ln_ctl .AND. ssnd(ji)%nid(jc,jm) /= -1 ) WRITE(numout,*) "variable defined in the namcouple" 239 IF( ln_ctl .AND. ssnd(ji)%nid(jc,jm) == -1 ) WRITE(numout,*) "variable NOT defined in the namcouple" 240 END DO 182 241 END DO 183 242 ENDIF … … 186 245 ! ... Announce received variables. 187 246 ! 247 srcv(:)%ncplmodel = kcplmodel 248 ! 188 249 DO ji = 1, krcv 189 250 IF ( srcv(ji)%laction ) THEN 251 252 IF( srcv(ji)%nct > nmaxcat ) THEN 253 CALL oasis_abort ( ncomp_id, 'cpl_define', 'Number of categories of '// & 254 & TRIM(srcv(ji)%clname)//' is larger than nmaxcat, increase nmaxcat' ) 255 RETURN 256 ENDIF 257 190 258 DO jc = 1, srcv(ji)%nct 191 IF ( srcv(ji)%nct .gt. 1 ) THEN 192 WRITE(zclname,'( a7, i1)') srcv(ji)%clname,jc 193 ELSE 194 zclname=srcv(ji)%clname 195 ENDIF 196 WRITE(numout,*) "Define",ji,jc,zclname," for",PRISM_In 197 CALL prism_def_var_proto ( srcv(ji)%nid(jc), zclname, id_part, (/ 2, 0/), & 198 & PRISM_In , ishape , PRISM_REAL, nerror) 199 IF ( nerror /= PRISM_Ok ) THEN 200 WRITE(numout,*) 'Failed to define transient ', ji, TRIM(zclname) 201 CALL prism_abort_proto ( srcv(ji)%nid(jc), 'cpl_prism_define', 'Failure in prism_def_var') 202 ENDIF 259 DO jm = 1, kcplmodel 260 261 IF ( srcv(ji)%nct .GT. 1 ) THEN 262 WRITE(cli2,'(i2.2)') jc 263 zclname = TRIM(srcv(ji)%clname)//'_cat'//cli2 264 ELSE 265 zclname = srcv(ji)%clname 266 ENDIF 267 IF ( kcplmodel > 1 ) THEN 268 WRITE(cli2,'(i2.2)') jm 269 zclname = 'model'//cli2//'_'//TRIM(zclname) 270 ENDIF 271 #if defined key_agrif 272 IF( agrif_fixed() /= 0 ) THEN 273 zclname=TRIM(Agrif_CFixed())//'_'//TRIM(zclname) 274 END IF 275 #endif 276 IF( ln_ctl ) WRITE(numout,*) "Define", ji, jc, jm, " "//TRIM(zclname), " for ", OASIS_In 277 CALL oasis_def_var (srcv(ji)%nid(jc,jm), zclname, id_part , (/ 2, 0 /), & 278 & OASIS_In , ishape , OASIS_REAL, nerror ) 279 IF ( nerror /= OASIS_Ok ) THEN 280 WRITE(numout,*) 'Failed to define transient ', ji, jc, jm, " "//TRIM(zclname) 281 CALL oasis_abort ( srcv(ji)%nid(jc,jm), 'cpl_define', 'Failure in oasis_def_var' ) 282 ENDIF 283 IF( ln_ctl .AND. srcv(ji)%nid(jc,jm) /= -1 ) WRITE(numout,*) "variable defined in the namcouple" 284 IF( ln_ctl .AND. srcv(ji)%nid(jc,jm) == -1 ) WRITE(numout,*) "variable NOT defined in the namcouple" 285 286 END DO 203 287 END DO 204 288 ENDIF … … 209 293 !------------------------------------------------------------------ 210 294 211 CALL prism_enddef_proto(nerror)212 IF( nerror /= PRISM_Ok ) CALL prism_abort_proto ( ncomp_id, 'cpl_prism_define', 'Failure in prism_enddef')213 ! 214 END SUBROUTINE cpl_ prism_define295 CALL oasis_enddef(nerror) 296 IF( nerror /= OASIS_Ok ) CALL oasis_abort ( ncomp_id, 'cpl_define', 'Failure in oasis_enddef') 297 ! 298 END SUBROUTINE cpl_define 215 299 216 300 217 SUBROUTINE cpl_ prism_snd( kid, kstep, pdata, kinfo )301 SUBROUTINE cpl_snd( kid, kstep, pdata, kinfo ) 218 302 !!--------------------------------------------------------------------- 219 !! *** ROUTINE cpl_ prism_snd ***303 !! *** ROUTINE cpl_snd *** 220 304 !! 221 305 !! ** Purpose : - At each coupling time-step,this routine sends fields … … 227 311 REAL(wp), DIMENSION(:,:,:), INTENT(in ) :: pdata 228 312 !! 229 INTEGER :: jc 313 INTEGER :: jc,jm ! local loop index 230 314 !!-------------------------------------------------------------------- 231 315 ! … … 233 317 ! 234 318 DO jc = 1, ssnd(kid)%nct 235 236 CALL prism_put_proto ( ssnd(kid)%nid(jc), kstep, pdata(nldi:nlei, nldj:nlej,jc), kinfo ) 237 238 IF ( ln_ctl ) THEN 239 IF ( kinfo == PRISM_Sent .OR. kinfo == PRISM_ToRest .OR. & 240 & kinfo == PRISM_SentOut .OR. kinfo == PRISM_ToRestOut ) THEN 241 WRITE(numout,*) '****************' 242 WRITE(numout,*) 'prism_put_proto: Outgoing ', ssnd(kid)%clname 243 WRITE(numout,*) 'prism_put_proto: ivarid ', ssnd(kid)%nid(jc) 244 WRITE(numout,*) 'prism_put_proto: kstep ', kstep 245 WRITE(numout,*) 'prism_put_proto: info ', kinfo 246 WRITE(numout,*) ' - Minimum value is ', MINVAL(pdata(:,:,jc)) 247 WRITE(numout,*) ' - Maximum value is ', MAXVAL(pdata(:,:,jc)) 248 WRITE(numout,*) ' - Sum value is ', SUM(pdata(:,:,jc)) 249 WRITE(numout,*) '****************' 319 DO jm = 1, ssnd(kid)%ncplmodel 320 321 IF( ssnd(kid)%nid(jc,jm) /= -1 ) THEN 322 CALL oasis_put ( ssnd(kid)%nid(jc,jm), kstep, pdata(nldi:nlei, nldj:nlej,jc), kinfo ) 323 324 IF ( ln_ctl ) THEN 325 IF ( kinfo == OASIS_Sent .OR. kinfo == OASIS_ToRest .OR. & 326 & kinfo == OASIS_SentOut .OR. kinfo == OASIS_ToRestOut ) THEN 327 WRITE(numout,*) '****************' 328 WRITE(numout,*) 'oasis_put: Outgoing ', ssnd(kid)%clname 329 WRITE(numout,*) 'oasis_put: ivarid ', ssnd(kid)%nid(jc,jm) 330 WRITE(numout,*) 'oasis_put: kstep ', kstep 331 WRITE(numout,*) 'oasis_put: info ', kinfo 332 WRITE(numout,*) ' - Minimum value is ', MINVAL(pdata(:,:,jc)) 333 WRITE(numout,*) ' - Maximum value is ', MAXVAL(pdata(:,:,jc)) 334 WRITE(numout,*) ' - Sum value is ', SUM(pdata(:,:,jc)) 335 WRITE(numout,*) '****************' 336 ENDIF 337 ENDIF 338 250 339 ENDIF 251 ENDIF252 340 341 ENDDO 253 342 ENDDO 254 343 ! 255 END SUBROUTINE cpl_ prism_snd256 257 258 SUBROUTINE cpl_ prism_rcv( kid, kstep, pdata, kinfo )344 END SUBROUTINE cpl_snd 345 346 347 SUBROUTINE cpl_rcv( kid, kstep, pdata, pmask, kinfo ) 259 348 !!--------------------------------------------------------------------- 260 !! *** ROUTINE cpl_ prism_rcv ***349 !! *** ROUTINE cpl_rcv *** 261 350 !! 262 351 !! ** Purpose : - At each coupling time-step,this routine receives fields … … 266 355 INTEGER , INTENT(in ) :: kstep ! ocean time-step in seconds 267 356 REAL(wp), DIMENSION(:,:,:), INTENT(inout) :: pdata ! IN to keep the value if nothing is done 357 REAL(wp), DIMENSION(:,:,:), INTENT(in ) :: pmask ! coupling mask 268 358 INTEGER , INTENT( out) :: kinfo ! OASIS3 info argument 269 359 !! 270 INTEGER :: jc 271 LOGICAL :: llaction 360 INTEGER :: jc,jm ! local loop index 361 LOGICAL :: llaction, llfisrt 272 362 !!-------------------------------------------------------------------- 273 363 ! 274 364 ! receive local data from OASIS3 on every process 275 365 ! 366 kinfo = OASIS_idle 367 ! 276 368 DO jc = 1, srcv(kid)%nct 277 278 CALL prism_get_proto ( srcv(kid)%nid(jc), kstep, exfld, kinfo ) 279 280 llaction = .false. 281 IF( kinfo == PRISM_Recvd .OR. kinfo == PRISM_FromRest .OR. & 282 kinfo == PRISM_RecvOut .OR. kinfo == PRISM_FromRestOut ) llaction = .TRUE. 283 284 IF ( ln_ctl ) WRITE(numout,*) "llaction, kinfo, kstep, ivarid: " , llaction, kinfo, kstep, srcv(kid)%nid(jc) 285 286 IF ( llaction ) THEN 287 288 kinfo = OASIS_Rcv 289 pdata(nldi:nlei, nldj:nlej,jc) = exfld(:,:) 290 291 !--- Fill the overlap areas and extra hallows (mpp) 292 !--- check periodicity conditions (all cases) 293 CALL lbc_lnk( pdata(:,:,jc), srcv(kid)%clgrid, srcv(kid)%nsgn ) 294 295 IF ( ln_ctl ) THEN 296 WRITE(numout,*) '****************' 297 WRITE(numout,*) 'prism_get_proto: Incoming ', srcv(kid)%clname 298 WRITE(numout,*) 'prism_get_proto: ivarid ' , srcv(kid)%nid(jc) 299 WRITE(numout,*) 'prism_get_proto: kstep', kstep 300 WRITE(numout,*) 'prism_get_proto: info ', kinfo 301 WRITE(numout,*) ' - Minimum value is ', MINVAL(pdata(:,:,jc)) 302 WRITE(numout,*) ' - Maximum value is ', MAXVAL(pdata(:,:,jc)) 303 WRITE(numout,*) ' - Sum value is ', SUM(pdata(:,:,jc)) 304 WRITE(numout,*) '****************' 369 llfisrt = .TRUE. 370 371 DO jm = 1, srcv(kid)%ncplmodel 372 373 IF( srcv(kid)%nid(jc,jm) /= -1 ) THEN 374 375 CALL oasis_get ( srcv(kid)%nid(jc,jm), kstep, exfld, kinfo ) 376 377 llaction = kinfo == OASIS_Recvd .OR. kinfo == OASIS_FromRest .OR. & 378 & kinfo == OASIS_RecvOut .OR. kinfo == OASIS_FromRestOut 379 380 IF ( ln_ctl ) WRITE(numout,*) "llaction, kinfo, kstep, ivarid: " , llaction, kinfo, kstep, srcv(kid)%nid(jc,jm) 381 382 IF ( llaction ) THEN 383 384 kinfo = OASIS_Rcv 385 IF( llfisrt ) THEN 386 pdata(nldi:nlei,nldj:nlej,jc) = exfld(:,:) * pmask(nldi:nlei,nldj:nlej,jm) 387 llfisrt = .FALSE. 388 ELSE 389 pdata(nldi:nlei,nldj:nlej,jc) = pdata(nldi:nlei,nldj:nlej,jc) + exfld(:,:) * pmask(nldi:nlei,nldj:nlej,jm) 390 ENDIF 391 392 IF ( ln_ctl ) THEN 393 WRITE(numout,*) '****************' 394 WRITE(numout,*) 'oasis_get: Incoming ', srcv(kid)%clname 395 WRITE(numout,*) 'oasis_get: ivarid ' , srcv(kid)%nid(jc,jm) 396 WRITE(numout,*) 'oasis_get: kstep', kstep 397 WRITE(numout,*) 'oasis_get: info ', kinfo 398 WRITE(numout,*) ' - Minimum value is ', MINVAL(pdata(:,:,jc)) 399 WRITE(numout,*) ' - Maximum value is ', MAXVAL(pdata(:,:,jc)) 400 WRITE(numout,*) ' - Sum value is ', SUM(pdata(:,:,jc)) 401 WRITE(numout,*) '****************' 402 ENDIF 403 404 ENDIF 405 305 406 ENDIF 306 407 307 ELSE 308 kinfo = OASIS_idle 309 ENDIF 310 408 ENDDO 409 410 !--- Fill the overlap areas and extra hallows (mpp) 411 !--- check periodicity conditions (all cases) 412 IF( .not. llfisrt ) CALL lbc_lnk( pdata(:,:,jc), srcv(kid)%clgrid, srcv(kid)%nsgn ) 413 311 414 ENDDO 312 415 ! 313 END SUBROUTINE cpl_ prism_rcv314 315 316 INTEGER FUNCTION cpl_ prism_freq( kid)416 END SUBROUTINE cpl_rcv 417 418 419 INTEGER FUNCTION cpl_freq( cdfieldname ) 317 420 !!--------------------------------------------------------------------- 318 !! *** ROUTINE cpl_ prism_freq ***421 !! *** ROUTINE cpl_freq *** 319 422 !! 320 423 !! ** Purpose : - send back the coupling frequency for a particular field 321 424 !!---------------------------------------------------------------------- 322 INTEGER,INTENT(in) :: kid ! variable index 425 CHARACTER(len = *), INTENT(in) :: cdfieldname ! field name as set in namcouple file 426 !! 427 INTEGER :: id 428 INTEGER :: info 429 INTEGER, DIMENSION(1) :: itmp 430 INTEGER :: ji,jm ! local loop index 431 INTEGER :: mop 323 432 !!---------------------------------------------------------------------- 324 cpl_prism_freq = ig_def_freq( kid ) 325 ! 326 END FUNCTION cpl_prism_freq 327 328 329 SUBROUTINE cpl_prism_finalize 433 cpl_freq = 0 ! defaut definition 434 id = -1 ! defaut definition 435 ! 436 DO ji = 1, nsnd 437 IF (ssnd(ji)%laction ) THEN 438 DO jm = 1, ncplmodel 439 IF( ssnd(ji)%nid(1,jm) /= -1 ) THEN 440 IF( TRIM(cdfieldname) == TRIM(ssnd(ji)%clname) ) THEN 441 id = ssnd(ji)%nid(1,jm) 442 mop = OASIS_Out 443 ENDIF 444 ENDIF 445 ENDDO 446 ENDIF 447 ENDDO 448 DO ji = 1, nrcv 449 IF (srcv(ji)%laction ) THEN 450 DO jm = 1, ncplmodel 451 IF( srcv(ji)%nid(1,jm) /= -1 ) THEN 452 IF( TRIM(cdfieldname) == TRIM(srcv(ji)%clname) ) THEN 453 id = srcv(ji)%nid(1,jm) 454 mop = OASIS_In 455 ENDIF 456 ENDIF 457 ENDDO 458 ENDIF 459 ENDDO 460 ! 461 IF( id /= -1 ) THEN 462 #if defined key_oa3mct_v3 463 CALL oasis_get_freqs(id, mop, 1, itmp, info) 464 #else 465 CALL oasis_get_freqs(id, 1, itmp, info) 466 #endif 467 cpl_freq = itmp(1) 468 ENDIF 469 ! 470 END FUNCTION cpl_freq 471 472 473 SUBROUTINE cpl_finalize 330 474 !!--------------------------------------------------------------------- 331 !! *** ROUTINE cpl_ prism_finalize ***475 !! *** ROUTINE cpl_finalize *** 332 476 !! 333 477 !! ** Purpose : - Finalizes the coupling. If MPI_init has not been 334 !! called explicitly before cpl_ prism_init it will also close478 !! called explicitly before cpl_init it will also close 335 479 !! MPI communication. 336 480 !!---------------------------------------------------------------------- 337 481 ! 338 482 DEALLOCATE( exfld ) 339 CALL prism_terminate_proto( nerror ) 340 ! 341 END SUBROUTINE cpl_prism_finalize 342 343 #else 344 !!---------------------------------------------------------------------- 345 !! Default case Dummy module Forced Ocean/Atmosphere 346 !!---------------------------------------------------------------------- 347 USE in_out_manager ! I/O manager 348 LOGICAL, PUBLIC, PARAMETER :: lk_cpl = .FALSE. !: coupled flag 349 PUBLIC cpl_prism_init 350 PUBLIC cpl_prism_finalize 351 CONTAINS 352 SUBROUTINE cpl_prism_init (kl_comm) 353 INTEGER, INTENT(out) :: kl_comm ! local communicator of the model 354 kl_comm = -1 355 WRITE(numout,*) 'cpl_prism_init: Error you sould not be there...' 356 END SUBROUTINE cpl_prism_init 357 SUBROUTINE cpl_prism_finalize 358 WRITE(numout,*) 'cpl_prism_finalize: Error you sould not be there...' 359 END SUBROUTINE cpl_prism_finalize 483 IF (nstop == 0) THEN 484 CALL oasis_terminate( nerror ) 485 ELSE 486 CALL oasis_abort( ncomp_id, "cpl_finalize", "NEMO ABORT STOP" ) 487 ENDIF 488 ! 489 END SUBROUTINE cpl_finalize 490 491 #if ! defined key_oasis3 492 493 !!---------------------------------------------------------------------- 494 !! No OASIS Library OASIS3 Dummy module... 495 !!---------------------------------------------------------------------- 496 497 SUBROUTINE oasis_init_comp(k1,cd1,k2) 498 CHARACTER(*), INTENT(in ) :: cd1 499 INTEGER , INTENT( out) :: k1,k2 500 k1 = -1 ; k2 = -1 501 WRITE(numout,*) 'oasis_init_comp: Error you sould not be there...', cd1 502 END SUBROUTINE oasis_init_comp 503 504 SUBROUTINE oasis_abort(k1,cd1,cd2) 505 INTEGER , INTENT(in ) :: k1 506 CHARACTER(*), INTENT(in ) :: cd1,cd2 507 WRITE(numout,*) 'oasis_abort: Error you sould not be there...', cd1, cd2 508 END SUBROUTINE oasis_abort 509 510 SUBROUTINE oasis_get_localcomm(k1,k2) 511 INTEGER , INTENT( out) :: k1,k2 512 k1 = -1 ; k2 = -1 513 WRITE(numout,*) 'oasis_get_localcomm: Error you sould not be there...' 514 END SUBROUTINE oasis_get_localcomm 515 516 SUBROUTINE oasis_def_partition(k1,k2,k3) 517 INTEGER , INTENT( out) :: k1,k3 518 INTEGER , INTENT(in ) :: k2(5) 519 k1 = k2(1) ; k3 = k2(5) 520 WRITE(numout,*) 'oasis_def_partition: Error you sould not be there...' 521 END SUBROUTINE oasis_def_partition 522 523 SUBROUTINE oasis_def_var(k1,cd1,k2,k3,k4,k5,k6,k7) 524 CHARACTER(*), INTENT(in ) :: cd1 525 INTEGER , INTENT(in ) :: k2,k3(2),k4,k5(2,2),k6 526 INTEGER , INTENT( out) :: k1,k7 527 k1 = -1 ; k7 = -1 528 WRITE(numout,*) 'oasis_def_var: Error you sould not be there...', cd1 529 END SUBROUTINE oasis_def_var 530 531 SUBROUTINE oasis_enddef(k1) 532 INTEGER , INTENT( out) :: k1 533 k1 = -1 534 WRITE(numout,*) 'oasis_enddef: Error you sould not be there...' 535 END SUBROUTINE oasis_enddef 536 537 SUBROUTINE oasis_put(k1,k2,p1,k3) 538 REAL(wp), DIMENSION(:,:), INTENT(in ) :: p1 539 INTEGER , INTENT(in ) :: k1,k2 540 INTEGER , INTENT( out) :: k3 541 k3 = -1 542 WRITE(numout,*) 'oasis_put: Error you sould not be there...' 543 END SUBROUTINE oasis_put 544 545 SUBROUTINE oasis_get(k1,k2,p1,k3) 546 REAL(wp), DIMENSION(:,:), INTENT( out) :: p1 547 INTEGER , INTENT(in ) :: k1,k2 548 INTEGER , INTENT( out) :: k3 549 p1(1,1) = -1. ; k3 = -1 550 WRITE(numout,*) 'oasis_get: Error you sould not be there...' 551 END SUBROUTINE oasis_get 552 553 SUBROUTINE oasis_get_freqs(k1,k2,k3,k4) 554 INTEGER , INTENT(in ) :: k1,k2 555 INTEGER, DIMENSION(1), INTENT( out) :: k3 556 INTEGER , INTENT( out) :: k4 557 k3(1) = k1 ; k4 = k2 558 WRITE(numout,*) 'oasis_get_freqs: Error you sould not be there...' 559 END SUBROUTINE oasis_get_freqs 560 561 SUBROUTINE oasis_terminate(k1) 562 INTEGER , INTENT( out) :: k1 563 k1 = -1 564 WRITE(numout,*) 'oasis_terminate: Error you sould not be there...' 565 END SUBROUTINE oasis_terminate 566 360 567 #endif 361 568 -
branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/cyclone.F90
- Property svn:keywords set to Id
r4230 r5837 41 41 !!---------------------------------------------------------------------- 42 42 !! NEMO/OPA 3.3 , LOCEAN-IPSL (2010) 43 !! $Id : module_example 1146 2008-06-25 11:42:56Z rblod$43 !! $Id$ 44 44 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 45 45 !!---------------------------------------------------------------------- -
branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/fldread.F90
r4371 r5837 40 40 LOGICAL :: ln_clim ! climatology or not (T/F) 41 41 CHARACTER(len = 8) :: cltype ! type of data file 'daily', 'monthly' or yearly' 42 CHARACTER(len = 34):: wname ! generic name of a NetCDF weights file to be used, blank if not42 CHARACTER(len = 256) :: wname ! generic name of a NetCDF weights file to be used, blank if not 43 43 CHARACTER(len = 34) :: vcomp ! symbolic component name if a vector that needs rotation 44 44 ! ! a string starting with "U" or "V" for each component … … 69 69 END TYPE FLD 70 70 71 TYPE, PUBLIC :: MAP_POINTER !: Array of integer pointers to 1D arrays 72 INTEGER, POINTER :: ptr(:) 71 TYPE, PUBLIC :: MAP_POINTER !: Map from input data file to local domain 72 INTEGER, POINTER, DIMENSION(:) :: ptr ! Array of integer pointers to 1D arrays 73 LOGICAL :: ll_unstruc ! Unstructured (T) or structured (F) boundary data file 73 74 END TYPE MAP_POINTER 74 75 … … 153 154 IF( PRESENT(kit) ) ll_firstcall = ll_firstcall .and. kit == 1 154 155 155 it_offset = 0 156 IF ( nn_components == jp_iam_sas ) THEN ; it_offset = nn_fsbc 157 ELSE ; it_offset = 0 158 ENDIF 156 159 IF( PRESENT(kt_offset) ) it_offset = kt_offset 157 160 … … 451 454 ENDIF 452 455 ! 453 it_offset = 0 456 IF ( nn_components == jp_iam_sas ) THEN ; it_offset = nn_fsbc 457 ELSE ; it_offset = 0 458 ENDIF 454 459 IF( PRESENT(kt_offset) ) it_offset = kt_offset 455 460 IF( PRESENT(kit) ) THEN ; it_offset = ( kit + it_offset ) * NINT( rdt/REAL(nn_baro,wp) ) … … 473 478 ! forcing record : 1 474 479 ! 475 ztmp = REAL( nday, wp ) / REAL( nyear_len(1), wp ) + 0.5 + REAL( it_offset, wp ) 480 ztmp = REAL( nsec_year, wp ) / ( REAL( nyear_len(1), wp ) * rday ) + 0.5 & 481 & + REAL( it_offset, wp ) / ( REAL( nyear_len(1), wp ) * rday ) 476 482 sdjf%nrec_a(1) = 1 + INT( ztmp ) - COUNT((/llbefore/)) 477 483 ! swap at the middle of the year 478 IF( llbefore ) THEN ; sdjf%nrec_a(2) = nsec1jan000 - NINT(0.5 * rday) * nyear_len(0) 479 ELSE ; sdjf%nrec_a(2) = nsec1jan000 + NINT(0.5 * rday) * nyear_len(1) 484 IF( llbefore ) THEN ; sdjf%nrec_a(2) = nsec1jan000 - (1 - INT(ztmp)) * NINT(0.5 * rday) * nyear_len(0) + & 485 & INT(ztmp) * NINT( 0.5 * rday) * nyear_len(1) 486 ELSE ; sdjf%nrec_a(2) = nsec1jan000 + (1 - INT(ztmp)) * NINT(0.5 * rday) * nyear_len(1) + & 487 & INT(ztmp) * INT(rday) * nyear_len(1) + INT(ztmp) * NINT( 0.5 * rday) * nyear_len(2) 480 488 ENDIF 481 489 ELSE ! no time interpolation … … 501 509 ! forcing record : nmonth 502 510 ! 503 ztmp = REAL( nday, wp ) / REAL( nmonth_len(nmonth), wp ) + 0.5 + REAL( it_offset, wp ) 511 ztmp = REAL( nsec_month, wp ) / ( REAL( nmonth_len(nmonth), wp ) * rday ) + 0.5 & 512 & + REAL( it_offset, wp ) / ( REAL( nmonth_len(nmonth), wp ) * rday ) 504 513 imth = nmonth + INT( ztmp ) - COUNT((/llbefore/)) 505 514 IF( sdjf%cltype == 'monthly' ) THEN ; sdjf%nrec_a(1) = 1 + INT( ztmp ) - COUNT((/llbefore/)) … … 597 606 ! 598 607 IF( ASSOCIATED(map%ptr) ) THEN 599 IF( sdjf%ln_tint ) THEN ; CALL fld_map( sdjf%num, sdjf%clvar, sdjf%fdta(:,:,:,2), sdjf%nrec_a(1), map %ptr)600 ELSE ; CALL fld_map( sdjf%num, sdjf%clvar, sdjf%fnow(:,:,: ), sdjf%nrec_a(1), map %ptr)608 IF( sdjf%ln_tint ) THEN ; CALL fld_map( sdjf%num, sdjf%clvar, sdjf%fdta(:,:,:,2), sdjf%nrec_a(1), map ) 609 ELSE ; CALL fld_map( sdjf%num, sdjf%clvar, sdjf%fnow(:,:,: ), sdjf%nrec_a(1), map ) 601 610 ENDIF 602 611 ELSE IF( LEN(TRIM(sdjf%wgtname)) > 0 ) THEN … … 668 677 REAL(wp), DIMENSION(:,:,:), INTENT(out) :: dta ! output field on model grid (2 dimensional) 669 678 INTEGER , INTENT(in ) :: nrec ! record number to read (ie time slice) 670 INTEGER, DIMENSION(:), INTENT(in ) :: map ! global-to-local mapping indices679 TYPE(MAP_POINTER) , INTENT(in ) :: map ! global-to-local mapping indices 671 680 !! 672 681 INTEGER :: ipi ! length of boundary data on local process … … 689 698 #if defined key_bdy 690 699 ipj = iom_file(num)%dimsz(2,idvar) 691 IF ( ipj == 1) THEN ! we assume that this is a structured open boundaryfile700 IF ( map%ll_unstruc) THEN ! unstructured open boundary data file 692 701 dta_read => dta_global 693 ELSE 702 ELSE ! structured open boundary data file 694 703 dta_read => dta_global2 695 704 ENDIF … … 704 713 END SELECT 705 714 ! 706 IF ( ipj==1) THEN715 IF ( map%ll_unstruc ) THEN ! unstructured open boundary data file 707 716 DO ib = 1, ipi 708 717 DO ik = 1, ipk 709 dta(ib,1,ik) = dta_read(map (ib),1,ik)718 dta(ib,1,ik) = dta_read(map%ptr(ib),1,ik) 710 719 END DO 711 720 END DO 712 ELSE ! we assume that this is a structured open boundaryfile721 ELSE ! structured open boundary data file 713 722 DO ib = 1, ipi 714 jj=1+floor(REAL(map (ib)-1)/REAL(ilendta))715 ji=map (ib)-(jj-1)*ilendta723 jj=1+floor(REAL(map%ptr(ib)-1)/REAL(ilendta)) 724 ji=map%ptr(ib)-(jj-1)*ilendta 716 725 DO ik = 1, ipk 717 726 dta(ib,1,ik) = dta_read(ji,jj,ik) … … 1016 1025 INTEGER :: ipk ! temporary vertical dimension 1017 1026 CHARACTER (len=5) :: aname 1018 INTEGER , DIMENSION( 3):: ddims1027 INTEGER , DIMENSION(:), ALLOCATABLE :: ddims 1019 1028 INTEGER , POINTER, DIMENSION(:,:) :: data_src 1020 1029 REAL(wp), POINTER, DIMENSION(:,:) :: data_tmp … … 1039 1048 1040 1049 !! get dimensions 1050 IF ( SIZE(sd%fnow, 3) > 1 ) THEN 1051 ALLOCATE( ddims(4) ) 1052 ELSE 1053 ALLOCATE( ddims(3) ) 1054 ENDIF 1041 1055 id = iom_varid( inum, sd%clvar, ddims ) 1042 1056 … … 1135 1149 CALL ctl_stop( ' fld_weight : unable to read the file ' ) 1136 1150 ENDIF 1151 1152 DEALLOCATE (ddims ) 1137 1153 1138 1154 CALL wrk_dealloc( jpi,jpj, data_src ) ! integer -
branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/sbc_ice.F90
r4306 r5837 14 14 !!---------------------------------------------------------------------- 15 15 USE par_oce ! ocean parameters 16 USE sbc_oce ! surface boundary condition: ocean 16 17 # if defined key_lim3 17 USE par_ice! LIM-3 parameters18 USE ice ! LIM-3 parameters 18 19 # endif 19 20 # if defined key_lim2 … … 21 22 USE ice_2 22 23 # endif 23 # if defined key_cice 24 # if defined key_cice 24 25 USE ice_domain_size, only: ncat 25 26 #endif … … 55 56 # endif 56 57 57 #if defined key_lim3 || defined key_lim2 58 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: qns_ice !: non solar heat flux over ice [W/m2] 59 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: qsr_ice !: solar heat flux over ice [W/m2] 60 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: qsr_ice_mean !: dauly mean solar heat flux over ice [W/m2] 61 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: qla_ice !: latent flux over ice [W/m2] 62 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: dqla_ice !: latent sensibility over ice [W/m2/K] 63 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: dqns_ice !: non solar heat flux over ice (LW+SEN+LA) [W/m2/K] 64 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: tn_ice !: ice surface temperature [K] 65 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: alb_ice !: albedo of ice 58 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: qns_ice !: non solar heat flux over ice [W/m2] 59 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: qsr_ice !: solar heat flux over ice [W/m2] 60 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: qla_ice !: latent flux over ice [W/m2] 61 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: dqla_ice !: latent sensibility over ice [W/m2/K] 62 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: dqns_ice !: non solar heat flux over ice (LW+SEN+LA) [W/m2/K] 63 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: tn_ice !: ice surface temperature [K] 64 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: alb_ice !: ice albedo [-] 66 65 67 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: utau_ice !: atmos-ice u-stress. VP: I-pt ; EVP: U,V-pts [N/m2]68 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: vtau_ice !: atmos-ice v-stress. VP: I-pt ; EVP: U,V-pts [N/m2]69 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: fr1_i0 !: 1st Qsr fraction penetrating inside ice cover[-]70 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: fr2_i0 !: 2nd Qsr fraction penetrating inside ice cover[-]71 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: emp_ice !: sublimation-snow budget over ice [kg/m2]66 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: utau_ice !: atmos-ice u-stress. VP: I-pt ; EVP: U,V-pts [N/m2] 67 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: vtau_ice !: atmos-ice v-stress. VP: I-pt ; EVP: U,V-pts [N/m2] 68 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: fr1_i0 !: Solar surface transmission parameter, thick ice [-] 69 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: fr2_i0 !: Solar surface transmission parameter, thin ice [-] 70 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: emp_ice !: sublimation - precip over sea ice [kg/m2/s] 72 71 73 # if defined key_lim3 74 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: tatm_ice !: air temperature 75 # endif 72 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: topmelt !: category topmelt 73 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: botmelt !: category botmelt 76 74 77 #elif defined key_cice 75 #if defined key_lim3 76 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: evap_ice !: sublimation [kg/m2/s] 77 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: devap_ice !: sublimation sensitivity [kg/m2/s/K] 78 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: qns_oce !: non solar heat flux over ocean [W/m2] 79 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: qsr_oce !: non solar heat flux over ocean [W/m2] 80 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: qemp_oce !: heat flux of precip and evap over ocean [W/m2] 81 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: qemp_ice !: heat flux of precip and evap over ice [W/m2] 82 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: qprec_ice !: heat flux of precip over ice [J/m3] 83 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: emp_oce !: evap - precip over ocean [kg/m2/s] 84 #endif 85 #if defined key_lim3 || defined key_lim2 86 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wndm_ice !: wind speed module at T-point [m/s] 87 #endif 88 89 #if defined key_cice 78 90 ! 79 91 ! for consistency with LIM, these are declared with three dimensions 80 92 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: qlw_ice !: incoming long-wave 81 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: qla_ice !: latent flux over ice [W/m2]82 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: qsr_ice !: solar heat flux over ice [W/m2]83 93 ! 84 94 ! other forcing arrays are two dimensional 85 95 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: ss_iou !: x ice-ocean surface stress at NEMO U point 86 96 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: ss_iov !: y ice-ocean surface stress at NEMO V point 87 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: emp_ice !: sublimation-snow budget over ice [kg/m2]88 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: tatm_ice !: air temperature89 97 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: qatm_ice !: specific humidity 90 98 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wndi_ice !: i wind at T point … … 93 101 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: fr_iu !: ice fraction at NEMO U point 94 102 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: fr_iv !: ice fraction at NEMO V point 95 ! 96 ! finally, arrays corresponding to different ice categories 97 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: a_i !: category ice fraction 98 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: topmelt !: category topmelt 99 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: botmelt !: category botmelt 103 104 ! variables used in the coupled interface 105 INTEGER , PUBLIC, PARAMETER :: jpl = ncat 106 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: u_ice, v_ice ! jpi, jpj 100 107 #endif 108 109 #if defined key_lim2 || defined key_cice 110 ! already defined in ice.F90 for LIM3 111 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: a_i 112 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: ht_i, ht_s 113 #endif 114 115 #if defined key_cice 116 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: tatm_ice !: air temperature [K] 117 #endif 118 119 REAL(wp), PUBLIC, SAVE :: cldf_ice = 0.81 !: cloud fraction over sea ice, summer CLIO value [-] 101 120 102 121 !!---------------------------------------------------------------------- … … 111 130 !! *** FUNCTION sbc_ice_alloc *** 112 131 !!---------------------------------------------------------------------- 113 INTEGER :: ierr( 2)132 INTEGER :: ierr(5) 114 133 !!---------------------------------------------------------------------- 115 134 ierr(:) = 0 … … 118 137 ALLOCATE( qns_ice (jpi,jpj,jpl) , qsr_ice (jpi,jpj,jpl) , & 119 138 & qla_ice (jpi,jpj,jpl) , dqla_ice(jpi,jpj,jpl) , & 120 & dqns_ice(jpi,jpj,jpl) , tn_ice (jpi,jpj,jpl) , & 121 & alb_ice (jpi,jpj,jpl) , & 122 & utau_ice(jpi,jpj) , vtau_ice(jpi,jpj) , & 139 & dqns_ice(jpi,jpj,jpl) , tn_ice (jpi,jpj,jpl) , alb_ice (jpi,jpj,jpl) , & 140 & utau_ice(jpi,jpj) , vtau_ice(jpi,jpj) , wndm_ice(jpi,jpj) , & 123 141 & fr1_i0 (jpi,jpj) , fr2_i0 (jpi,jpj) , & 142 #if defined key_lim2 143 & a_i(jpi,jpj,jpl) , & 144 #endif 124 145 #if defined key_lim3 125 & e mp_ice(jpi,jpj) , tatm_ice(jpi,jpj) , STAT= ierr(1) )126 #else 127 & emp_ice(jpi,jpj) , STAT= ierr(1) )146 & evap_ice(jpi,jpj,jpl) , devap_ice(jpi,jpj,jpl) , qprec_ice(jpi,jpj) , & 147 & qemp_ice(jpi,jpj) , qemp_oce(jpi,jpj) , & 148 & qns_oce (jpi,jpj) , qsr_oce (jpi,jpj) , emp_oce (jpi,jpj) , & 128 149 #endif 129 #elif defined key_cice 150 & emp_ice(jpi,jpj) , STAT= ierr(1) ) 151 #endif 152 153 #if defined key_cice 130 154 ALLOCATE( qla_ice(jpi,jpj,1) , qlw_ice(jpi,jpj,1) , qsr_ice(jpi,jpj,1) , & 131 155 wndi_ice(jpi,jpj) , tatm_ice(jpi,jpj) , qatm_ice(jpi,jpj) , & 132 156 wndj_ice(jpi,jpj) , nfrzmlt(jpi,jpj) , ss_iou(jpi,jpj) , & 133 157 ss_iov(jpi,jpj) , fr_iu(jpi,jpj) , fr_iv(jpi,jpj) , & 134 a_i(jpi,jpj,ncat) , topmelt(jpi,jpj,ncat) , botmelt(jpi,jpj,ncat), STAT= ierr(1) ) 158 a_i(jpi,jpj,ncat) , topmelt(jpi,jpj,ncat) , botmelt(jpi,jpj,ncat) , & 159 STAT= ierr(1) ) 160 IF( ln_cpl ) ALLOCATE( u_ice(jpi,jpj) , fr1_i0(jpi,jpj) , tn_ice (jpi,jpj,1) , & 161 & v_ice(jpi,jpj) , fr2_i0(jpi,jpj) , alb_ice(jpi,jpj,1) , & 162 & emp_ice(jpi,jpj) , qns_ice(jpi,jpj,1) , dqns_ice(jpi,jpj,1) , & 163 & STAT= ierr(2) ) 164 135 165 #endif 136 166 ! 137 #if defined key_lim2 138 IF( ltrcdm2dc_ice )THEN 139 ALLOCATE( qsr_ice_mean (jpi,jpj,jpl), STAT=ierr(2) ) 140 ENDIF 167 #if defined key_cice || defined key_lim2 168 IF( ln_cpl ) ALLOCATE( ht_i(jpi,jpj,jpl) , ht_s(jpi,jpj,jpl) , STAT=ierr(5) ) 141 169 #endif 142 ! 170 143 171 sbc_ice_alloc = MAXVAL( ierr ) 144 172 IF( lk_mpp ) CALL mpp_sum ( sbc_ice_alloc ) … … 150 178 !! Default option NO LIM 2.0 or 3.0 or CICE sea-ice model 151 179 !!---------------------------------------------------------------------- 180 USE in_out_manager ! I/O manager 152 181 LOGICAL , PUBLIC, PARAMETER :: lk_lim2 = .FALSE. !: no LIM-2 ice model 153 182 LOGICAL , PUBLIC, PARAMETER :: lk_lim3 = .FALSE. !: no LIM-3 ice model 154 183 LOGICAL , PUBLIC, PARAMETER :: lk_cice = .FALSE. !: no CICE ice model 155 184 CHARACTER(len=1), PUBLIC, PARAMETER :: cp_ice_msh = '-' !: no grid ice-velocity 185 REAL , PUBLIC, PARAMETER :: cldf_ice = 0.81 !: cloud fraction over sea ice, summer CLIO value [-] 186 INTEGER , PUBLIC, PARAMETER :: jpl = 1 187 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: u_ice, v_ice,fr1_i0,fr2_i0 ! jpi, jpj 188 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: tn_ice, alb_ice, qns_ice, dqns_ice ! (jpi,jpj,jpl) 189 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: a_i 190 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: emp_ice 191 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: qsr_ice 192 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: ht_i, ht_s 193 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: topmelt, botmelt 156 194 #endif 157 195 -
branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/sbc_oce.F90
r4306 r5837 35 35 LOGICAL , PUBLIC :: ln_blk_core !: CORE bulk formulation 36 36 LOGICAL , PUBLIC :: ln_blk_mfs !: MFS bulk formulation 37 LOGICAL , PUBLIC :: ln_cpl !: coupled formulation (overwritten by key_sbc_coupled ) 37 #if defined key_oasis3 38 LOGICAL , PUBLIC :: lk_oasis = .TRUE. !: OASIS used 39 #else 40 LOGICAL , PUBLIC :: lk_oasis = .FALSE. !: OASIS unused 41 #endif 42 LOGICAL , PUBLIC :: ln_cpl !: ocean-atmosphere coupled formulation 43 LOGICAL , PUBLIC :: ln_mixcpl !: ocean-atmosphere forced-coupled mixed formulation 38 44 LOGICAL , PUBLIC :: ln_dm2dc !: Daily mean to Diurnal Cycle short wave (qsr) 39 45 LOGICAL , PUBLIC :: ln_rnf !: runoffs / runoff mouths … … 41 47 LOGICAL , PUBLIC :: ln_apr_dyn !: Atmospheric pressure forcing used on dynamics (ocean & ice) 42 48 INTEGER , PUBLIC :: nn_ice !: flag for ice in the surface boundary condition (=0/1/2/3) 49 INTEGER , PUBLIC :: nn_isf !: flag for isf in the surface boundary condition (=0/1/2/3/4) 43 50 INTEGER , PUBLIC :: nn_ice_embd !: flag for levitating/embedding sea-ice in the ocean 44 51 ! !: =0 levitating ice (no mass exchange, concentration/dilution effect) 45 52 ! !: =1 levitating ice with mass and salt exchange but no presure effect 46 53 ! !: =2 embedded sea-ice (full salt and mass exchanges and pressure) 54 INTEGER , PUBLIC :: nn_components !: flag for sbc module (including sea-ice) coupling mode (see component definition below) 55 INTEGER , PUBLIC :: nn_limflx !: LIM3 Multi-category heat flux formulation 56 ! !: =-1 Use of per-category fluxes 57 ! !: = 0 Average per-category fluxes 58 ! !: = 1 Average then redistribute per-category fluxes 59 ! !: = 2 Redistribute a single flux over categories 47 60 INTEGER , PUBLIC :: nn_fwb !: FreshWater Budget: 48 61 ! !: = 0 unchecked … … 55 68 LOGICAL , PUBLIC :: ln_icebergs !: Icebergs 56 69 ! 57 CHARACTER (len=8), PUBLIC :: cn_iceflx !: Flux handling over ice categories 58 LOGICAL, PUBLIC :: ln_iceflx_ave ! Average heat fluxes over all ice categories 59 LOGICAL, PUBLIC :: ln_iceflx_linear ! Redistribute mean heat fluxes over all ice categories, using ice temperature and albedo 70 INTEGER , PUBLIC :: nn_lsm !: Number of iteration if seaoverland is applied 71 !!---------------------------------------------------------------------- 72 !! switch definition (improve readability) 73 !!---------------------------------------------------------------------- 74 INTEGER , PUBLIC, PARAMETER :: jp_gyre = 0 !: GYRE analytical formulation 75 INTEGER , PUBLIC, PARAMETER :: jp_ana = 1 !: analytical formulation 76 INTEGER , PUBLIC, PARAMETER :: jp_flx = 2 !: flux formulation 77 INTEGER , PUBLIC, PARAMETER :: jp_clio = 3 !: CLIO bulk formulation 78 INTEGER , PUBLIC, PARAMETER :: jp_core = 4 !: CORE bulk formulation 79 INTEGER , PUBLIC, PARAMETER :: jp_purecpl = 5 !: Pure ocean-atmosphere Coupled formulation 80 INTEGER , PUBLIC, PARAMETER :: jp_mfs = 6 !: MFS bulk formulation 81 INTEGER , PUBLIC, PARAMETER :: jp_none = 7 !: for OPA when doing coupling via SAS module 82 INTEGER , PUBLIC, PARAMETER :: jp_esopa = -1 !: esopa test, ALL formulations 83 84 !!---------------------------------------------------------------------- 85 !! component definition 86 !!---------------------------------------------------------------------- 87 INTEGER , PUBLIC, PARAMETER :: jp_iam_nemo = 0 !: Initial single executable configuration 88 ! (no internal OASIS coupling) 89 INTEGER , PUBLIC, PARAMETER :: jp_iam_opa = 1 !: Multi executable configuration - OPA component 90 ! (internal OASIS coupling) 91 INTEGER , PUBLIC, PARAMETER :: jp_iam_sas = 2 !: Multi executable configuration - SAS component 92 ! (internal OASIS coupling) 93 !!---------------------------------------------------------------------- 94 !! Ocean Surface Boundary Condition fields 95 !!---------------------------------------------------------------------- 96 INTEGER , PUBLIC :: ncpl_qsr_freq !: qsr coupling frequency per days from atmosphere 60 97 ! 61 INTEGER , PUBLIC :: nn_lsm !: Number of iteration if seaoverland is applied62 !!----------------------------------------------------------------------63 !! Ocean Surface Boundary Condition fields64 !!----------------------------------------------------------------------65 98 LOGICAL , PUBLIC :: lhftau = .FALSE. !: HF tau used in TKE: mean(stress module) - module(mean stress) 66 LOGICAL , PUBLIC :: ltrcdm2dc !: In case of Diurnal Cycle short wave, compute a Daily Mean short waves flux67 99 !! !! now ! before !! 68 100 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: utau , utau_b !: sea surface i-stress (ocean referential) [N/m2] … … 72 104 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wndm !: wind speed module at T-point (=|U10m-Uoce|) [m/s] 73 105 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: qsr !: sea heat flux: solar [W/m2] 74 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: qsr_mean !: daily mean sea heat flux: solar [W/m2]75 106 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: qns , qns_b !: sea heat flux: non solar [W/m2] 76 107 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: qsr_tot !: total solar heat flux (over sea and ice) [W/m2] … … 80 111 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: emp_tot !: total E-P over ocean and ice [Kg/m2/s] 81 112 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: fmmflx !: freshwater budget: freezing/melting [Kg/m2/s] 82 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: rnf , rnf_b !: river runoff [Kg/m2/s] 113 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: rnf , rnf_b !: river runoff [Kg/m2/s] 114 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: fwfisf , fwfisf_b !: ice shelf melting [Kg/m2/s] 83 115 !! 84 116 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: sbc_tsc, sbc_tsc_b !: sbc content trend [K.m/s] jpi,jpj,jpts … … 92 124 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: atm_co2 !: atmospheric pCO2 [ppm] 93 125 #endif 126 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xcplmask !: coupling mask for ln_mixcpl (warning: allocated in sbccpl) 94 127 95 128 !!---------------------------------------------------------------------- … … 102 135 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sss_m !: mean (nn_fsbc time-step) surface sea salinity [psu] 103 136 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: ssh_m !: mean (nn_fsbc time-step) sea surface height [m] 104 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: e3t_m !: mean (nn_fsbc time-step) sea surface height [m] 137 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: e3t_m !: mean (nn_fsbc time-step) sea surface layer thickness [m] 138 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: frq_m !: mean (nn_fsbc time-step) fraction of solar net radiation absorbed in the 1st T level [-] 105 139 106 140 !! * Substitutions … … 129 163 & sfx (jpi,jpj) , sfx_b(jpi,jpj) , emp_tot(jpi,jpj), fmmflx(jpi,jpj), STAT=ierr(2) ) 130 164 ! 131 ALLOCATE( rnf (jpi,jpj) , sbc_tsc (jpi,jpj,jpts) , qsr_hc (jpi,jpj,jpk) , &132 & rnf_b(jpi,jpj) , sbc_tsc_b(jpi,jpj,jpts) , qsr_hc_b(jpi,jpj,jpk) , STAT=ierr(3) )165 ALLOCATE( fwfisf (jpi,jpj), rnf (jpi,jpj) , sbc_tsc (jpi,jpj,jpts) , qsr_hc (jpi,jpj,jpk) , & 166 & fwfisf_b(jpi,jpj), rnf_b(jpi,jpj) , sbc_tsc_b(jpi,jpj,jpts) , qsr_hc_b(jpi,jpj,jpk) , STAT=ierr(3) ) 133 167 ! 134 168 ALLOCATE( tprecip(jpi,jpj) , sprecip(jpi,jpj) , fr_i(jpi,jpj) , & … … 136 170 & atm_co2(jpi,jpj) , & 137 171 #endif 138 & ssu_m (jpi,jpj) , sst_m(jpi,jpj) , 139 & ssv_m (jpi,jpj) , sss_m (jpi,jpj), ssh_m(jpi,jpj) , STAT=ierr(4) )172 & ssu_m (jpi,jpj) , sst_m(jpi,jpj) , frq_m(jpi,jpj) , & 173 & ssv_m (jpi,jpj) , sss_m(jpi,jpj) , ssh_m(jpi,jpj) , STAT=ierr(4) ) 140 174 ! 141 175 #if defined key_vvl 142 176 ALLOCATE( e3t_m(jpi,jpj) , STAT=ierr(5) ) 143 177 #endif 144 !145 IF( ltrcdm2dc ) ALLOCATE( qsr_mean(jpi,jpj) , STAT=ierr(5) )146 178 ! 147 179 sbc_oce_alloc = MAXVAL( ierr ) -
branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/sbcapr.F90
- Property svn:keywords set to Id
r4624 r5837 43 43 !!---------------------------------------------------------------------- 44 44 !! NEMO/OPA 4.0 , NEMO Consortium (2011) 45 !! $Id :$45 !! $Id$ 46 46 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 47 47 !!---------------------------------------------------------------------- -
branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/sbcblk_clio.F90
r4624 r5837 34 34 USE albedo 35 35 USE prtctl ! Print control 36 #if defined key_lim3 36 #if defined key_lim3 37 37 USE ice 38 38 USE sbc_ice ! Surface boundary condition: ice fields 39 USE limthd_dh ! for CALL lim_thd_snwblow 39 40 #elif defined key_lim2 40 41 USE ice_2 42 USE sbc_ice ! Surface boundary condition: ice fields 43 USE par_ice_2 ! Surface boundary condition: ice fields 41 44 #endif 42 45 … … 45 48 46 49 PUBLIC sbc_blk_clio ! routine called by sbcmod.F90 47 PUBLIC blk_ice_clio ! routine called by sbcice_lim.F90 50 #if defined key_lim2 || defined key_lim3 51 PUBLIC blk_ice_clio_tau ! routine called by sbcice_lim.F90 52 PUBLIC blk_ice_clio_flx ! routine called by sbcice_lim.F90 53 #endif 48 54 49 55 INTEGER , PARAMETER :: jpfld = 7 ! maximum number of files to read … … 62 68 LOGICAL :: lbulk_init = .TRUE. ! flag, bulk initialization done or not) 63 69 64 #if ! defined key_lim365 ! in namicerun with LIM366 70 REAL(wp) :: cai = 1.40e-3 ! best estimate of atm drag in order to get correct FS export in ORCA2-LIM 67 71 REAL(wp) :: cao = 1.00e-3 ! chosen by default ==> should depends on many things... !!gmto be updated 68 #endif69 72 70 73 REAL(wp) :: rdtbs2 !: … … 114 117 !! - utau, vtau i- and j-component of the wind stress 115 118 !! - taum wind stress module at T-point 116 !! - wndm 10m wind module at T-point 119 !! - wndm 10m wind module at T-point over free ocean or leads in presence of sea-ice 117 120 !! - qns non-solar heat flux including latent heat of solid 118 121 !! precip. melting and emp heat content … … 204 207 !! - utau, vtau i- and j-component of the wind stress 205 208 !! - taum wind stress module at T-point 206 !! - wndm 10m wind module at T-point 209 !! - wndm 10m wind module at T-point over free ocean or leads in presence of sea-ice 207 210 !! - qns non-solar heat flux including latent heat of solid 208 211 !! precip. melting and emp heat content … … 257 260 END DO 258 261 END DO 262 utau(:,:) = utau(:,:) * umask(:,:,1) 263 vtau(:,:) = vtau(:,:) * vmask(:,:,1) 264 taum(:,:) = taum(:,:) * tmask(:,:,1) 259 265 CALL lbc_lnk( taum, 'T', 1. ) 260 266 … … 264 270 !CDIR COLLAPSE 265 271 wndm(:,:) = sf(jp_wndm)%fnow(:,:,1) 272 wndm(:,:) = wndm(:,:) * tmask(:,:,1) 266 273 267 274 !------------------------------------------------! … … 270 277 271 278 CALL blk_clio_qsr_oce( qsr ) 272 279 qsr(:,:) = qsr(:,:) * tmask(:,:,1) ! no shortwave radiation into the ocean beneath ice shelf 273 280 !------------------------! 274 281 ! Other ocean fluxes ! … … 376 383 & - zqla(:,:) * pst(:,:) * zcevap & ! remove evap. heat content at SST in Celcius 377 384 & + sf(jp_prec)%fnow(:,:,1) * sf(jp_tair)%fnow(:,:,1) * zcprec ! add precip. heat content at Tair in Celcius 385 qns(:,:) = qns(:,:) * tmask(:,:,1) 386 #if defined key_lim3 387 qns_oce(:,:) = zqlw(:,:) - zqsb(:,:) - zqla(:,:) 388 qsr_oce(:,:) = qsr(:,:) 389 #endif 378 390 ! NB: if sea-ice model, the snow precip are computed and the associated heat is added to qns (see blk_ice_clio) 379 391 380 CALL iom_put( "qlw_oce", zqlw ) ! output downward longwave heat over the ocean 381 CALL iom_put( "qsb_oce", - zqsb ) ! output downward sensible heat over the ocean 382 CALL iom_put( "qla_oce", - zqla ) ! output downward latent heat over the ocean 383 CALL iom_put( "qns_oce", qns ) ! output downward non solar heat over the ocean 392 IF ( nn_ice == 0 ) THEN 393 CALL iom_put( "qlw_oce" , zqlw ) ! output downward longwave heat over the ocean 394 CALL iom_put( "qsb_oce" , - zqsb ) ! output downward sensible heat over the ocean 395 CALL iom_put( "qla_oce" , - zqla ) ! output downward latent heat over the ocean 396 CALL iom_put( "qemp_oce", qns-zqlw+zqsb+zqla ) ! output downward heat content of E-P over the ocean 397 CALL iom_put( "qns_oce" , qns ) ! output downward non solar heat over the ocean 398 CALL iom_put( "qsr_oce" , qsr ) ! output downward solar heat over the ocean 399 CALL iom_put( "qt_oce" , qns+qsr ) ! output total downward heat over the ocean 400 ENDIF 384 401 385 402 IF(ln_ctl) THEN … … 397 414 END SUBROUTINE blk_oce_clio 398 415 399 400 SUBROUTINE blk_ice_clio( pst , palb_cs, palb_os , & 401 & p_taui, p_tauj, p_qns , p_qsr, & 402 & p_qla , p_dqns, p_dqla, & 403 & p_tpr , p_spr , & 404 & p_fr1 , p_fr2 , cd_grid, pdim ) 416 # if defined key_lim2 || defined key_lim3 417 SUBROUTINE blk_ice_clio_tau 405 418 !!--------------------------------------------------------------------------- 406 !! *** ROUTINE blk_ice_clio *** 419 !! *** ROUTINE blk_ice_clio_tau *** 420 !! 421 !! ** Purpose : Computation momentum flux at the ice-atm interface 422 !! 423 !! ** Method : Read utau from a forcing file. Rearrange if C-grid 424 !! 425 !!---------------------------------------------------------------------- 426 REAL(wp) :: zcoef 427 INTEGER :: ji, jj ! dummy loop indices 428 !!--------------------------------------------------------------------- 429 ! 430 IF( nn_timing == 1 ) CALL timing_start('blk_ice_clio_tau') 431 432 SELECT CASE( cp_ice_msh ) 433 434 CASE( 'C' ) ! C-grid ice dynamics 435 436 zcoef = cai / cao ! Change from air-sea stress to air-ice stress 437 utau_ice(:,:) = zcoef * utau(:,:) 438 vtau_ice(:,:) = zcoef * vtau(:,:) 439 440 CASE( 'I' ) ! I-grid ice dynamics: I-point (i.e. F-point lower-left corner) 441 442 zcoef = 0.5_wp * cai / cao ! Change from air-sea stress to air-ice stress 443 DO jj = 2, jpj ! stress from ocean U- and V-points to ice U,V point 444 DO ji = 2, jpi ! I-grid : no vector opt. 445 utau_ice(ji,jj) = zcoef * ( utau(ji-1,jj ) + utau(ji-1,jj-1) ) 446 vtau_ice(ji,jj) = zcoef * ( vtau(ji ,jj-1) + vtau(ji-1,jj-1) ) 447 END DO 448 END DO 449 450 CALL lbc_lnk( utau_ice(:,:), 'I', -1. ) ; CALL lbc_lnk( vtau_ice(:,:), 'I', -1. ) ! I-point 451 452 END SELECT 453 454 IF(ln_ctl) THEN 455 CALL prt_ctl(tab2d_1=utau_ice , clinfo1=' blk_ice_clio: utau_ice : ', tab2d_2=vtau_ice , clinfo2=' vtau_ice : ') 456 ENDIF 457 458 IF( nn_timing == 1 ) CALL timing_stop('blk_ice_clio_tau') 459 460 END SUBROUTINE blk_ice_clio_tau 461 #endif 462 463 # if defined key_lim2 || defined key_lim3 464 SUBROUTINE blk_ice_clio_flx( ptsu , palb_cs, palb_os, palb ) 465 !!--------------------------------------------------------------------------- 466 !! *** ROUTINE blk_ice_clio_flx *** 407 467 !! 408 468 !! ** Purpose : Computation of the heat fluxes at ocean and snow/ice … … 426 486 !! to take into account solid precip latent heat flux 427 487 !!---------------------------------------------------------------------- 428 REAL(wp), INTENT(in ), DIMENSION(:,:,:) :: pst ! ice surface temperature [Kelvin] 429 REAL(wp), INTENT(in ), DIMENSION(:,:,:) :: palb_cs ! ice albedo (clear sky) (alb_ice_cs) [%] 430 REAL(wp), INTENT(in ), DIMENSION(:,:,:) :: palb_os ! ice albedo (overcast sky) (alb_ice_os) [%] 431 REAL(wp), INTENT( out), DIMENSION(jpi,jpj) :: p_taui ! surface ice stress at I-point (i-component) [N/m2] 432 REAL(wp), INTENT( out), DIMENSION(jpi,jpj) :: p_tauj ! surface ice stress at I-point (j-component) [N/m2] 433 REAL(wp), INTENT( out), DIMENSION(:,:,:) :: p_qns ! non solar heat flux over ice (T-point) [W/m2] 434 REAL(wp), INTENT( out), DIMENSION(:,:,:) :: p_qsr ! solar heat flux over ice (T-point) [W/m2] 435 REAL(wp), INTENT( out), DIMENSION(:,:,:) :: p_qla ! latent heat flux over ice (T-point) [W/m2] 436 REAL(wp), INTENT( out), DIMENSION(:,:,:) :: p_dqns ! non solar heat sensistivity (T-point) [W/m2] 437 REAL(wp), INTENT( out), DIMENSION(:,:,:) :: p_dqla ! latent heat sensistivity (T-point) [W/m2] 438 REAL(wp), INTENT( out), DIMENSION(jpi,jpj) :: p_tpr ! total precipitation (T-point) [Kg/m2/s] 439 REAL(wp), INTENT( out), DIMENSION(jpi,jpj) :: p_spr ! solid precipitation (T-point) [Kg/m2/s] 440 REAL(wp), INTENT( out), DIMENSION(jpi,jpj) :: p_fr1 ! 1sr fraction of qsr penetration in ice [%] 441 REAL(wp), INTENT( out), DIMENSION(jpi,jpj) :: p_fr2 ! 2nd fraction of qsr penetration in ice [%] 442 CHARACTER(len=1), INTENT(in ) :: cd_grid ! type of sea-ice grid ("C" or "B" grid) 443 INTEGER, INTENT(in ) :: pdim ! number of ice categories 488 REAL(wp), INTENT(in ), DIMENSION(:,:,:) :: ptsu ! ice surface temperature [Kelvin] 489 REAL(wp), INTENT(in ), DIMENSION(:,:,:) :: palb_cs ! ice albedo (clear sky) (alb_ice_cs) [-] 490 REAL(wp), INTENT(in ), DIMENSION(:,:,:) :: palb_os ! ice albedo (overcast sky) (alb_ice_os) [-] 491 REAL(wp), INTENT( out), DIMENSION(:,:,:) :: palb ! ice albedo (actual value) [-] 444 492 !! 445 493 INTEGER :: ji, jj, jl ! dummy loop indices 446 INTEGER :: ijpl ! number of ice categories (size of 3rd dim of input arrays) 447 !! 448 REAL(wp) :: zcoef, zmt1, zmt2, zmt3, ztatm3 ! temporary scalars 494 !! 495 REAL(wp) :: zmt1, zmt2, zmt3, ztatm3 ! temporary scalars 449 496 REAL(wp) :: ztaevbk, zind1, zind2, zind3, ztamr ! - - 450 497 REAL(wp) :: zesi, zqsati, zdesidt ! - - … … 452 499 REAL(wp) :: zcshi, zclei, zrhovaclei, zrhovacshi ! - - 453 500 REAL(wp) :: ztice3, zticemb, zticemb2, zdqlw, zdqsb ! - - 501 REAL(wp) :: z1_lsub ! - - 454 502 !! 455 503 REAL(wp), DIMENSION(:,:) , POINTER :: ztatm ! Tair in Kelvin … … 458 506 REAL(wp), DIMENSION(:,:) , POINTER :: zrhoa ! air density 459 507 REAL(wp), DIMENSION(:,:,:), POINTER :: z_qlw, z_qsb 508 REAL(wp), DIMENSION(:,:) , POINTER :: zevap, zsnw 460 509 !!--------------------------------------------------------------------- 461 510 ! 462 IF( nn_timing == 1 ) CALL timing_start('blk_ice_clio ')511 IF( nn_timing == 1 ) CALL timing_start('blk_ice_clio_flx') 463 512 ! 464 513 CALL wrk_alloc( jpi,jpj, ztatm, zqatm, zevsqr, zrhoa ) 465 CALL wrk_alloc( jpi,jpj,pdim, z_qlw, z_qsb ) 466 467 ijpl = pdim ! number of ice categories 514 CALL wrk_alloc( jpi,jpj, jpl, z_qlw, z_qsb ) 515 468 516 zpatm = 101000. ! atmospheric pressure (assumed constant here) 469 470 #if defined key_lim3 471 tatm_ice(:,:) = sf(jp_tair)%fnow(:,:,1) ! LIM3: make Tair available in sea-ice. WARNING allocated after call to ice_init 472 #endif 473 ! ! surface ocean fluxes computed with CLIO bulk formulea 474 !------------------------------------! 475 ! momentum fluxes (utau, vtau ) ! 476 !------------------------------------! 477 478 SELECT CASE( cd_grid ) 479 CASE( 'C' ) ! C-grid ice dynamics 480 zcoef = cai / cao ! Change from air-sea stress to air-ice stress 481 p_taui(:,:) = zcoef * utau(:,:) 482 p_tauj(:,:) = zcoef * vtau(:,:) 483 CASE( 'I' ) ! I-grid ice dynamics: I-point (i.e. F-point lower-left corner) 484 zcoef = 0.5_wp * cai / cao ! Change from air-sea stress to air-ice stress 485 DO jj = 2, jpj ! stress from ocean U- and V-points to ice U,V point 486 DO ji = 2, jpi ! I-grid : no vector opt. 487 p_taui(ji,jj) = zcoef * ( utau(ji-1,jj ) + utau(ji-1,jj-1) ) 488 p_tauj(ji,jj) = zcoef * ( vtau(ji ,jj-1) + vtau(ji-1,jj-1) ) 489 END DO 490 END DO 491 CALL lbc_lnk( p_taui(:,:), 'I', -1. ) ; CALL lbc_lnk( p_tauj(:,:), 'I', -1. ) ! I-point 492 END SELECT 493 494 517 !-------------------------------------------------------------------------------- 495 518 ! Determine cloud optical depths as a function of latitude (Chou et al., 1981). 496 519 ! and the correction factor for taking into account the effect of clouds 497 !------------------------------------------------------ 520 !-------------------------------------------------------------------------------- 521 498 522 !CDIR NOVERRCHK 499 523 !CDIR COLLAPSE … … 522 546 zmt2 = ( 272.0 - ztatm(ji,jj) ) / 38.0 ; zind2 = MAX( 0.e0, SIGN( 1.e0, zmt2 ) ) 523 547 zmt3 = ( 281.0 - ztatm(ji,jj) ) / 18.0 ; zind3 = MAX( 0.e0, SIGN( 1.e0, zmt3 ) ) 524 p_spr(ji,jj) = sf(jp_prec)%fnow(ji,jj,1) / rday & ! rday = converte mm/day to kg/m2/s548 sprecip(ji,jj) = sf(jp_prec)%fnow(ji,jj,1) / rday & ! rday = converte mm/day to kg/m2/s 525 549 & * ( zind1 & ! solid (snow) precipitation [kg/m2/s] 526 550 & + ( 1.0 - zind1 ) * ( zind2 * ( 0.5 + zmt2 ) & … … 532 556 ! fraction of qsr_ice which is NOT absorbed in the thin surface layer 533 557 ! and thus which penetrates inside the ice cover ( Maykut and Untersteiner, 1971 ; Elbert anbd Curry, 1993 ) 534 p_fr1(ji,jj) = 0.18 * ( 1.e0 - sf(jp_ccov)%fnow(ji,jj,1) ) + 0.35 * sf(jp_ccov)%fnow(ji,jj,1)535 p_fr2(ji,jj) = 0.82 * ( 1.e0 - sf(jp_ccov)%fnow(ji,jj,1) ) + 0.65 * sf(jp_ccov)%fnow(ji,jj,1)536 END DO 537 END DO 538 CALL iom_put( 'snowpre', p_spr) ! Snow precipitation558 fr1_i0(ji,jj) = 0.18 * ( 1.e0 - sf(jp_ccov)%fnow(ji,jj,1) ) + 0.35 * sf(jp_ccov)%fnow(ji,jj,1) 559 fr2_i0(ji,jj) = 0.82 * ( 1.e0 - sf(jp_ccov)%fnow(ji,jj,1) ) + 0.65 * sf(jp_ccov)%fnow(ji,jj,1) 560 END DO 561 END DO 562 CALL iom_put( 'snowpre', sprecip ) ! Snow precipitation 539 563 540 564 !-----------------------------------------------------------! 541 565 ! snow/ice Shortwave radiation (abedo already computed) ! 542 566 !-----------------------------------------------------------! 543 CALL blk_clio_qsr_ice( palb_cs, palb_os, p_qsr ) 567 CALL blk_clio_qsr_ice( palb_cs, palb_os, qsr_ice ) 568 569 DO jl = 1, jpl 570 palb(:,:,jl) = ( palb_cs(:,:,jl) * ( 1.e0 - sf(jp_ccov)%fnow(:,:,1) ) & 571 & + palb_os(:,:,jl) * sf(jp_ccov)%fnow(:,:,1) ) 572 END DO 544 573 545 574 ! ! ========================== ! 546 DO jl = 1, ijpl ! Loop over ice categories !575 DO jl = 1, jpl ! Loop over ice categories ! 547 576 ! ! ========================== ! 548 577 !CDIR NOVERRCHK … … 558 587 ztaevbk = ztatm3 * ztatm(ji,jj) * zcldeff * ( 0.39 - 0.05 * zevsqr(ji,jj) ) 559 588 ! 560 z_qlw(ji,jj,jl) = - emic * stefan * ( ztaevbk + 4. * ztatm3 * ( p st(ji,jj,jl) - ztatm(ji,jj) ) )589 z_qlw(ji,jj,jl) = - emic * stefan * ( ztaevbk + 4. * ztatm3 * ( ptsu(ji,jj,jl) - ztatm(ji,jj) ) ) 561 590 562 591 !---------------------------------------- … … 565 594 566 595 ! vapour pressure at saturation of ice (tmask to avoid overflow in the exponential) 567 zesi = 611.0 * EXP( 21.8745587 * tmask(ji,jj,1) * ( p st(ji,jj,jl) - rtt )/ ( pst(ji,jj,jl) - 7.66 ) )596 zesi = 611.0 * EXP( 21.8745587 * tmask(ji,jj,1) * ( ptsu(ji,jj,jl) - rtt )/ ( ptsu(ji,jj,jl) - 7.66 ) ) 568 597 ! humidity close to the ice surface (at saturation) 569 598 zqsati = ( 0.622 * zesi ) / ( zpatm - 0.378 * zesi ) 570 599 571 600 ! computation of intermediate values 572 zticemb = p st(ji,jj,jl) - 7.66601 zticemb = ptsu(ji,jj,jl) - 7.66 573 602 zticemb2 = zticemb * zticemb 574 ztice3 = p st(ji,jj,jl) * pst(ji,jj,jl) * pst(ji,jj,jl)603 ztice3 = ptsu(ji,jj,jl) * ptsu(ji,jj,jl) * ptsu(ji,jj,jl) 575 604 zdesidt = zesi * ( 9.5 * LOG( 10.0 ) * ( rtt - 7.66 ) / zticemb2 ) 576 605 … … 585 614 586 615 ! sensible heat flux 587 z_qsb(ji,jj,jl) = zrhovacshi * ( p st(ji,jj,jl) - ztatm(ji,jj) )616 z_qsb(ji,jj,jl) = zrhovacshi * ( ptsu(ji,jj,jl) - ztatm(ji,jj) ) 588 617 589 618 ! latent heat flux 590 p_qla(ji,jj,jl) = MAX( 0.e0, zrhovaclei * ( zqsati - zqatm(ji,jj) ) )619 qla_ice(ji,jj,jl) = MAX( 0.e0, zrhovaclei * ( zqsati - zqatm(ji,jj) ) ) 591 620 592 621 ! sensitivity of non solar fluxes (dQ/dT) (long-wave, sensible and latent fluxes) … … 595 624 zdqla = zrhovaclei * ( zdesidt * ( zqsati * zqsati / ( zesi * zesi ) ) * ( zpatm / 0.622 ) ) 596 625 ! 597 p_dqla(ji,jj,jl) = zdqla ! latent flux sensitivity598 p_dqns(ji,jj,jl) = -( zdqlw + zdqsb + zdqla ) ! total non solar sensitivity626 dqla_ice(ji,jj,jl) = zdqla ! latent flux sensitivity 627 dqns_ice(ji,jj,jl) = -( zdqlw + zdqsb + zdqla ) ! total non solar sensitivity 599 628 END DO 600 629 ! … … 608 637 ! 609 638 !CDIR COLLAPSE 610 p_qns(:,:,:) = z_qlw (:,:,:) - z_qsb (:,:,:) - p_qla(:,:,:) ! Downward Non Solar flux611 !CDIR COLLAPSE 612 p_tpr(:,:) = sf(jp_prec)%fnow(:,:,1) / rday ! total precipitation [kg/m2/s]639 qns_ice(:,:,:) = z_qlw (:,:,:) - z_qsb (:,:,:) - qla_ice (:,:,:) ! Downward Non Solar flux 640 !CDIR COLLAPSE 641 tprecip(:,:) = sf(jp_prec)%fnow(:,:,1) / rday ! total precipitation [kg/m2/s] 613 642 ! 614 643 ! ----------------------------------------------------------------------------- ! … … 617 646 !CDIR COLLAPSE 618 647 qns(:,:) = qns(:,:) & ! update the non-solar heat flux with: 619 & - p_spr(:,:) * lfus & ! remove melting solid precip 620 & + p_spr(:,:) * MIN( sf(jp_tair)%fnow(:,:,1), rt0_snow - rt0 ) * cpic & ! add solid P at least below melting 621 & - p_spr(:,:) * sf(jp_tair)%fnow(:,:,1) * rcp ! remove solid precip. at Tair 622 ! 648 & - sprecip(:,:) * lfus & ! remove melting solid precip 649 & + sprecip(:,:) * MIN( sf(jp_tair)%fnow(:,:,1), rt0_snow - rt0 ) * cpic & ! add solid P at least below melting 650 & - sprecip(:,:) * sf(jp_tair)%fnow(:,:,1) * rcp ! remove solid precip. at Tair 651 652 #if defined key_lim3 653 ! ----------------------------------------------------------------------------- ! 654 ! Distribute evapo, precip & associated heat over ice and ocean 655 ! ---------------=====--------------------------------------------------------- ! 656 CALL wrk_alloc( jpi,jpj, zevap, zsnw ) 657 658 ! --- evaporation --- ! 659 z1_lsub = 1._wp / Lsub 660 evap_ice (:,:,:) = qla_ice (:,:,:) * z1_lsub ! sublimation 661 devap_ice(:,:,:) = dqla_ice(:,:,:) * z1_lsub 662 zevap (:,:) = emp(:,:) + tprecip(:,:) ! evaporation over ocean 663 664 ! --- evaporation minus precipitation --- ! 665 zsnw(:,:) = 0._wp 666 CALL lim_thd_snwblow( pfrld, zsnw ) ! snow redistribution by wind 667 emp_oce(:,:) = pfrld(:,:) * zevap(:,:) - ( tprecip(:,:) - sprecip(:,:) ) - sprecip(:,:) * ( 1._wp - zsnw ) 668 emp_ice(:,:) = SUM( a_i_b(:,:,:) * evap_ice(:,:,:), dim=3 ) - sprecip(:,:) * zsnw 669 emp_tot(:,:) = emp_oce(:,:) + emp_ice(:,:) 670 671 ! --- heat flux associated with emp --- ! 672 qemp_oce(:,:) = - pfrld(:,:) * zevap(:,:) * sst_m(:,:) * rcp & ! evap 673 & + ( tprecip(:,:) - sprecip(:,:) ) * ( sf(jp_tair)%fnow(:,:,1) - rt0 ) * rcp & ! liquid precip 674 & + sprecip(:,:) * ( 1._wp - zsnw ) * & ! solid precip 675 & ( ( MIN( sf(jp_tair)%fnow(:,:,1), rt0_snow ) - rt0 ) * cpic * tmask(:,:,1) - lfus ) 676 qemp_ice(:,:) = sprecip(:,:) * zsnw * & ! solid precip (only) 677 & ( ( MIN( sf(jp_tair)%fnow(:,:,1), rt0_snow ) - rt0 ) * cpic * tmask(:,:,1) - lfus ) 678 679 ! --- total solar and non solar fluxes --- ! 680 qns_tot(:,:) = pfrld(:,:) * qns_oce(:,:) + SUM( a_i_b(:,:,:) * qns_ice(:,:,:), dim=3 ) + qemp_ice(:,:) + qemp_oce(:,:) 681 qsr_tot(:,:) = pfrld(:,:) * qsr_oce(:,:) + SUM( a_i_b(:,:,:) * qsr_ice(:,:,:), dim=3 ) 682 683 ! --- heat content of precip over ice in J/m3 (to be used in 1D-thermo) --- ! 684 qprec_ice(:,:) = rhosn * ( ( MIN( sf(jp_tair)%fnow(:,:,1), rt0_snow ) - rt0 ) * cpic * tmask(:,:,1) - lfus ) 685 686 CALL wrk_dealloc( jpi,jpj, zevap, zsnw ) 687 #endif 688 623 689 !!gm : not necessary as all input data are lbc_lnk... 624 CALL lbc_lnk( p_fr1(:,:) , 'T', 1. )625 CALL lbc_lnk( p_fr2(:,:) , 'T', 1. )626 DO jl = 1, ijpl627 CALL lbc_lnk( p_qns(:,:,jl) , 'T', 1. )628 CALL lbc_lnk( p_dqns(:,:,jl) , 'T', 1. )629 CALL lbc_lnk( p_qla(:,:,jl) , 'T', 1. )630 CALL lbc_lnk( p_dqla(:,:,jl) , 'T', 1. )690 CALL lbc_lnk( fr1_i0 (:,:) , 'T', 1. ) 691 CALL lbc_lnk( fr2_i0 (:,:) , 'T', 1. ) 692 DO jl = 1, jpl 693 CALL lbc_lnk( qns_ice (:,:,jl) , 'T', 1. ) 694 CALL lbc_lnk( dqns_ice(:,:,jl) , 'T', 1. ) 695 CALL lbc_lnk( qla_ice (:,:,jl) , 'T', 1. ) 696 CALL lbc_lnk( dqla_ice(:,:,jl) , 'T', 1. ) 631 697 END DO 632 698 633 699 !!gm : mask is not required on forcing 634 DO jl = 1, ijpl 635 p_qns (:,:,jl) = p_qns (:,:,jl) * tmask(:,:,1) 636 p_qla (:,:,jl) = p_qla (:,:,jl) * tmask(:,:,1) 637 p_dqns(:,:,jl) = p_dqns(:,:,jl) * tmask(:,:,1) 638 p_dqla(:,:,jl) = p_dqla(:,:,jl) * tmask(:,:,1) 639 END DO 700 DO jl = 1, jpl 701 qns_ice (:,:,jl) = qns_ice (:,:,jl) * tmask(:,:,1) 702 qla_ice (:,:,jl) = qla_ice (:,:,jl) * tmask(:,:,1) 703 dqns_ice(:,:,jl) = dqns_ice(:,:,jl) * tmask(:,:,1) 704 dqla_ice(:,:,jl) = dqla_ice(:,:,jl) * tmask(:,:,1) 705 END DO 706 707 CALL wrk_dealloc( jpi,jpj, ztatm, zqatm, zevsqr, zrhoa ) 708 CALL wrk_dealloc( jpi,jpj, jpl , z_qlw, z_qsb ) 640 709 641 710 IF(ln_ctl) THEN 642 CALL prt_ctl(tab3d_1=z_qsb , clinfo1=' blk_ice_clio: z_qsb : ', tab3d_2=z_qlw , clinfo2=' z_qlw : ', kdim=ijpl) 643 CALL prt_ctl(tab3d_1=p_qla , clinfo1=' blk_ice_clio: z_qla : ', tab3d_2=p_qsr , clinfo2=' p_qsr : ', kdim=ijpl) 644 CALL prt_ctl(tab3d_1=p_dqns , clinfo1=' blk_ice_clio: p_dqns : ', tab3d_2=p_qns , clinfo2=' p_qns : ', kdim=ijpl) 645 CALL prt_ctl(tab3d_1=p_dqla , clinfo1=' blk_ice_clio: p_dqla : ', tab3d_2=pst , clinfo2=' pst : ', kdim=ijpl) 646 CALL prt_ctl(tab2d_1=p_tpr , clinfo1=' blk_ice_clio: p_tpr : ', tab2d_2=p_spr , clinfo2=' p_spr : ') 647 CALL prt_ctl(tab2d_1=p_taui , clinfo1=' blk_ice_clio: p_taui : ', tab2d_2=p_tauj , clinfo2=' p_tauj : ') 711 CALL prt_ctl(tab3d_1=z_qsb , clinfo1=' blk_ice_clio: z_qsb : ', tab3d_2=z_qlw , clinfo2=' z_qlw : ', kdim=jpl) 712 CALL prt_ctl(tab3d_1=qla_ice , clinfo1=' blk_ice_clio: z_qla : ', tab3d_2=qsr_ice , clinfo2=' qsr_ice : ', kdim=jpl) 713 CALL prt_ctl(tab3d_1=dqns_ice , clinfo1=' blk_ice_clio: dqns_ice : ', tab3d_2=qns_ice , clinfo2=' qns_ice : ', kdim=jpl) 714 CALL prt_ctl(tab3d_1=dqla_ice , clinfo1=' blk_ice_clio: dqla_ice : ', tab3d_2=ptsu , clinfo2=' ptsu : ', kdim=jpl) 715 CALL prt_ctl(tab2d_1=tprecip , clinfo1=' blk_ice_clio: tprecip : ', tab2d_2=sprecip , clinfo2=' sprecip : ') 648 716 ENDIF 649 717 650 CALL wrk_dealloc( jpi,jpj, ztatm, zqatm, zevsqr, zrhoa ) 651 CALL wrk_dealloc( jpi,jpj,pdim, z_qlw, z_qsb ) 652 ! 653 IF( nn_timing == 1 ) CALL timing_stop('blk_ice_clio') 654 ! 655 END SUBROUTINE blk_ice_clio 656 718 IF( nn_timing == 1 ) CALL timing_stop('blk_ice_clio_flx') 719 ! 720 END SUBROUTINE blk_ice_clio_flx 721 722 #endif 657 723 658 724 SUBROUTINE blk_clio_qsr_oce( pqsr_oce ) -
branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/sbcblk_core.F90
r4624 r5837 5 5 !!===================================================================== 6 6 !! History : 1.0 ! 2004-08 (U. Schweckendiek) Original code 7 !! 2.0 ! 2005-04 (L. Brodeau, A.M. Treguier) additions: 7 !! 2.0 ! 2005-04 (L. Brodeau, A.M. Treguier) additions: 8 8 !! - new bulk routine for efficiency 9 9 !! - WINDS ARE NOW ASSUMED TO BE AT T POINTS in input files !!!! 10 !! - file names and file characteristics in namelist 11 !! - Implement reading of 6-hourly fields 12 !! 3.0 ! 2006-06 (G. Madec) sbc rewritting 13 !! - ! 2006-12 (L. Brodeau) Original code for TURB_CORE_2Z10 !! - file names and file characteristics in namelist 11 !! - Implement reading of 6-hourly fields 12 !! 3.0 ! 2006-06 (G. Madec) sbc rewritting 13 !! - ! 2006-12 (L. Brodeau) Original code for turb_core_2z 14 14 !! 3.2 ! 2009-04 (B. Lemaire) Introduce iom_put 15 15 !! 3.3 ! 2010-10 (S. Masson) add diurnal cycle 16 16 !! 3.4 ! 2011-11 (C. Harris) Fill arrays required by CICE 17 !! 3.7 ! 2014-06 (L. Brodeau) simplification and optimization of CORE bulk 17 18 !!---------------------------------------------------------------------- 18 19 19 20 !!---------------------------------------------------------------------- 20 !! sbc_blk_core : bulk formulation as ocean surface boundary condition 21 !! (forced mode, CORE bulk formulea) 22 !! blk_oce_core : ocean: computes momentum, heat and freshwater fluxes 23 !! blk_ice_core : ice : computes momentum, heat and freshwater fluxes 24 !! turb_core : computes the CORE turbulent transfer coefficients 21 !! sbc_blk_core : bulk formulation as ocean surface boundary condition (forced mode, CORE bulk formulea) 22 !! blk_oce_core : computes momentum, heat and freshwater fluxes over ocean 23 !! blk_ice_core : computes momentum, heat and freshwater fluxes over ice 24 !! turb_core_2z : Computes turbulent transfert coefficients 25 !! cd_neutral_10m : Estimate of the neutral drag coefficient at 10m 26 !! psi_m : universal profile stability function for momentum 27 !! psi_h : universal profile stability function for temperature and humidity 25 28 !!---------------------------------------------------------------------- 26 29 USE oce ! ocean dynamics and tracers … … 38 41 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 39 42 USE prtctl ! Print control 40 USE sbcwave,ONLY : cdn_wave !wave module 41 #if defined key_lim3 || defined key_cice 43 USE sbcwave, ONLY : cdn_wave ! wave module 42 44 USE sbc_ice ! Surface boundary condition: ice fields 45 USE lib_fortran ! to use key_nosignedzero 46 #if defined key_lim3 47 USE ice, ONLY : u_ice, v_ice, jpl, pfrld, a_i_b 48 USE limthd_dh ! for CALL lim_thd_snwblow 49 #elif defined key_lim2 50 USE ice_2, ONLY : u_ice, v_ice 51 USE par_ice_2 43 52 #endif 44 USE lib_fortran ! to use key_nosignedzero45 53 46 54 IMPLICIT NONE … … 48 56 49 57 PUBLIC sbc_blk_core ! routine called in sbcmod module 50 PUBLIC blk_ice_core ! routine called in sbc_ice_lim module 51 PUBLIC blk_ice_meanqsr ! routine called in sbc_ice_lim module 58 #if defined key_lim2 || defined key_lim3 59 PUBLIC blk_ice_core_tau ! routine called in sbc_ice_lim module 60 PUBLIC blk_ice_core_flx ! routine called in sbc_ice_lim module 61 #endif 52 62 PUBLIC turb_core_2z ! routine calles in sbcblk_mfs module 53 63 54 INTEGER , PARAMETER :: jpfld = 9 ! maximum number of files to read 64 INTEGER , PARAMETER :: jpfld = 9 ! maximum number of files to read 55 65 INTEGER , PARAMETER :: jp_wndi = 1 ! index of 10m wind velocity (i-component) (m/s) at T-point 56 66 INTEGER , PARAMETER :: jp_wndj = 2 ! index of 10m wind velocity (j-component) (m/s) at T-point … … 62 72 INTEGER , PARAMETER :: jp_snow = 8 ! index of snow (solid prcipitation) (kg/m2/s) 63 73 INTEGER , PARAMETER :: jp_tdif = 9 ! index of tau diff associated to HF tau (N/m2) at T-point 64 74 65 75 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf ! structure of input fields (file informations, fields read) 66 76 67 77 ! !!! CORE bulk parameters 68 78 REAL(wp), PARAMETER :: rhoa = 1.22 ! air density … … 75 85 76 86 ! !!* Namelist namsbc_core : CORE bulk parameters 77 LOGICAL :: ln_2m ! logical flag for height of air temp. and hum78 87 LOGICAL :: ln_taudif ! logical flag to use the "mean of stress module - module of mean stress" data 79 88 REAL(wp) :: rn_pfac ! multiplication factor for precipitation 80 89 REAL(wp) :: rn_efac ! multiplication factor for evaporation (clem) 81 90 REAL(wp) :: rn_vfac ! multiplication factor for ice/ocean velocity in the calculation of wind stress (clem) 82 LOGICAL :: ln_bulk2z ! logical flag for case where z(q,t) and z(u) are specified in the namelist83 91 REAL(wp) :: rn_zqt ! z(q,t) : height of humidity and temperature measurements 84 92 REAL(wp) :: rn_zu ! z(u) : height of wind measurements … … 88 96 # include "vectopt_loop_substitute.h90" 89 97 !!---------------------------------------------------------------------- 90 !! NEMO/OPA 3. 3 , NEMO-consortium (2010)98 !! NEMO/OPA 3.7 , NEMO-consortium (2014) 91 99 !! $Id$ 92 100 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 97 105 !!--------------------------------------------------------------------- 98 106 !! *** ROUTINE sbc_blk_core *** 99 !! 107 !! 100 108 !! ** Purpose : provide at each time step the surface ocean fluxes 101 !! (momentum, heat, freshwater and runoff) 109 !! (momentum, heat, freshwater and runoff) 102 110 !! 103 111 !! ** Method : (1) READ each fluxes in NetCDF files: … … 118 126 !! ** Action : defined at each time-step at the air-sea interface 119 127 !! - utau, vtau i- and j-component of the wind stress 120 !! - taum, wndm wind stress and 10m wind modules at T-point 128 !! - taum wind stress module at T-point 129 !! - wndm wind speed module at T-point over free ocean or leads in presence of sea-ice 121 130 !! - qns, qsr non-solar and solar heat fluxes 122 131 !! - emp upward mass flux (evapo. - precip.) 123 132 !! - sfx salt flux due to freezing/melting (non-zero only if ice is present) 124 133 !! (set in limsbc(_2).F90) 134 !! 135 !! ** References : Large & Yeager, 2004 / Large & Yeager, 2008 136 !! Brodeau et al. Ocean Modelling 2010 125 137 !!---------------------------------------------------------------------- 126 138 INTEGER, INTENT(in) :: kt ! ocean time step 127 ! !139 ! 128 140 INTEGER :: ierror ! return error code 129 141 INTEGER :: ifpr ! dummy loop indice 130 142 INTEGER :: jfld ! dummy loop arguments 131 143 INTEGER :: ios ! Local integer output status for namelist read 132 ! !144 ! 133 145 CHARACTER(len=100) :: cn_dir ! Root directory for location of core files 134 146 TYPE(FLD_N), DIMENSION(jpfld) :: slf_i ! array of namelist informations on the fields to read … … 136 148 TYPE(FLD_N) :: sn_qlw , sn_tair, sn_prec, sn_snow ! " " 137 149 TYPE(FLD_N) :: sn_tdif ! " " 138 NAMELIST/namsbc_core/ cn_dir , ln_ 2m , ln_taudif, rn_pfac, rn_efac, rn_vfac, &150 NAMELIST/namsbc_core/ cn_dir , ln_taudif, rn_pfac, rn_efac, rn_vfac, & 139 151 & sn_wndi, sn_wndj, sn_humi , sn_qsr , & 140 152 & sn_qlw , sn_tair, sn_prec , sn_snow, & 141 & sn_tdif, rn_zqt , ln_bulk2z,rn_zu142 !!--------------------------------------------------------------------- 143 153 & sn_tdif, rn_zqt, rn_zu 154 !!--------------------------------------------------------------------- 155 ! 144 156 ! ! ====================== ! 145 157 IF( kt == nit000 ) THEN ! First call kt=nit000 ! … … 149 161 READ ( numnam_ref, namsbc_core, IOSTAT = ios, ERR = 901) 150 162 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namsbc_core in reference namelist', lwp ) 151 163 ! 152 164 REWIND( numnam_cfg ) ! Namelist namsbc_core in configuration namelist : CORE bulk parameters 153 165 READ ( numnam_cfg, namsbc_core, IOSTAT = ios, ERR = 902 ) 154 166 902 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namsbc_core in configuration namelist', lwp ) 155 167 156 IF(lwm) WRITE 168 IF(lwm) WRITE( numond, namsbc_core ) 157 169 ! ! check: do we plan to use ln_dm2dc with non-daily forcing? 158 IF( ln_dm2dc .AND. sn_qsr%nfreqh /= 24 ) & 159 & CALL ctl_stop( 'sbc_blk_core: ln_dm2dc can be activated only with daily short-wave forcing' ) 170 IF( ln_dm2dc .AND. sn_qsr%nfreqh /= 24 ) & 171 & CALL ctl_stop( 'sbc_blk_core: ln_dm2dc can be activated only with daily short-wave forcing' ) 160 172 IF( ln_dm2dc .AND. sn_qsr%ln_tint ) THEN 161 173 CALL ctl_warn( 'sbc_blk_core: ln_dm2dc is taking care of the temporal interpolation of daily qsr', & 162 174 & ' ==> We force time interpolation = .false. for qsr' ) 163 175 sn_qsr%ln_tint = .false. 164 176 ENDIF … … 169 181 slf_i(jp_prec) = sn_prec ; slf_i(jp_snow) = sn_snow 170 182 slf_i(jp_tdif) = sn_tdif 171 ! 183 ! 172 184 lhftau = ln_taudif ! do we use HF tau information? 173 185 jfld = jpfld - COUNT( (/.NOT. lhftau/) ) … … 190 202 ! ! compute the surface ocean fluxes using CORE bulk formulea 191 203 IF( MOD( kt - 1, nn_fsbc ) == 0 ) CALL blk_oce_core( kt, sf, sst_m, ssu_m, ssv_m ) 192 193 ! If diurnal cycle is activated, compute a daily mean short waves flux for biogeochemistery194 IF( ltrcdm2dc ) CALL blk_bio_meanqsr195 204 196 205 #if defined key_cice … … 226 235 !! - qsr : Solar heat flux over the ocean (W/m2) 227 236 !! - qns : Non Solar heat flux over the ocean (W/m2) 228 !! - evap : Evaporation over the ocean (kg/m2/s)229 237 !! - emp : evaporation minus precipitation (kg/m2/s) 230 238 !! … … 269 277 zwnd_j(:,:) = 0.e0 270 278 #if defined key_cyclone 271 # if defined key_vectopt_loop 272 !CDIR COLLAPSE 273 # endif 274 CALL wnd_cyc( kt, zwnd_i, zwnd_j ) ! add Manu ! 279 CALL wnd_cyc( kt, zwnd_i, zwnd_j ) ! add analytical tropical cyclone (Vincent et al. JGR 2012) 275 280 DO jj = 2, jpjm1 276 281 DO ji = fs_2, fs_jpim1 ! vect. opt. … … 279 284 END DO 280 285 END DO 281 #endif282 #if defined key_vectopt_loop283 !CDIR COLLAPSE284 286 #endif 285 287 DO jj = 2, jpjm1 … … 292 294 CALL lbc_lnk( zwnd_j(:,:) , 'T', -1. ) 293 295 ! ... scalar wind ( = | U10m - U_oce | ) at T-point (masked) 294 !CDIR NOVERRCHK295 !CDIR COLLAPSE296 296 wndm(:,:) = SQRT( zwnd_i(:,:) * zwnd_i(:,:) & 297 297 & + zwnd_j(:,:) * zwnd_j(:,:) ) * tmask(:,:,1) … … 300 300 ! I Radiative FLUXES ! 301 301 ! ----------------------------------------------------------------------------- ! 302 302 303 303 ! ocean albedo assumed to be constant + modify now Qsr to include the diurnal cycle ! Short Wave 304 304 zztmp = 1. - albo … … 306 306 ELSE ; qsr(:,:) = zztmp * sf(jp_qsr)%fnow(:,:,1) * tmask(:,:,1) 307 307 ENDIF 308 !CDIR COLLAPSE 308 309 309 zqlw(:,:) = ( sf(jp_qlw)%fnow(:,:,1) - Stef * zst(:,:)*zst(:,:)*zst(:,:)*zst(:,:) ) * tmask(:,:,1) ! Long Wave 310 310 ! ----------------------------------------------------------------------------- ! … … 313 313 314 314 ! ... specific humidity at SST and IST 315 !CDIR NOVERRCHK 316 !CDIR COLLAPSE 317 zqsatw(:,:) = zcoef_qsatw * EXP( -5107.4 / zst(:,:) ) 315 zqsatw(:,:) = zcoef_qsatw * EXP( -5107.4 / zst(:,:) ) 318 316 319 317 ! ... NCAR Bulk formulae, computation of Cd, Ch, Ce at T-point : 320 IF( ln_2m ) THEN 321 !! If air temp. and spec. hum. are given at different height (2m) than wind (10m) : 322 CALL TURB_CORE_2Z(2.,10., zst , sf(jp_tair)%fnow, & 323 & zqsatw, sf(jp_humi)%fnow, wndm, & 324 & Cd , Ch , Ce , & 325 & zt_zu , zq_zu ) 326 ELSE IF( ln_bulk2z ) THEN 327 !! If the height of the air temp./spec. hum. and wind are to be specified by hand : 328 IF( rn_zqt == rn_zu ) THEN 329 !! If air temp. and spec. hum. are at the same height as wind : 330 CALL TURB_CORE_1Z( rn_zu, zst , sf(jp_tair)%fnow(:,:,1), & 331 & zqsatw, sf(jp_humi)%fnow(:,:,1), wndm, & 332 & Cd , Ch , Ce ) 333 ELSE 334 !! If air temp. and spec. hum. are at a different height to wind : 335 CALL TURB_CORE_2Z(rn_zqt, rn_zu , zst , sf(jp_tair)%fnow, & 336 & zqsatw, sf(jp_humi)%fnow, wndm, & 337 & Cd , Ch , Ce , & 338 & zt_zu , zq_zu ) 339 ENDIF 340 ELSE 341 !! If air temp. and spec. hum. are given at same height than wind (10m) : 342 !gm bug? at the compiling phase, add a copy in temporary arrays... ==> check perf 343 ! CALL TURB_CORE_1Z( 10., zst (:,:), sf(jp_tair)%fnow(:,:), & 344 ! & zqsatw(:,:), sf(jp_humi)%fnow(:,:), wndm(:,:), & 345 ! & Cd (:,:), Ch (:,:), Ce (:,:) ) 346 !gm bug 347 ! ARPDBG - this won't compile with gfortran. Fix but check performance 348 ! as per comment above. 349 CALL TURB_CORE_1Z( 10., zst , sf(jp_tair)%fnow(:,:,1), & 350 & zqsatw, sf(jp_humi)%fnow(:,:,1), wndm, & 351 & Cd , Ch , Ce ) 352 ENDIF 353 318 CALL turb_core_2z( rn_zqt, rn_zu, zst, sf(jp_tair)%fnow, zqsatw, sf(jp_humi)%fnow, wndm, & 319 & Cd, Ch, Ce, zt_zu, zq_zu ) 320 354 321 ! ... tau module, i and j component 355 322 DO jj = 1, jpj … … 363 330 364 331 ! ... add the HF tau contribution to the wind stress module? 365 IF( lhftau ) THEN 366 !CDIR COLLAPSE 332 IF( lhftau ) THEN 367 333 taum(:,:) = taum(:,:) + sf(jp_tdif)%fnow(:,:,1) 368 334 ENDIF … … 371 337 ! ... utau, vtau at U- and V_points, resp. 372 338 ! Note the use of 0.5*(2-umask) in order to unmask the stress along coastlines 339 ! Note the use of MAX(tmask(i,j),tmask(i+1,j) is to mask tau over ice shelves 373 340 DO jj = 1, jpjm1 374 341 DO ji = 1, fs_jpim1 375 utau(ji,jj) = 0.5 * ( 2. - umask(ji,jj,1) ) * ( zwnd_i(ji,jj) + zwnd_i(ji+1,jj ) ) 376 vtau(ji,jj) = 0.5 * ( 2. - vmask(ji,jj,1) ) * ( zwnd_j(ji,jj) + zwnd_j(ji ,jj+1) ) 342 utau(ji,jj) = 0.5 * ( 2. - umask(ji,jj,1) ) * ( zwnd_i(ji,jj) + zwnd_i(ji+1,jj ) ) & 343 & * MAX(tmask(ji,jj,1),tmask(ji+1,jj,1)) 344 vtau(ji,jj) = 0.5 * ( 2. - vmask(ji,jj,1) ) * ( zwnd_j(ji,jj) + zwnd_j(ji ,jj+1) ) & 345 & * MAX(tmask(ji,jj,1),tmask(ji,jj+1,1)) 377 346 END DO 378 347 END DO … … 380 349 CALL lbc_lnk( vtau(:,:), 'V', -1. ) 381 350 351 382 352 ! Turbulent fluxes over ocean 383 353 ! ----------------------------- 384 IF( ln_2m .OR. ( ln_bulk2z .AND. rn_zqt /= rn_zu )) THEN385 ! Values of temp. and hum. adjusted to height of wind must be used386 zevap(:,:) = rn_efac * MAX( 0.e0, rhoa *Ce(:,:)*( zqsatw(:,:) - zq_zu(:,:) ) * wndm(:,:) )! Evaporation387 zqsb (:,:) = rhoa*cpa*Ch(:,:)*( zst (:,:) - zt_zu(:,:) ) * wndm(:,:)! Sensible Heat354 IF( ABS( rn_zu - rn_zqt) < 0.01_wp ) THEN 355 !! q_air and t_air are (or "are almost") given at 10m (wind reference height) 356 zevap(:,:) = rn_efac*MAX( 0._wp, rhoa*Ce(:,:)*( zqsatw(:,:) - sf(jp_humi)%fnow(:,:,1) )*wndm(:,:) ) ! Evaporation 357 zqsb (:,:) = cpa*rhoa*Ch(:,:)*( zst (:,:) - sf(jp_tair)%fnow(:,:,1) )*wndm(:,:) ! Sensible Heat 388 358 ELSE 389 !CDIR COLLAPSE 390 zevap(:,:) = rn_efac * MAX( 0.e0, rhoa *Ce(:,:)*( zqsatw(:,:) - sf(jp_humi)%fnow(:,:,1) ) * wndm(:,:) ) ! Evaporation 391 !CDIR COLLAPSE 392 zqsb (:,:) = rhoa*cpa*Ch(:,:)*( zst (:,:) - sf(jp_tair)%fnow(:,:,1) ) * wndm(:,:) ! Sensible Heat 393 ENDIF 394 !CDIR COLLAPSE 359 !! q_air and t_air are not given at 10m (wind reference height) 360 ! Values of temp. and hum. adjusted to height of wind during bulk algorithm iteration must be used!!! 361 zevap(:,:) = rn_efac*MAX( 0._wp, rhoa*Ce(:,:)*( zqsatw(:,:) - zq_zu(:,:) )*wndm(:,:) ) ! Evaporation 362 zqsb (:,:) = cpa*rhoa*Ch(:,:)*( zst (:,:) - zt_zu(:,:) )*wndm(:,:) ! Sensible Heat 363 ENDIF 395 364 zqla (:,:) = Lv * zevap(:,:) ! Latent Heat 396 365 … … 409 378 ! III Total FLUXES ! 410 379 ! ----------------------------------------------------------------------------- ! 411 412 !CDIR COLLAPSE 380 ! 413 381 emp (:,:) = ( zevap(:,:) & ! mass flux (evap. - precip.) 414 382 & - sf(jp_prec)%fnow(:,:,1) * rn_pfac ) * tmask(:,:,1) 415 !CDIR COLLAPSE 416 qns(:,:) = zqlw(:,:) - zqsb(:,:) - zqla(:,:) & ! Downward Non Solar flux383 ! 384 qns(:,:) = zqlw(:,:) - zqsb(:,:) - zqla(:,:) & ! Downward Non Solar 417 385 & - sf(jp_snow)%fnow(:,:,1) * rn_pfac * lfus & ! remove latent melting heat for solid precip 418 386 & - zevap(:,:) * pst(:,:) * rcp & ! remove evap heat content at SST 419 387 & + ( sf(jp_prec)%fnow(:,:,1) - sf(jp_snow)%fnow(:,:,1) ) * rn_pfac & ! add liquid precip heat content at Tair 420 & * ( sf(jp_tair)%fnow(:,:,1) - rt0 ) * rcp & 388 & * ( sf(jp_tair)%fnow(:,:,1) - rt0 ) * rcp & 421 389 & + sf(jp_snow)%fnow(:,:,1) * rn_pfac & ! add solid precip heat content at min(Tair,Tsnow) 422 & * ( MIN( sf(jp_tair)%fnow(:,:,1), rt0_snow ) - rt0 ) * cpic 423 ! 424 CALL iom_put( "qlw_oce", zqlw ) ! output downward longwave heat over the ocean 425 CALL iom_put( "qsb_oce", - zqsb ) ! output downward sensible heat over the ocean 426 CALL iom_put( "qla_oce", - zqla ) ! output downward latent heat over the ocean 427 CALL iom_put( "qhc_oce", qns-zqlw+zqsb+zqla ) ! output downward heat content of E-P over the ocean 428 CALL iom_put( "qns_oce", qns ) ! output downward non solar heat over the ocean 390 & * ( MIN( sf(jp_tair)%fnow(:,:,1), rt0_snow ) - rt0 ) * cpic * tmask(:,:,1) 391 ! 392 #if defined key_lim3 393 qns_oce(:,:) = zqlw(:,:) - zqsb(:,:) - zqla(:,:) ! non solar without emp (only needed by LIM3) 394 qsr_oce(:,:) = qsr(:,:) 395 #endif 396 ! 397 IF ( nn_ice == 0 ) THEN 398 CALL iom_put( "qlw_oce" , zqlw ) ! output downward longwave heat over the ocean 399 CALL iom_put( "qsb_oce" , - zqsb ) ! output downward sensible heat over the ocean 400 CALL iom_put( "qla_oce" , - zqla ) ! output downward latent heat over the ocean 401 CALL iom_put( "qemp_oce", qns-zqlw+zqsb+zqla ) ! output downward heat content of E-P over the ocean 402 CALL iom_put( "qns_oce" , qns ) ! output downward non solar heat over the ocean 403 CALL iom_put( "qsr_oce" , qsr ) ! output downward solar heat over the ocean 404 CALL iom_put( "qt_oce" , qns+qsr ) ! output total downward heat over the ocean 405 ENDIF 429 406 ! 430 407 IF(ln_ctl) THEN … … 442 419 ! 443 420 END SUBROUTINE blk_oce_core 444 445 SUBROUTINE blk_bio_meanqsr446 !!---------------------------------------------------------------------447 !! *** ROUTINE blk_bio_meanqsr448 !!449 !! ** Purpose : provide daily qsr_mean for PISCES when450 !! analytic diurnal cycle is applied in physic451 !!452 !! ** Method : add part where there is no ice453 !!454 !!---------------------------------------------------------------------455 IF( nn_timing == 1 ) CALL timing_start('blk_bio_meanqsr')456 457 qsr_mean(:,:) = (1. - albo ) * sf(jp_qsr)%fnow(:,:,1)458 459 IF( nn_timing == 1 ) CALL timing_stop('blk_bio_meanqsr')460 461 END SUBROUTINE blk_bio_meanqsr462 421 463 464 SUBROUTINE blk_ice_meanqsr(palb,p_qsr_mean,pdim) 465 !!--------------------------------------------------------------------- 466 !! 467 !! ** Purpose : provide the daily qsr_mean over sea_ice for PISCES when 468 !! analytic diurnal cycle is applied in physic 469 !! 470 !! ** Method : compute qsr 471 !! 472 !!--------------------------------------------------------------------- 473 REAL(wp), DIMENSION(:,:,:), INTENT(in ) :: palb ! ice albedo (clear sky) (alb_ice_cs) [%] 474 REAL(wp), DIMENSION(:,:,:), INTENT( out) :: p_qsr_mean ! solar heat flux over ice (T-point) [W/m2] 475 INTEGER , INTENT(in ) :: pdim ! number of ice categories 476 !! 477 INTEGER :: ijpl ! number of ice categories (size of 3rd dim of input arrays) 478 INTEGER :: ji, jj, jl ! dummy loop indices 479 REAL(wp) :: zztmp ! temporary variable 480 !!--------------------------------------------------------------------- 481 IF( nn_timing == 1 ) CALL timing_start('blk_ice_meanqsr') 482 ! 483 ijpl = pdim ! number of ice categories 484 zztmp = 1. / ( 1. - albo ) 485 ! ! ========================== ! 486 DO jl = 1, ijpl ! Loop over ice categories ! 487 ! ! ========================== ! 488 DO jj = 1 , jpj 489 DO ji = 1, jpi 490 p_qsr_mean(ji,jj,jl) = zztmp * ( 1. - palb(ji,jj,jl) ) * qsr_mean(ji,jj) 422 423 #if defined key_lim2 || defined key_lim3 424 SUBROUTINE blk_ice_core_tau 425 !!--------------------------------------------------------------------- 426 !! *** ROUTINE blk_ice_core_tau *** 427 !! 428 !! ** Purpose : provide the surface boundary condition over sea-ice 429 !! 430 !! ** Method : compute momentum using CORE bulk 431 !! formulea, ice variables and read atmospheric fields. 432 !! NB: ice drag coefficient is assumed to be a constant 433 !!--------------------------------------------------------------------- 434 INTEGER :: ji, jj ! dummy loop indices 435 REAL(wp) :: zcoef_wnorm, zcoef_wnorm2 436 REAL(wp) :: zwnorm_f, zwndi_f , zwndj_f ! relative wind module and components at F-point 437 REAL(wp) :: zwndi_t , zwndj_t ! relative wind components at T-point 438 !!--------------------------------------------------------------------- 439 ! 440 IF( nn_timing == 1 ) CALL timing_start('blk_ice_core_tau') 441 ! 442 ! local scalars ( place there for vector optimisation purposes) 443 zcoef_wnorm = rhoa * Cice 444 zcoef_wnorm2 = rhoa * Cice * 0.5 445 446 !!gm brutal.... 447 utau_ice (:,:) = 0._wp 448 vtau_ice (:,:) = 0._wp 449 wndm_ice (:,:) = 0._wp 450 !!gm end 451 452 ! ----------------------------------------------------------------------------- ! 453 ! Wind components and module relative to the moving ocean ( U10m - U_ice ) ! 454 ! ----------------------------------------------------------------------------- ! 455 SELECT CASE( cp_ice_msh ) 456 CASE( 'I' ) ! B-grid ice dynamics : I-point (i.e. F-point with sea-ice indexation) 457 ! and scalar wind at T-point ( = | U10m - U_ice | ) (masked) 458 DO jj = 2, jpjm1 459 DO ji = 2, jpim1 ! B grid : NO vector opt 460 ! ... scalar wind at I-point (fld being at T-point) 461 zwndi_f = 0.25 * ( sf(jp_wndi)%fnow(ji-1,jj ,1) + sf(jp_wndi)%fnow(ji ,jj ,1) & 462 & + sf(jp_wndi)%fnow(ji-1,jj-1,1) + sf(jp_wndi)%fnow(ji ,jj-1,1) ) - rn_vfac * u_ice(ji,jj) 463 zwndj_f = 0.25 * ( sf(jp_wndj)%fnow(ji-1,jj ,1) + sf(jp_wndj)%fnow(ji ,jj ,1) & 464 & + sf(jp_wndj)%fnow(ji-1,jj-1,1) + sf(jp_wndj)%fnow(ji ,jj-1,1) ) - rn_vfac * v_ice(ji,jj) 465 zwnorm_f = zcoef_wnorm * SQRT( zwndi_f * zwndi_f + zwndj_f * zwndj_f ) 466 ! ... ice stress at I-point 467 utau_ice(ji,jj) = zwnorm_f * zwndi_f 468 vtau_ice(ji,jj) = zwnorm_f * zwndj_f 469 ! ... scalar wind at T-point (fld being at T-point) 470 zwndi_t = sf(jp_wndi)%fnow(ji,jj,1) - rn_vfac * 0.25 * ( u_ice(ji,jj+1) + u_ice(ji+1,jj+1) & 471 & + u_ice(ji,jj ) + u_ice(ji+1,jj ) ) 472 zwndj_t = sf(jp_wndj)%fnow(ji,jj,1) - rn_vfac * 0.25 * ( v_ice(ji,jj+1) + v_ice(ji+1,jj+1) & 473 & + v_ice(ji,jj ) + v_ice(ji+1,jj ) ) 474 wndm_ice(ji,jj) = SQRT( zwndi_t * zwndi_t + zwndj_t * zwndj_t ) * tmask(ji,jj,1) 491 475 END DO 492 476 END DO 493 END DO 494 ! 495 IF( nn_timing == 1 ) CALL timing_stop('blk_ice_meanqsr') 496 ! 497 END SUBROUTINE blk_ice_meanqsr 498 499 500 SUBROUTINE blk_ice_core( pst , pui , pvi , palb , & 501 & p_taui, p_tauj, p_qns , p_qsr, & 502 & p_qla , p_dqns, p_dqla, & 503 & p_tpr , p_spr , & 504 & p_fr1 , p_fr2 , cd_grid, pdim ) 505 !!--------------------------------------------------------------------- 506 !! *** ROUTINE blk_ice_core *** 477 CALL lbc_lnk( utau_ice, 'I', -1. ) 478 CALL lbc_lnk( vtau_ice, 'I', -1. ) 479 CALL lbc_lnk( wndm_ice, 'T', 1. ) 480 ! 481 CASE( 'C' ) ! C-grid ice dynamics : U & V-points (same as ocean) 482 DO jj = 2, jpj 483 DO ji = fs_2, jpi ! vect. opt. 484 zwndi_t = ( sf(jp_wndi)%fnow(ji,jj,1) - rn_vfac * 0.5 * ( u_ice(ji-1,jj ) + u_ice(ji,jj) ) ) 485 zwndj_t = ( sf(jp_wndj)%fnow(ji,jj,1) - rn_vfac * 0.5 * ( v_ice(ji ,jj-1) + v_ice(ji,jj) ) ) 486 wndm_ice(ji,jj) = SQRT( zwndi_t * zwndi_t + zwndj_t * zwndj_t ) * tmask(ji,jj,1) 487 END DO 488 END DO 489 DO jj = 2, jpjm1 490 DO ji = fs_2, fs_jpim1 ! vect. opt. 491 utau_ice(ji,jj) = zcoef_wnorm2 * ( wndm_ice(ji+1,jj ) + wndm_ice(ji,jj) ) & 492 & * ( 0.5 * (sf(jp_wndi)%fnow(ji+1,jj,1) + sf(jp_wndi)%fnow(ji,jj,1) ) - rn_vfac * u_ice(ji,jj) ) 493 vtau_ice(ji,jj) = zcoef_wnorm2 * ( wndm_ice(ji,jj+1 ) + wndm_ice(ji,jj) ) & 494 & * ( 0.5 * (sf(jp_wndj)%fnow(ji,jj+1,1) + sf(jp_wndj)%fnow(ji,jj,1) ) - rn_vfac * v_ice(ji,jj) ) 495 END DO 496 END DO 497 CALL lbc_lnk( utau_ice, 'U', -1. ) 498 CALL lbc_lnk( vtau_ice, 'V', -1. ) 499 CALL lbc_lnk( wndm_ice, 'T', 1. ) 500 ! 501 END SELECT 502 503 IF(ln_ctl) THEN 504 CALL prt_ctl(tab2d_1=utau_ice , clinfo1=' blk_ice_core: utau_ice : ', tab2d_2=vtau_ice , clinfo2=' vtau_ice : ') 505 CALL prt_ctl(tab2d_1=wndm_ice , clinfo1=' blk_ice_core: wndm_ice : ') 506 ENDIF 507 508 IF( nn_timing == 1 ) CALL timing_stop('blk_ice_core_tau') 509 510 END SUBROUTINE blk_ice_core_tau 511 512 513 SUBROUTINE blk_ice_core_flx( ptsu, palb ) 514 !!--------------------------------------------------------------------- 515 !! *** ROUTINE blk_ice_core_flx *** 507 516 !! 508 517 !! ** Purpose : provide the surface boundary condition over sea-ice 509 518 !! 510 !! ** Method : compute momentum,heat and freshwater exchanged519 !! ** Method : compute heat and freshwater exchanged 511 520 !! between atmosphere and sea-ice using CORE bulk 512 521 !! formulea, ice variables and read atmmospheric fields. 513 !! NB: ice drag coefficient is assumed to be a constant514 522 !! 515 523 !! caution : the net upward water flux has with mm/day unit 516 524 !!--------------------------------------------------------------------- 517 REAL(wp), DIMENSION(:,:,:), INTENT(in ) :: pst ! ice surface temperature (>0, =rt0 over land) [Kelvin] 518 REAL(wp), DIMENSION(:,:) , INTENT(in ) :: pui ! ice surface velocity (i- and i- components [m/s] 519 REAL(wp), DIMENSION(:,:) , INTENT(in ) :: pvi ! at I-point (B-grid) or U & V-point (C-grid) 520 REAL(wp), DIMENSION(:,:,:), INTENT(in ) :: palb ! ice albedo (clear sky) (alb_ice_cs) [%] 521 REAL(wp), DIMENSION(:,:) , INTENT( out) :: p_taui ! i- & j-components of surface ice stress [N/m2] 522 REAL(wp), DIMENSION(:,:) , INTENT( out) :: p_tauj ! at I-point (B-grid) or U & V-point (C-grid) 523 REAL(wp), DIMENSION(:,:,:), INTENT( out) :: p_qns ! non solar heat flux over ice (T-point) [W/m2] 524 REAL(wp), DIMENSION(:,:,:), INTENT( out) :: p_qsr ! solar heat flux over ice (T-point) [W/m2] 525 REAL(wp), DIMENSION(:,:,:), INTENT( out) :: p_qla ! latent heat flux over ice (T-point) [W/m2] 526 REAL(wp), DIMENSION(:,:,:), INTENT( out) :: p_dqns ! non solar heat sensistivity (T-point) [W/m2] 527 REAL(wp), DIMENSION(:,:,:), INTENT( out) :: p_dqla ! latent heat sensistivity (T-point) [W/m2] 528 REAL(wp), DIMENSION(:,:) , INTENT( out) :: p_tpr ! total precipitation (T-point) [Kg/m2/s] 529 REAL(wp), DIMENSION(:,:) , INTENT( out) :: p_spr ! solid precipitation (T-point) [Kg/m2/s] 530 REAL(wp), DIMENSION(:,:) , INTENT( out) :: p_fr1 ! 1sr fraction of qsr penetration in ice (T-point) [%] 531 REAL(wp), DIMENSION(:,:) , INTENT( out) :: p_fr2 ! 2nd fraction of qsr penetration in ice (T-point) [%] 532 CHARACTER(len=1) , INTENT(in ) :: cd_grid ! ice grid ( C or B-grid) 533 INTEGER , INTENT(in ) :: pdim ! number of ice categories 525 REAL(wp), DIMENSION(:,:,:), INTENT(in) :: ptsu ! sea ice surface temperature 526 REAL(wp), DIMENSION(:,:,:), INTENT(in) :: palb ! ice albedo (all skies) 534 527 !! 535 528 INTEGER :: ji, jj, jl ! dummy loop indices 536 INTEGER :: ijpl ! number of ice categories (size of 3rd dim of input arrays)537 529 REAL(wp) :: zst2, zst3 538 REAL(wp) :: zcoef_wnorm, zcoef_wnorm2, zcoef_dqlw, zcoef_dqla, zcoef_dqsb 539 REAL(wp) :: zztmp ! temporary variable 540 REAL(wp) :: zcoef_frca ! fractional cloud amount 541 REAL(wp) :: zwnorm_f, zwndi_f , zwndj_f ! relative wind module and components at F-point 542 REAL(wp) :: zwndi_t , zwndj_t ! relative wind components at T-point 543 !! 544 REAL(wp), DIMENSION(:,:) , POINTER :: z_wnds_t ! wind speed ( = | U10m - U_ice | ) at T-point 530 REAL(wp) :: zcoef_dqlw, zcoef_dqla, zcoef_dqsb 531 REAL(wp) :: zztmp, z1_lsub ! temporary variable 532 !! 545 533 REAL(wp), DIMENSION(:,:,:), POINTER :: z_qlw ! long wave heat flux over ice 546 534 REAL(wp), DIMENSION(:,:,:), POINTER :: z_qsb ! sensible heat flux over ice 547 535 REAL(wp), DIMENSION(:,:,:), POINTER :: z_dqlw ! long wave heat sensitivity over ice 548 536 REAL(wp), DIMENSION(:,:,:), POINTER :: z_dqsb ! sensible heat sensitivity over ice 549 !!--------------------------------------------------------------------- 550 ! 551 IF( nn_timing == 1 ) CALL timing_start('blk_ice_core') 552 ! 553 CALL wrk_alloc( jpi,jpj, z_wnds_t ) 554 CALL wrk_alloc( jpi,jpj,pdim, z_qlw, z_qsb, z_dqlw, z_dqsb ) 555 556 ijpl = pdim ! number of ice categories 537 REAL(wp), DIMENSION(:,:) , POINTER :: zevap, zsnw ! evaporation and snw distribution after wind blowing (LIM3) 538 !!--------------------------------------------------------------------- 539 ! 540 IF( nn_timing == 1 ) CALL timing_start('blk_ice_core_flx') 541 ! 542 CALL wrk_alloc( jpi,jpj,jpl, z_qlw, z_qsb, z_dqlw, z_dqsb ) 557 543 558 544 ! local scalars ( place there for vector optimisation purposes) 559 zcoef_wnorm = rhoa * Cice560 zcoef_wnorm2 = rhoa * Cice * 0.5561 545 zcoef_dqlw = 4.0 * 0.95 * Stef 562 546 zcoef_dqla = -Ls * Cice * 11637800. * (-5897.8) 563 547 zcoef_dqsb = rhoa * cpa * Cice 564 zcoef_frca = 1.0 - 0.3565 566 !!gm brutal....567 z_wnds_t(:,:) = 0.e0568 p_taui (:,:) = 0.e0569 p_tauj (:,:) = 0.e0570 !!gm end571 572 #if defined key_lim3573 tatm_ice(:,:) = sf(jp_tair)%fnow(:,:,1) ! LIM3: make Tair available in sea-ice. WARNING allocated after call to ice_init574 #endif575 ! ----------------------------------------------------------------------------- !576 ! Wind components and module relative to the moving ocean ( U10m - U_ice ) !577 ! ----------------------------------------------------------------------------- !578 SELECT CASE( cd_grid )579 CASE( 'I' ) ! B-grid ice dynamics : I-point (i.e. F-point with sea-ice indexation)580 ! and scalar wind at T-point ( = | U10m - U_ice | ) (masked)581 !CDIR NOVERRCHK582 DO jj = 2, jpjm1583 DO ji = 2, jpim1 ! B grid : NO vector opt584 ! ... scalar wind at I-point (fld being at T-point)585 zwndi_f = 0.25 * ( sf(jp_wndi)%fnow(ji-1,jj ,1) + sf(jp_wndi)%fnow(ji ,jj ,1) &586 & + sf(jp_wndi)%fnow(ji-1,jj-1,1) + sf(jp_wndi)%fnow(ji ,jj-1,1) ) - rn_vfac * pui(ji,jj)587 zwndj_f = 0.25 * ( sf(jp_wndj)%fnow(ji-1,jj ,1) + sf(jp_wndj)%fnow(ji ,jj ,1) &588 & + sf(jp_wndj)%fnow(ji-1,jj-1,1) + sf(jp_wndj)%fnow(ji ,jj-1,1) ) - rn_vfac * pvi(ji,jj)589 zwnorm_f = zcoef_wnorm * SQRT( zwndi_f * zwndi_f + zwndj_f * zwndj_f )590 ! ... ice stress at I-point591 p_taui(ji,jj) = zwnorm_f * zwndi_f592 p_tauj(ji,jj) = zwnorm_f * zwndj_f593 ! ... scalar wind at T-point (fld being at T-point)594 zwndi_t = sf(jp_wndi)%fnow(ji,jj,1) - rn_vfac * 0.25 * ( pui(ji,jj+1) + pui(ji+1,jj+1) &595 & + pui(ji,jj ) + pui(ji+1,jj ) )596 zwndj_t = sf(jp_wndj)%fnow(ji,jj,1) - rn_vfac * 0.25 * ( pvi(ji,jj+1) + pvi(ji+1,jj+1) &597 & + pvi(ji,jj ) + pvi(ji+1,jj ) )598 z_wnds_t(ji,jj) = SQRT( zwndi_t * zwndi_t + zwndj_t * zwndj_t ) * tmask(ji,jj,1)599 END DO600 END DO601 CALL lbc_lnk( p_taui , 'I', -1. )602 CALL lbc_lnk( p_tauj , 'I', -1. )603 CALL lbc_lnk( z_wnds_t, 'T', 1. )604 !605 CASE( 'C' ) ! C-grid ice dynamics : U & V-points (same as ocean)606 #if defined key_vectopt_loop607 !CDIR COLLAPSE608 #endif609 DO jj = 2, jpj610 DO ji = fs_2, jpi ! vect. opt.611 zwndi_t = ( sf(jp_wndi)%fnow(ji,jj,1) - rn_vfac * 0.5 * ( pui(ji-1,jj ) + pui(ji,jj) ) )612 zwndj_t = ( sf(jp_wndj)%fnow(ji,jj,1) - rn_vfac * 0.5 * ( pvi(ji ,jj-1) + pvi(ji,jj) ) )613 z_wnds_t(ji,jj) = SQRT( zwndi_t * zwndi_t + zwndj_t * zwndj_t ) * tmask(ji,jj,1)614 END DO615 END DO616 #if defined key_vectopt_loop617 !CDIR COLLAPSE618 #endif619 DO jj = 2, jpjm1620 DO ji = fs_2, fs_jpim1 ! vect. opt.621 p_taui(ji,jj) = zcoef_wnorm2 * ( z_wnds_t(ji+1,jj ) + z_wnds_t(ji,jj) ) &622 & * ( 0.5 * (sf(jp_wndi)%fnow(ji+1,jj,1) + sf(jp_wndi)%fnow(ji,jj,1) ) - rn_vfac * pui(ji,jj) )623 p_tauj(ji,jj) = zcoef_wnorm2 * ( z_wnds_t(ji,jj+1 ) + z_wnds_t(ji,jj) ) &624 & * ( 0.5 * (sf(jp_wndj)%fnow(ji,jj+1,1) + sf(jp_wndj)%fnow(ji,jj,1) ) - rn_vfac * pvi(ji,jj) )625 END DO626 END DO627 CALL lbc_lnk( p_taui , 'U', -1. )628 CALL lbc_lnk( p_tauj , 'V', -1. )629 CALL lbc_lnk( z_wnds_t, 'T', 1. )630 !631 END SELECT632 548 633 549 zztmp = 1. / ( 1. - albo ) 634 550 ! ! ========================== ! 635 DO jl = 1, ijpl! Loop over ice categories !551 DO jl = 1, jpl ! Loop over ice categories ! 636 552 ! ! ========================== ! 637 !CDIR NOVERRCHK638 !CDIR COLLAPSE639 553 DO jj = 1 , jpj 640 !CDIR NOVERRCHK641 554 DO ji = 1, jpi 642 555 ! ----------------------------! 643 556 ! I Radiative FLUXES ! 644 557 ! ----------------------------! 645 zst2 = p st(ji,jj,jl) * pst(ji,jj,jl)646 zst3 = p st(ji,jj,jl) * zst2558 zst2 = ptsu(ji,jj,jl) * ptsu(ji,jj,jl) 559 zst3 = ptsu(ji,jj,jl) * zst2 647 560 ! Short Wave (sw) 648 p_qsr(ji,jj,jl) = zztmp * ( 1. - palb(ji,jj,jl) ) * qsr(ji,jj)561 qsr_ice(ji,jj,jl) = zztmp * ( 1. - palb(ji,jj,jl) ) * qsr(ji,jj) 649 562 ! Long Wave (lw) 650 ! iovino 651 IF( ff(ji,jj) .GT. 0._wp ) THEN 652 z_qlw(ji,jj,jl) = ( 0.95 * sf(jp_qlw)%fnow(ji,jj,1) - Stef * pst(ji,jj,jl) * zst3 ) * tmask(ji,jj,1) 653 ELSE 654 z_qlw(ji,jj,jl) = 0.95 * ( sf(jp_qlw)%fnow(ji,jj,1) - Stef * pst(ji,jj,jl) * zst3 ) * tmask(ji,jj,1) 655 ENDIF 563 z_qlw(ji,jj,jl) = 0.95 * ( sf(jp_qlw)%fnow(ji,jj,1) - Stef * ptsu(ji,jj,jl) * zst3 ) * tmask(ji,jj,1) 656 564 ! lw sensitivity 657 565 z_dqlw(ji,jj,jl) = zcoef_dqlw * zst3 … … 663 571 ! ... turbulent heat fluxes 664 572 ! Sensible Heat 665 z_qsb(ji,jj,jl) = rhoa * cpa * Cice * z_wnds_t(ji,jj) * ( pst(ji,jj,jl) - sf(jp_tair)%fnow(ji,jj,1) )573 z_qsb(ji,jj,jl) = rhoa * cpa * Cice * wndm_ice(ji,jj) * ( ptsu(ji,jj,jl) - sf(jp_tair)%fnow(ji,jj,1) ) 666 574 ! Latent Heat 667 p_qla(ji,jj,jl) = rn_efac * MAX( 0.e0, rhoa * Ls * Cice * z_wnds_t(ji,jj) & 668 & * ( 11637800. * EXP( -5897.8 / pst(ji,jj,jl) ) / rhoa - sf(jp_humi)%fnow(ji,jj,1) ) ) 669 ! Latent heat sensitivity for ice (Dqla/Dt) 670 p_dqla(ji,jj,jl) = rn_efac * zcoef_dqla * z_wnds_t(ji,jj) / ( zst2 ) * EXP( -5897.8 / pst(ji,jj,jl) ) 575 qla_ice(ji,jj,jl) = rn_efac * MAX( 0.e0, rhoa * Ls * Cice * wndm_ice(ji,jj) & 576 & * ( 11637800. * EXP( -5897.8 / ptsu(ji,jj,jl) ) / rhoa - sf(jp_humi)%fnow(ji,jj,1) ) ) 577 ! Latent heat sensitivity for ice (Dqla/Dt) 578 IF( qla_ice(ji,jj,jl) > 0._wp ) THEN 579 dqla_ice(ji,jj,jl) = rn_efac * zcoef_dqla * wndm_ice(ji,jj) / ( zst2 ) * EXP( -5897.8 / ptsu(ji,jj,jl) ) 580 ELSE 581 dqla_ice(ji,jj,jl) = 0._wp 582 ENDIF 583 671 584 ! Sensible heat sensitivity (Dqsb_ice/Dtn_ice) 672 z_dqsb(ji,jj,jl) = zcoef_dqsb * z_wnds_t(ji,jj)585 z_dqsb(ji,jj,jl) = zcoef_dqsb * wndm_ice(ji,jj) 673 586 674 587 ! ----------------------------! … … 676 589 ! ----------------------------! 677 590 ! Downward Non Solar flux 678 p_qns (ji,jj,jl) = z_qlw (ji,jj,jl) - z_qsb (ji,jj,jl) - p_qla (ji,jj,jl)591 qns_ice (ji,jj,jl) = z_qlw (ji,jj,jl) - z_qsb (ji,jj,jl) - qla_ice (ji,jj,jl) 679 592 ! Total non solar heat flux sensitivity for ice 680 p_dqns(ji,jj,jl) = - ( z_dqlw(ji,jj,jl) + z_dqsb(ji,jj,jl) + p_dqla(ji,jj,jl) )593 dqns_ice(ji,jj,jl) = - ( z_dqlw(ji,jj,jl) + z_dqsb(ji,jj,jl) + dqla_ice(ji,jj,jl) ) 681 594 END DO 682 595 ! … … 685 598 END DO 686 599 ! 600 tprecip(:,:) = sf(jp_prec)%fnow(:,:,1) * rn_pfac ! total precipitation [kg/m2/s] 601 sprecip(:,:) = sf(jp_snow)%fnow(:,:,1) * rn_pfac ! solid precipitation [kg/m2/s] 602 CALL iom_put( 'snowpre', sprecip * 86400. ) ! Snow precipitation 603 CALL iom_put( 'precip' , tprecip * 86400. ) ! Total precipitation 604 605 #if defined key_lim3 606 CALL wrk_alloc( jpi,jpj, zevap, zsnw ) 607 608 ! --- evaporation --- ! 609 z1_lsub = 1._wp / Lsub 610 evap_ice (:,:,:) = qla_ice (:,:,:) * z1_lsub ! sublimation 611 devap_ice(:,:,:) = dqla_ice(:,:,:) * z1_lsub 612 zevap (:,:) = emp(:,:) + tprecip(:,:) ! evaporation over ocean 613 614 ! --- evaporation minus precipitation --- ! 615 zsnw(:,:) = 0._wp 616 CALL lim_thd_snwblow( pfrld, zsnw ) ! snow distribution over ice after wind blowing 617 emp_oce(:,:) = pfrld(:,:) * zevap(:,:) - ( tprecip(:,:) - sprecip(:,:) ) - sprecip(:,:) * (1._wp - zsnw ) 618 emp_ice(:,:) = SUM( a_i_b(:,:,:) * evap_ice(:,:,:), dim=3 ) - sprecip(:,:) * zsnw 619 emp_tot(:,:) = emp_oce(:,:) + emp_ice(:,:) 620 621 ! --- heat flux associated with emp --- ! 622 qemp_oce(:,:) = - pfrld(:,:) * zevap(:,:) * sst_m(:,:) * rcp & ! evap at sst 623 & + ( tprecip(:,:) - sprecip(:,:) ) * ( sf(jp_tair)%fnow(:,:,1) - rt0 ) * rcp & ! liquid precip at Tair 624 & + sprecip(:,:) * ( 1._wp - zsnw ) * & ! solid precip at min(Tair,Tsnow) 625 & ( ( MIN( sf(jp_tair)%fnow(:,:,1), rt0_snow ) - rt0 ) * cpic * tmask(:,:,1) - lfus ) 626 qemp_ice(:,:) = sprecip(:,:) * zsnw * & ! solid precip (only) 627 & ( ( MIN( sf(jp_tair)%fnow(:,:,1), rt0_snow ) - rt0 ) * cpic * tmask(:,:,1) - lfus ) 628 629 ! --- total solar and non solar fluxes --- ! 630 qns_tot(:,:) = pfrld(:,:) * qns_oce(:,:) + SUM( a_i_b(:,:,:) * qns_ice(:,:,:), dim=3 ) + qemp_ice(:,:) + qemp_oce(:,:) 631 qsr_tot(:,:) = pfrld(:,:) * qsr_oce(:,:) + SUM( a_i_b(:,:,:) * qsr_ice(:,:,:), dim=3 ) 632 633 ! --- heat content of precip over ice in J/m3 (to be used in 1D-thermo) --- ! 634 qprec_ice(:,:) = rhosn * ( ( MIN( sf(jp_tair)%fnow(:,:,1), rt0_snow ) - rt0 ) * cpic * tmask(:,:,1) - lfus ) 635 636 CALL wrk_dealloc( jpi,jpj, zevap, zsnw ) 637 #endif 638 687 639 !-------------------------------------------------------------------- 688 640 ! FRACTIONs of net shortwave radiation which is not absorbed in the 689 641 ! thin surface layer and penetrates inside the ice cover 690 642 ! ( Maykut and Untersteiner, 1971 ; Ebert and Curry, 1993 ) 691 692 !CDIR COLLAPSE 693 p_fr1(:,:) = ( 0.18 * ( 1.0 - zcoef_frca ) + 0.35 * zcoef_frca ) 694 !CDIR COLLAPSE 695 p_fr2(:,:) = ( 0.82 * ( 1.0 - zcoef_frca ) + 0.65 * zcoef_frca ) 696 697 !CDIR COLLAPSE 698 p_tpr(:,:) = sf(jp_prec)%fnow(:,:,1) * rn_pfac ! total precipitation [kg/m2/s] 699 !CDIR COLLAPSE 700 p_spr(:,:) = sf(jp_snow)%fnow(:,:,1) * rn_pfac ! solid precipitation [kg/m2/s] 701 CALL iom_put( 'snowpre', p_spr * 86400. ) ! Snow precipitation 702 CALL iom_put( 'precip', p_tpr * 86400. ) ! Total precipitation 643 ! 644 fr1_i0(:,:) = ( 0.18 * ( 1.0 - cldf_ice ) + 0.35 * cldf_ice ) 645 fr2_i0(:,:) = ( 0.82 * ( 1.0 - cldf_ice ) + 0.65 * cldf_ice ) 646 ! 703 647 ! 704 648 IF(ln_ctl) THEN 705 CALL prt_ctl(tab3d_1=p_qla , clinfo1=' blk_ice_core: p_qla : ', tab3d_2=z_qsb , clinfo2=' z_qsb : ', kdim=ijpl) 706 CALL prt_ctl(tab3d_1=z_qlw , clinfo1=' blk_ice_core: z_qlw : ', tab3d_2=p_dqla , clinfo2=' p_dqla : ', kdim=ijpl) 707 CALL prt_ctl(tab3d_1=z_dqsb , clinfo1=' blk_ice_core: z_dqsb : ', tab3d_2=z_dqlw , clinfo2=' z_dqlw : ', kdim=ijpl) 708 CALL prt_ctl(tab3d_1=p_dqns , clinfo1=' blk_ice_core: p_dqns : ', tab3d_2=p_qsr , clinfo2=' p_qsr : ', kdim=ijpl) 709 CALL prt_ctl(tab3d_1=pst , clinfo1=' blk_ice_core: pst : ', tab3d_2=p_qns , clinfo2=' p_qns : ', kdim=ijpl) 710 CALL prt_ctl(tab2d_1=p_tpr , clinfo1=' blk_ice_core: p_tpr : ', tab2d_2=p_spr , clinfo2=' p_spr : ') 711 CALL prt_ctl(tab2d_1=p_taui , clinfo1=' blk_ice_core: p_taui : ', tab2d_2=p_tauj , clinfo2=' p_tauj : ') 712 CALL prt_ctl(tab2d_1=z_wnds_t, clinfo1=' blk_ice_core: z_wnds_t : ') 713 ENDIF 714 715 CALL wrk_dealloc( jpi,jpj, z_wnds_t ) 716 CALL wrk_dealloc( jpi,jpj,pdim, z_qlw, z_qsb, z_dqlw, z_dqsb ) 717 ! 718 IF( nn_timing == 1 ) CALL timing_stop('blk_ice_core') 719 ! 720 END SUBROUTINE blk_ice_core 721 722 723 SUBROUTINE TURB_CORE_1Z(zu, sst, T_a, q_sat, q_a, & 724 & dU , Cd , Ch , Ce ) 649 CALL prt_ctl(tab3d_1=qla_ice , clinfo1=' blk_ice_core: qla_ice : ', tab3d_2=z_qsb , clinfo2=' z_qsb : ', kdim=jpl) 650 CALL prt_ctl(tab3d_1=z_qlw , clinfo1=' blk_ice_core: z_qlw : ', tab3d_2=dqla_ice, clinfo2=' dqla_ice : ', kdim=jpl) 651 CALL prt_ctl(tab3d_1=z_dqsb , clinfo1=' blk_ice_core: z_dqsb : ', tab3d_2=z_dqlw , clinfo2=' z_dqlw : ', kdim=jpl) 652 CALL prt_ctl(tab3d_1=dqns_ice, clinfo1=' blk_ice_core: dqns_ice : ', tab3d_2=qsr_ice , clinfo2=' qsr_ice : ', kdim=jpl) 653 CALL prt_ctl(tab3d_1=ptsu , clinfo1=' blk_ice_core: ptsu : ', tab3d_2=qns_ice , clinfo2=' qns_ice : ', kdim=jpl) 654 CALL prt_ctl(tab2d_1=tprecip , clinfo1=' blk_ice_core: tprecip : ', tab2d_2=sprecip , clinfo2=' sprecip : ') 655 ENDIF 656 657 CALL wrk_dealloc( jpi,jpj,jpl, z_qlw, z_qsb, z_dqlw, z_dqsb ) 658 ! 659 IF( nn_timing == 1 ) CALL timing_stop('blk_ice_core_flx') 660 661 END SUBROUTINE blk_ice_core_flx 662 #endif 663 664 SUBROUTINE turb_core_2z( zt, zu, sst, T_zt, q_sat, q_zt, dU, & 665 & Cd, Ch, Ce , T_zu, q_zu ) 725 666 !!---------------------------------------------------------------------- 726 667 !! *** ROUTINE turb_core *** 727 668 !! 728 669 !! ** Purpose : Computes turbulent transfert coefficients of surface 729 !! fluxes according to Large & Yeager (2004) 730 !! 731 !! ** Method : I N E R T I A L D I S S I P A T I O N M E T H O D 732 !! Momentum, Latent and sensible heat exchange coefficients 733 !! Caution: this procedure should only be used in cases when air 734 !! temperature (T_air), air specific humidity (q_air) and wind (dU) 735 !! are provided at the same height 'zzu'! 736 !! 737 !! References : Large & Yeager, 2004 : ??? 738 !!---------------------------------------------------------------------- 739 REAL(wp) , INTENT(in ) :: zu ! altitude of wind measurement [m] 740 REAL(wp), DIMENSION(:,:), INTENT(in ) :: sst ! sea surface temperature [Kelvin] 741 REAL(wp), DIMENSION(:,:), INTENT(in ) :: T_a ! potential air temperature [Kelvin] 742 REAL(wp), DIMENSION(:,:), INTENT(in ) :: q_sat ! sea surface specific humidity [kg/kg] 743 REAL(wp), DIMENSION(:,:), INTENT(in ) :: q_a ! specific air humidity [kg/kg] 744 REAL(wp), DIMENSION(:,:), INTENT(in ) :: dU ! wind module |U(zu)-U(0)| [m/s] 745 REAL(wp), DIMENSION(:,:), INTENT( out) :: Cd ! transfert coefficient for momentum (tau) 746 REAL(wp), DIMENSION(:,:), INTENT( out) :: Ch ! transfert coefficient for temperature (Q_sens) 747 REAL(wp), DIMENSION(:,:), INTENT( out) :: Ce ! transfert coefficient for evaporation (Q_lat) 748 !! 749 INTEGER :: j_itt 750 INTEGER , PARAMETER :: nb_itt = 3 751 REAL(wp), PARAMETER :: grav = 9.8 ! gravity 752 REAL(wp), PARAMETER :: kappa = 0.4 ! von Karman s constant 753 754 REAL(wp), DIMENSION(:,:), POINTER :: dU10 ! dU [m/s] 755 REAL(wp), DIMENSION(:,:), POINTER :: dT ! air/sea temperature differeence [K] 756 REAL(wp), DIMENSION(:,:), POINTER :: dq ! air/sea humidity difference [K] 757 REAL(wp), DIMENSION(:,:), POINTER :: Cd_n10 ! 10m neutral drag coefficient 758 REAL(wp), DIMENSION(:,:), POINTER :: Ce_n10 ! 10m neutral latent coefficient 759 REAL(wp), DIMENSION(:,:), POINTER :: Ch_n10 ! 10m neutral sensible coefficient 760 REAL(wp), DIMENSION(:,:), POINTER :: sqrt_Cd_n10 ! root square of Cd_n10 761 REAL(wp), DIMENSION(:,:), POINTER :: sqrt_Cd ! root square of Cd 762 REAL(wp), DIMENSION(:,:), POINTER :: T_vpot ! virtual potential temperature [K] 763 REAL(wp), DIMENSION(:,:), POINTER :: T_star ! turbulent scale of tem. fluct. 764 REAL(wp), DIMENSION(:,:), POINTER :: q_star ! turbulent humidity of temp. fluct. 765 REAL(wp), DIMENSION(:,:), POINTER :: U_star ! turb. scale of velocity fluct. 766 REAL(wp), DIMENSION(:,:), POINTER :: L ! Monin-Obukov length [m] 767 REAL(wp), DIMENSION(:,:), POINTER :: zeta ! stability parameter at height zu 768 REAL(wp), DIMENSION(:,:), POINTER :: U_n10 ! neutral wind velocity at 10m [m] 769 REAL(wp), DIMENSION(:,:), POINTER :: xlogt, xct, zpsi_h, zpsi_m 770 771 INTEGER , DIMENSION(:,:), POINTER :: stab ! 1st guess stability test integer 772 !!---------------------------------------------------------------------- 773 ! 774 IF( nn_timing == 1 ) CALL timing_start('TURB_CORE_1Z') 775 ! 776 CALL wrk_alloc( jpi,jpj, stab ) ! integer 777 CALL wrk_alloc( jpi,jpj, dU10, dT, dq, Cd_n10, Ce_n10, Ch_n10, sqrt_Cd_n10, sqrt_Cd, L ) 778 CALL wrk_alloc( jpi,jpj, T_vpot, T_star, q_star, U_star, zeta, U_n10, xlogt, xct, zpsi_h, zpsi_m ) 779 780 !! * Start 781 !! Air/sea differences 782 dU10 = max(0.5, dU) ! we don't want to fall under 0.5 m/s 783 dT = T_a - sst ! assuming that T_a is allready the potential temp. at zzu 784 dq = q_a - q_sat 785 !! 786 !! Virtual potential temperature 787 T_vpot = T_a*(1. + 0.608*q_a) 788 !! 789 !! Neutral Drag Coefficient 790 stab = 0.5 + sign(0.5,dT) ! stable : stab = 1 ; unstable : stab = 0 791 IF ( ln_cdgw ) THEN 792 cdn_wave = cdn_wave - rsmall*(tmask(:,:,1)-1) 793 Cd_n10(:,:) = cdn_wave 794 ELSE 795 Cd_n10 = 1.e-3 * ( 2.7/dU10 + 0.142 + dU10/13.09 ) ! L & Y eq. (6a) 796 ENDIF 797 sqrt_Cd_n10 = sqrt(Cd_n10) 798 Ce_n10 = 1.e-3 * ( 34.6 * sqrt_Cd_n10 ) ! L & Y eq. (6b) 799 Ch_n10 = 1.e-3*sqrt_Cd_n10*(18.*stab + 32.7*(1.-stab)) ! L & Y eq. (6c), (6d) 800 !! 801 !! Initializing transfert coefficients with their first guess neutral equivalents : 802 Cd = Cd_n10 ; Ce = Ce_n10 ; Ch = Ch_n10 ; sqrt_Cd = sqrt(Cd) 803 804 !! * Now starting iteration loop 805 DO j_itt=1, nb_itt 806 !! Turbulent scales : 807 U_star = sqrt_Cd*dU10 ! L & Y eq. (7a) 808 T_star = Ch/sqrt_Cd*dT ! L & Y eq. (7b) 809 q_star = Ce/sqrt_Cd*dq ! L & Y eq. (7c) 810 811 !! Estimate the Monin-Obukov length : 812 L = (U_star**2)/( kappa*grav*(T_star/T_vpot + q_star/(q_a + 1./0.608)) ) 813 814 !! Stability parameters : 815 zeta = zu/L ; zeta = sign( min(abs(zeta),10.0), zeta ) 816 zpsi_h = psi_h(zeta) 817 zpsi_m = psi_m(zeta) 818 819 IF ( ln_cdgw ) THEN 820 sqrt_Cd=kappa/((kappa/sqrt_Cd_n10) - zpsi_m) ; Cd=sqrt_Cd*sqrt_Cd; 821 ELSE 822 !! Shifting the wind speed to 10m and neutral stability : 823 U_n10 = dU10*1./(1. + sqrt_Cd_n10/kappa*(log(zu/10.) - zpsi_m)) ! L & Y eq. (9a) 824 825 !! Updating the neutral 10m transfer coefficients : 826 Cd_n10 = 1.e-3 * (2.7/U_n10 + 0.142 + U_n10/13.09) ! L & Y eq. (6a) 827 sqrt_Cd_n10 = sqrt(Cd_n10) 828 Ce_n10 = 1.e-3 * (34.6 * sqrt_Cd_n10) ! L & Y eq. (6b) 829 stab = 0.5 + sign(0.5,zeta) 830 Ch_n10 = 1.e-3*sqrt_Cd_n10*(18.*stab + 32.7*(1.-stab)) ! L & Y eq. (6c), (6d) 831 832 !! Shifting the neutral 10m transfer coefficients to ( zu , zeta ) : 833 !! 834 xct = 1. + sqrt_Cd_n10/kappa*(log(zu/10) - zpsi_m) 835 Cd = Cd_n10/(xct*xct) ; sqrt_Cd = sqrt(Cd) 836 ENDIF 837 !! 838 xlogt = log(zu/10.) - zpsi_h 839 !! 840 xct = 1. + Ch_n10*xlogt/kappa/sqrt_Cd_n10 841 Ch = Ch_n10*sqrt_Cd/sqrt_Cd_n10/xct 842 !! 843 xct = 1. + Ce_n10*xlogt/kappa/sqrt_Cd_n10 844 Ce = Ce_n10*sqrt_Cd/sqrt_Cd_n10/xct 845 !! 846 END DO 847 !! 848 CALL wrk_dealloc( jpi,jpj, stab ) ! integer 849 CALL wrk_dealloc( jpi,jpj, dU10, dT, dq, Cd_n10, Ce_n10, Ch_n10, sqrt_Cd_n10, sqrt_Cd, L ) 850 CALL wrk_dealloc( jpi,jpj, T_vpot, T_star, q_star, U_star, zeta, U_n10, xlogt, xct, zpsi_h, zpsi_m ) 851 ! 852 IF( nn_timing == 1 ) CALL timing_stop('TURB_CORE_1Z') 853 ! 854 END SUBROUTINE TURB_CORE_1Z 855 856 857 SUBROUTINE TURB_CORE_2Z(zt, zu, sst, T_zt, q_sat, q_zt, dU, Cd, Ch, Ce, T_zu, q_zu) 858 !!---------------------------------------------------------------------- 859 !! *** ROUTINE turb_core *** 860 !! 861 !! ** Purpose : Computes turbulent transfert coefficients of surface 862 !! fluxes according to Large & Yeager (2004). 863 !! 864 !! ** Method : I N E R T I A L D I S S I P A T I O N M E T H O D 865 !! Momentum, Latent and sensible heat exchange coefficients 866 !! Caution: this procedure should only be used in cases when air 867 !! temperature (T_air) and air specific humidity (q_air) are at a 868 !! different height to wind (dU). 869 !! 870 !! References : Large & Yeager, 2004 : ??? 670 !! fluxes according to Large & Yeager (2004) and Large & Yeager (2008) 671 !! If relevant (zt /= zu), adjust temperature and humidity from height zt to zu 672 !! 673 !! ** Method : Monin Obukhov Similarity Theory 674 !! + Large & Yeager (2004,2008) closure: CD_n10 = f(U_n10) 675 !! 676 !! ** References : Large & Yeager, 2004 / Large & Yeager, 2008 677 !! 678 !! ** Last update: Laurent Brodeau, June 2014: 679 !! - handles both cases zt=zu and zt/=zu 680 !! - optimized: less 2D arrays allocated and less operations 681 !! - better first guess of stability by checking air-sea difference of virtual temperature 682 !! rather than temperature difference only... 683 !! - added function "cd_neutral_10m" that uses the improved parametrization of 684 !! Large & Yeager 2008. Drag-coefficient reduction for Cyclone conditions! 685 !! - using code-wide physical constants defined into "phycst.mod" rather than redifining them 686 !! => 'vkarmn' and 'grav' 871 687 !!---------------------------------------------------------------------- 872 688 REAL(wp), INTENT(in ) :: zt ! height for T_zt and q_zt [m] … … 876 692 REAL(wp), INTENT(in ), DIMENSION(jpi,jpj) :: q_sat ! sea surface specific humidity [kg/kg] 877 693 REAL(wp), INTENT(in ), DIMENSION(jpi,jpj) :: q_zt ! specific air humidity [kg/kg] 878 REAL(wp), INTENT(in ), DIMENSION(jpi,jpj) :: dU ! relative wind module |U(zu)-U(0)|[m/s]694 REAL(wp), INTENT(in ), DIMENSION(jpi,jpj) :: dU ! relative wind module at zu [m/s] 879 695 REAL(wp), INTENT( out), DIMENSION(jpi,jpj) :: Cd ! transfer coefficient for momentum (tau) 880 696 REAL(wp), INTENT( out), DIMENSION(jpi,jpj) :: Ch ! transfer coefficient for sensible heat (Q_sens) … … 882 698 REAL(wp), INTENT( out), DIMENSION(jpi,jpj) :: T_zu ! air temp. shifted at zu [K] 883 699 REAL(wp), INTENT( out), DIMENSION(jpi,jpj) :: q_zu ! spec. hum. shifted at zu [kg/kg] 884 885 INTEGER :: j_itt 886 INTEGER , PARAMETER :: nb_itt = 5 ! number of itterations 887 REAL(wp), PARAMETER :: grav = 9.8 ! gravity 888 REAL(wp), PARAMETER :: kappa = 0.4 ! von Karman's constant 889 890 REAL(wp), DIMENSION(:,:), POINTER :: dU10 ! dU [m/s] 891 REAL(wp), DIMENSION(:,:), POINTER :: dT ! air/sea temperature differeence [K] 892 REAL(wp), DIMENSION(:,:), POINTER :: dq ! air/sea humidity difference [K] 893 REAL(wp), DIMENSION(:,:), POINTER :: Cd_n10 ! 10m neutral drag coefficient 700 ! 701 INTEGER :: j_itt 702 INTEGER , PARAMETER :: nb_itt = 5 ! number of itterations 703 LOGICAL :: l_zt_equal_zu = .FALSE. ! if q and t are given at different height than U 704 ! 705 REAL(wp), DIMENSION(:,:), POINTER :: U_zu ! relative wind at zu [m/s] 894 706 REAL(wp), DIMENSION(:,:), POINTER :: Ce_n10 ! 10m neutral latent coefficient 895 707 REAL(wp), DIMENSION(:,:), POINTER :: Ch_n10 ! 10m neutral sensible coefficient 896 708 REAL(wp), DIMENSION(:,:), POINTER :: sqrt_Cd_n10 ! root square of Cd_n10 897 709 REAL(wp), DIMENSION(:,:), POINTER :: sqrt_Cd ! root square of Cd 898 REAL(wp), DIMENSION(:,:), POINTER :: T_vpot ! virtual potential temperature [K]899 REAL(wp), DIMENSION(:,:), POINTER :: T_star ! turbulent scale of tem. fluct.900 REAL(wp), DIMENSION(:,:), POINTER :: q_star ! turbulent humidity of temp. fluct.901 REAL(wp), DIMENSION(:,:), POINTER :: U_star ! turb. scale of velocity fluct.902 REAL(wp), DIMENSION(:,:), POINTER :: L ! Monin-Obukov length [m]903 710 REAL(wp), DIMENSION(:,:), POINTER :: zeta_u ! stability parameter at height zu 904 711 REAL(wp), DIMENSION(:,:), POINTER :: zeta_t ! stability parameter at height zt 905 REAL(wp), DIMENSION(:,:), POINTER :: U_n10 ! neutral wind velocity at 10m [m] 906 REAL(wp), DIMENSION(:,:), POINTER :: xlogt, xct, zpsi_hu, zpsi_ht, zpsi_m 907 908 INTEGER , DIMENSION(:,:), POINTER :: stab ! 1st stability test integer 712 REAL(wp), DIMENSION(:,:), POINTER :: zpsi_h_u, zpsi_m_u 713 REAL(wp), DIMENSION(:,:), POINTER :: ztmp0, ztmp1, ztmp2 714 REAL(wp), DIMENSION(:,:), POINTER :: stab ! 1st stability test integer 909 715 !!---------------------------------------------------------------------- 910 ! 911 IF( nn_timing == 1 ) CALL timing_start('TURB_CORE_2Z') 912 ! 913 CALL wrk_alloc( jpi,jpj, dU10, dT, dq, Cd_n10, Ce_n10, Ch_n10, sqrt_Cd_n10, sqrt_Cd, L ) 914 CALL wrk_alloc( jpi,jpj, T_vpot, T_star, q_star, U_star, zeta_u, zeta_t, U_n10 ) 915 CALL wrk_alloc( jpi,jpj, xlogt, xct, zpsi_hu, zpsi_ht, zpsi_m ) 916 CALL wrk_alloc( jpi,jpj, stab ) ! interger 917 918 !! Initial air/sea differences 919 dU10 = max(0.5, dU) ! we don't want to fall under 0.5 m/s 920 dT = T_zt - sst 921 dq = q_zt - q_sat 922 923 !! Neutral Drag Coefficient : 924 stab = 0.5 + sign(0.5,dT) ! stab = 1 if dT > 0 -> STABLE 925 IF( ln_cdgw ) THEN 926 cdn_wave = cdn_wave - rsmall*(tmask(:,:,1)-1) 927 Cd_n10(:,:) = cdn_wave 716 717 IF( nn_timing == 1 ) CALL timing_start('turb_core_2z') 718 719 CALL wrk_alloc( jpi,jpj, U_zu, Ce_n10, Ch_n10, sqrt_Cd_n10, sqrt_Cd ) 720 CALL wrk_alloc( jpi,jpj, zeta_u, stab ) 721 CALL wrk_alloc( jpi,jpj, zpsi_h_u, zpsi_m_u, ztmp0, ztmp1, ztmp2 ) 722 723 l_zt_equal_zu = .FALSE. 724 IF( ABS(zu - zt) < 0.01 ) l_zt_equal_zu = .TRUE. ! testing "zu == zt" is risky with double precision 725 726 IF( .NOT. l_zt_equal_zu ) CALL wrk_alloc( jpi,jpj, zeta_t ) 727 728 U_zu = MAX( 0.5 , dU ) ! relative wind speed at zu (normally 10m), we don't want to fall under 0.5 m/s 729 730 !! First guess of stability: 731 ztmp0 = T_zt*(1. + 0.608*q_zt) - sst*(1. + 0.608*q_sat) ! air-sea difference of virtual pot. temp. at zt 732 stab = 0.5 + sign(0.5,ztmp0) ! stab = 1 if dTv > 0 => STABLE, 0 if unstable 733 734 !! Neutral coefficients at 10m: 735 IF( ln_cdgw ) THEN ! wave drag case 736 cdn_wave(:,:) = cdn_wave(:,:) + rsmall * ( 1._wp - tmask(:,:,1) ) 737 ztmp0 (:,:) = cdn_wave(:,:) 928 738 ELSE 929 Cd_n10 = 1.e-3*( 2.7/dU10 + 0.142 + dU10/13.09 )930 ENDIF 931 sqrt_Cd_n10 = sqrt(Cd_n10)739 ztmp0 = cd_neutral_10m( U_zu ) 740 ENDIF 741 sqrt_Cd_n10 = SQRT( ztmp0 ) 932 742 Ce_n10 = 1.e-3*( 34.6 * sqrt_Cd_n10 ) 933 743 Ch_n10 = 1.e-3*sqrt_Cd_n10*(18.*stab + 32.7*(1. - stab)) 934 744 935 745 !! Initializing transf. coeff. with their first guess neutral equivalents : 936 Cd = Cd_n10 ; Ce = Ce_n10 ; Ch = Ch_n10 ; sqrt_Cd = sqrt(Cd)937 938 !! Initializing z_u values with z_t values:939 T_zu = T_zt ;q_zu = q_zt746 Cd = ztmp0 ; Ce = Ce_n10 ; Ch = Ch_n10 ; sqrt_Cd = sqrt_Cd_n10 747 748 !! Initializing values at z_u with z_t values: 749 T_zu = T_zt ; q_zu = q_zt 940 750 941 751 !! * Now starting iteration loop 942 752 DO j_itt=1, nb_itt 943 dT = T_zu - sst ; dq = q_zu - q_sat ! Updating air/sea differences 944 T_vpot = T_zu*(1. + 0.608*q_zu) ! Updating virtual potential temperature at zu 945 U_star = sqrt_Cd*dU10 ! Updating turbulent scales : (L & Y eq. (7)) 946 T_star = Ch/sqrt_Cd*dT ! 947 q_star = Ce/sqrt_Cd*dq ! 948 !! 949 L = (U_star*U_star) & ! Estimate the Monin-Obukov length at height zu 950 & / (kappa*grav/T_vpot*(T_star*(1.+0.608*q_zu) + 0.608*T_zu*q_star)) 753 ! 754 ztmp1 = T_zu - sst ! Updating air/sea differences 755 ztmp2 = q_zu - q_sat 756 757 ! Updating turbulent scales : (L&Y 2004 eq. (7)) 758 ztmp1 = Ch/sqrt_Cd*ztmp1 ! theta* 759 ztmp2 = Ce/sqrt_Cd*ztmp2 ! q* 760 761 ztmp0 = T_zu*(1. + 0.608*q_zu) ! virtual potential temperature at zu 762 763 ! Estimate the inverse of Monin-Obukov length (1/L) at height zu: 764 ztmp0 = (vkarmn*grav/ztmp0*(ztmp1*(1.+0.608*q_zu) + 0.608*T_zu*ztmp2)) / (Cd*U_zu*U_zu) 765 ! ( Cd*U_zu*U_zu is U*^2 at zu) 766 951 767 !! Stability parameters : 952 zeta_u = zu/L ; zeta_u = sign( min(abs(zeta_u),10.0), zeta_u ) 953 zeta_t = zt/L ; zeta_t = sign( min(abs(zeta_t),10.0), zeta_t ) 954 zpsi_hu = psi_h(zeta_u) 955 zpsi_ht = psi_h(zeta_t) 956 zpsi_m = psi_m(zeta_u) 957 !! 958 !! Shifting the wind speed to 10m and neutral stability : (L & Y eq.(9a)) 959 ! U_n10 = dU10/(1. + sqrt_Cd_n10/kappa*(log(zu/10.) - psi_m(zeta_u))) 960 U_n10 = dU10/(1. + sqrt_Cd_n10/kappa*(log(zu/10.) - zpsi_m)) 961 !! 962 !! Shifting temperature and humidity at zu : (L & Y eq. (9b-9c)) 963 ! T_zu = T_zt - T_star/kappa*(log(zt/zu) + psi_h(zeta_u) - psi_h(zeta_t)) 964 T_zu = T_zt - T_star/kappa*(log(zt/zu) + zpsi_hu - zpsi_ht) 965 ! q_zu = q_zt - q_star/kappa*(log(zt/zu) + psi_h(zeta_u) - psi_h(zeta_t)) 966 q_zu = q_zt - q_star/kappa*(log(zt/zu) + zpsi_hu - zpsi_ht) 967 !! 968 !! q_zu cannot have a negative value : forcing 0 969 stab = 0.5 + sign(0.5,q_zu) ; q_zu = stab*q_zu 970 !! 971 IF( ln_cdgw ) THEN 972 sqrt_Cd=kappa/((kappa/sqrt_Cd_n10) - zpsi_m) ; Cd=sqrt_Cd*sqrt_Cd; 768 zeta_u = zu*ztmp0 ; zeta_u = sign( min(abs(zeta_u),10.0), zeta_u ) 769 zpsi_h_u = psi_h( zeta_u ) 770 zpsi_m_u = psi_m( zeta_u ) 771 772 !! Shifting temperature and humidity at zu (L&Y 2004 eq. (9b-9c)) 773 IF ( .NOT. l_zt_equal_zu ) THEN 774 zeta_t = zt*ztmp0 ; zeta_t = sign( min(abs(zeta_t),10.0), zeta_t ) 775 stab = LOG(zu/zt) - zpsi_h_u + psi_h(zeta_t) ! stab just used as temp array!!! 776 T_zu = T_zt + ztmp1/vkarmn*stab ! ztmp1 is still theta* 777 q_zu = q_zt + ztmp2/vkarmn*stab ! ztmp2 is still q* 778 q_zu = max(0., q_zu) 779 END IF 780 781 IF( ln_cdgw ) THEN ! surface wave case 782 sqrt_Cd = vkarmn / ( vkarmn / sqrt_Cd_n10 - zpsi_m_u ) 783 Cd = sqrt_Cd * sqrt_Cd 973 784 ELSE 974 !! Updating the neutral 10m transfer coefficients : 975 Cd_n10 = 1.e-3 * (2.7/U_n10 + 0.142 + U_n10/13.09) ! L & Y eq. (6a) 976 sqrt_Cd_n10 = sqrt(Cd_n10) 977 Ce_n10 = 1.e-3 * (34.6 * sqrt_Cd_n10) ! L & Y eq. (6b) 978 stab = 0.5 + sign(0.5,zeta_u) 979 Ch_n10 = 1.e-3*sqrt_Cd_n10*(18.*stab + 32.7*(1.-stab)) ! L & Y eq. (6c-6d) 980 !! 981 !! 982 !! Shifting the neutral 10m transfer coefficients to (zu,zeta_u) : 983 xct = 1. + sqrt_Cd_n10/kappa*(log(zu/10.) - zpsi_m) ! L & Y eq. (10a) 984 Cd = Cd_n10/(xct*xct) ; sqrt_Cd = sqrt(Cd) 785 ! Update neutral wind speed at 10m and neutral Cd at 10m (L&Y 2004 eq. 9a)... 786 ! In very rare low-wind conditions, the old way of estimating the 787 ! neutral wind speed at 10m leads to a negative value that causes the code 788 ! to crash. To prevent this a threshold of 0.25m/s is imposed. 789 ztmp0 = MAX( 0.25 , U_zu/(1. + sqrt_Cd_n10/vkarmn*(LOG(zu/10.) - zpsi_m_u)) ) ! U_n10 790 ztmp0 = cd_neutral_10m(ztmp0) ! Cd_n10 791 sqrt_Cd_n10 = sqrt(ztmp0) 792 793 Ce_n10 = 1.e-3 * (34.6 * sqrt_Cd_n10) ! L&Y 2004 eq. (6b) 794 stab = 0.5 + sign(0.5,zeta_u) ! update stability 795 Ch_n10 = 1.e-3*sqrt_Cd_n10*(18.*stab + 32.7*(1. - stab)) ! L&Y 2004 eq. (6c-6d) 796 797 !! Update of transfer coefficients: 798 ztmp1 = 1. + sqrt_Cd_n10/vkarmn*(LOG(zu/10.) - zpsi_m_u) ! L&Y 2004 eq. (10a) 799 Cd = ztmp0 / ( ztmp1*ztmp1 ) 800 sqrt_Cd = SQRT( Cd ) 985 801 ENDIF 986 !! 987 xlogt = log(zu/10.) - zpsi_hu 988 !! 989 xct = 1. + Ch_n10*xlogt/kappa/sqrt_Cd_n10 ! L & Y eq. (10b) 990 Ch = Ch_n10*sqrt_Cd/sqrt_Cd_n10/xct 991 !! 992 xct = 1. + Ce_n10*xlogt/kappa/sqrt_Cd_n10 ! L & Y eq. (10c) 993 Ce = Ce_n10*sqrt_Cd/sqrt_Cd_n10/xct 994 !! 995 !! 802 ! 803 ztmp0 = (LOG(zu/10.) - zpsi_h_u) / vkarmn / sqrt_Cd_n10 804 ztmp2 = sqrt_Cd / sqrt_Cd_n10 805 ztmp1 = 1. + Ch_n10*ztmp0 806 Ch = Ch_n10*ztmp2 / ztmp1 ! L&Y 2004 eq. (10b) 807 ! 808 ztmp1 = 1. + Ce_n10*ztmp0 809 Ce = Ce_n10*ztmp2 / ztmp1 ! L&Y 2004 eq. (10c) 810 ! 996 811 END DO 997 !! 998 CALL wrk_dealloc( jpi,jpj, dU10, dT, dq, Cd_n10, Ce_n10, Ch_n10, sqrt_Cd_n10, sqrt_Cd, L ) 999 CALL wrk_dealloc( jpi,jpj, T_vpot, T_star, q_star, U_star, zeta_u, zeta_t, U_n10 ) 1000 CALL wrk_dealloc( jpi,jpj, xlogt, xct, zpsi_hu, zpsi_ht, zpsi_m ) 1001 CALL wrk_dealloc( jpi,jpj, stab ) ! interger 1002 ! 1003 IF( nn_timing == 1 ) CALL timing_stop('TURB_CORE_2Z') 1004 ! 1005 END SUBROUTINE TURB_CORE_2Z 1006 1007 1008 FUNCTION psi_m(zta) !! Psis, L & Y eq. (8c), (8d), (8e) 812 813 CALL wrk_dealloc( jpi,jpj, U_zu, Ce_n10, Ch_n10, sqrt_Cd_n10, sqrt_Cd ) 814 CALL wrk_dealloc( jpi,jpj, zeta_u, stab ) 815 CALL wrk_dealloc( jpi,jpj, zpsi_h_u, zpsi_m_u, ztmp0, ztmp1, ztmp2 ) 816 817 IF( .NOT. l_zt_equal_zu ) CALL wrk_dealloc( jpi,jpj, zeta_t ) 818 819 IF( nn_timing == 1 ) CALL timing_stop('turb_core_2z') 820 ! 821 END SUBROUTINE turb_core_2z 822 823 824 FUNCTION cd_neutral_10m( zw10 ) 825 !!---------------------------------------------------------------------- 826 !! Estimate of the neutral drag coefficient at 10m as a function 827 !! of neutral wind speed at 10m 828 !! 829 !! Origin: Large & Yeager 2008 eq.(11a) and eq.(11b) 830 !! 831 !! Author: L. Brodeau, june 2014 832 !!---------------------------------------------------------------------- 833 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: zw10 ! scalar wind speed at 10m (m/s) 834 REAL(wp), DIMENSION(jpi,jpj) :: cd_neutral_10m 835 ! 836 REAL(wp), DIMENSION(:,:), POINTER :: rgt33 837 !!---------------------------------------------------------------------- 838 ! 839 CALL wrk_alloc( jpi,jpj, rgt33 ) 840 ! 841 !! When wind speed > 33 m/s => Cyclone conditions => special treatment 842 rgt33 = 0.5_wp + SIGN( 0.5_wp, (zw10 - 33._wp) ) ! If zw10 < 33. => 0, else => 1 843 cd_neutral_10m = 1.e-3 * ( & 844 & (1._wp - rgt33)*( 2.7_wp/zw10 + 0.142_wp + zw10/13.09_wp - 3.14807E-10*zw10**6) & ! zw10< 33. 845 & + rgt33 * 2.34 ) ! zw10 >= 33. 846 ! 847 CALL wrk_dealloc( jpi,jpj, rgt33) 848 ! 849 END FUNCTION cd_neutral_10m 850 851 852 FUNCTION psi_m(pta) !! Psis, L&Y 2004 eq. (8c), (8d), (8e) 1009 853 !------------------------------------------------------------------------------- 1010 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: zta 1011 1012 REAL(wp), PARAMETER :: pi = 3.141592653589793_wp 854 ! universal profile stability function for momentum 855 !------------------------------------------------------------------------------- 856 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pta 857 ! 1013 858 REAL(wp), DIMENSION(jpi,jpj) :: psi_m 1014 859 REAL(wp), DIMENSION(:,:), POINTER :: X2, X, stabit 1015 860 !------------------------------------------------------------------------------- 1016 861 ! 1017 862 CALL wrk_alloc( jpi,jpj, X2, X, stabit ) 1018 1019 X2 = sqrt(abs(1. - 16.*zta)) ; X2 = max(X2 , 1.0) ; X = sqrt(X2)1020 stabit = 0.5 + sign(0.5,zta)1021 psi_m = -5.* zta*stabit & ! Stable1022 & + (1. - stabit)*(2 *log((1. + X)/2) + log((1. + X2)/2) - 2*atan(X) + pi/2) ! Unstable1023 863 ! 864 X2 = SQRT( ABS( 1. - 16.*pta ) ) ; X2 = MAX( X2 , 1. ) ; X = SQRT( X2 ) 865 stabit = 0.5 + SIGN( 0.5 , pta ) 866 psi_m = -5.*pta*stabit & ! Stable 867 & + (1. - stabit)*(2.*LOG((1. + X)*0.5) + LOG((1. + X2)*0.5) - 2.*ATAN(X) + rpi*0.5) ! Unstable 868 ! 1024 869 CALL wrk_dealloc( jpi,jpj, X2, X, stabit ) 1025 870 ! 1026 1027 1028 1029 FUNCTION psi_h( zta ) !! Psis, L & Yeq. (8c), (8d), (8e)871 END FUNCTION psi_m 872 873 874 FUNCTION psi_h( pta ) !! Psis, L&Y 2004 eq. (8c), (8d), (8e) 1030 875 !------------------------------------------------------------------------------- 1031 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: zta 876 ! universal profile stability function for temperature and humidity 877 !------------------------------------------------------------------------------- 878 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pta 1032 879 ! 1033 880 REAL(wp), DIMENSION(jpi,jpj) :: psi_h 1034 REAL(wp), DIMENSION(:,:), POINTER :: X2, X, stabit881 REAL(wp), DIMENSION(:,:), POINTER :: X2, X, stabit 1035 882 !------------------------------------------------------------------------------- 1036 883 ! 1037 884 CALL wrk_alloc( jpi,jpj, X2, X, stabit ) 1038 1039 X2 = sqrt(abs(1. - 16.*zta)) ; X2 = max(X2 , 1.) ; X = sqrt(X2)1040 stabit = 0.5 + sign(0.5,zta)1041 psi_h = -5.* zta*stabit& ! Stable1042 & + (1. - stabit)*(2.* log( (1. + X2)/2. ))! Unstable1043 885 ! 886 X2 = SQRT( ABS( 1. - 16.*pta ) ) ; X2 = MAX( X2 , 1. ) ; X = SQRT( X2 ) 887 stabit = 0.5 + SIGN( 0.5 , pta ) 888 psi_h = -5.*pta*stabit & ! Stable 889 & + (1. - stabit)*(2.*LOG( (1. + X2)*0.5 )) ! Unstable 890 ! 1044 891 CALL wrk_dealloc( jpi,jpj, X2, X, stabit ) 1045 892 ! 1046 1047 893 END FUNCTION psi_h 894 1048 895 !!====================================================================== 1049 896 END MODULE sbcblk_core -
branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/sbcblk_mfs.F90
- Property svn:keywords set to Id
r4624 r5837 46 46 !!---------------------------------------------------------------------- 47 47 !! NEMO/OPA 3.2 , LOCEAN-IPSL (2009) 48 !! $Id : sbcblk_mfs.F90 1730 2009-11-16 14:34:19Z poddo$48 !! $Id$ 49 49 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 50 50 !!---------------------------------------------------------------------- … … 82 82 !! - utau, vtau i- and j-component of the wind stress 83 83 !! - taum wind stress module at T-point 84 !! - wndm 10m wind module at T-point 84 !! - wndm 10m wind module at T-point over free ocean or leads in presence of sea-ice 85 85 !! - qns, qsr non-slor and solar heat flux 86 86 !! - emp evaporation minus precipitation … … 233 233 ! Interpolate utau, vtau into the grid_V and grid_V 234 234 !------------------------------------------------- 235 235 ! Note the use of 0.5*(2-umask) in order to unmask the stress along coastlines 236 ! Note the use of MAX(tmask(i,j),tmask(i+1,j) is to mask tau over ice shelves 236 237 DO jj = 1, jpjm1 237 238 DO ji = 1, fs_jpim1 238 239 utau(ji,jj) = 0.5 * ( 2. - umask(ji,jj,1) ) * ( utau(ji,jj) * tmask(ji,jj,1) & 239 & + utau(ji+1,jj) * tmask(ji+1,jj,1) ) 240 & + utau(ji+1,jj) * tmask(ji+1,jj,1) ) & 241 & * MAX(tmask(ji,jj,1),tmask(ji+1,jj ,1)) 240 242 vtau(ji,jj) = 0.5 * ( 2. - vmask(ji,jj,1) ) * ( vtau(ji,jj) * tmask(ji,jj,1) & 241 & + vtau(ji,jj+1) * tmask(ji,jj+1,1) ) 243 & + vtau(ji,jj+1) * tmask(ji,jj+1,1) ) & 244 & * MAX(tmask(ji,jj,1),tmask(ji ,jj+1,1)) 242 245 END DO 243 246 END DO -
branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/sbccpl.F90
r4624 r5837 9 9 !! 3.4 ! 2011_11 (C. Harris) more flexibility + multi-category fields 10 10 !!---------------------------------------------------------------------- 11 #if defined key_oasis3 || defined key_oasis412 !!----------------------------------------------------------------------13 !! 'key_oasis3' or 'key_oasis4' Coupled Ocean/Atmosphere formulation14 11 !!---------------------------------------------------------------------- 15 12 !! namsbc_cpl : coupled formulation namlist … … 24 21 USE sbc_oce ! Surface boundary condition: ocean fields 25 22 USE sbc_ice ! Surface boundary condition: ice fields 23 USE sbcapr 26 24 USE sbcdcy ! surface boundary condition: diurnal cycle 27 25 USE phycst ! physical constants 28 26 #if defined key_lim3 29 USE par_ice ! ice parameters30 27 USE ice ! ice variables 31 28 #endif … … 34 31 USE ice_2 ! ice variables 35 32 #endif 36 #if defined key_oasis337 33 USE cpl_oasis3 ! OASIS3 coupling 38 #endif39 #if defined key_oasis440 USE cpl_oasis4 ! OASIS4 coupling41 #endif42 34 USE geo2ocean ! 43 USE oce , ONLY : tsn, un, vn 35 USE oce , ONLY : tsn, un, vn, sshn, ub, vb, sshb, fraqsr_1lev 44 36 USE albedo ! 45 37 USE in_out_manager ! I/O manager … … 49 41 USE timing ! Timing 50 42 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 43 USE eosbn2 44 USE sbcrnf , ONLY : l_rnfcpl 51 45 #if defined key_cpl_carbon_cycle 52 46 USE p4zflx, ONLY : oce_co2 53 47 #endif 54 USE diaar5, ONLY : lk_diaar555 48 #if defined key_cice 56 49 USE ice_domain_size, only: ncat 57 50 #endif 51 #if defined key_lim3 52 USE limthd_dh ! for CALL lim_thd_snwblow 53 #endif 54 58 55 IMPLICIT NONE 59 56 PRIVATE 60 57 58 PUBLIC sbc_cpl_init ! routine called by sbcmod.F90 61 59 PUBLIC sbc_cpl_rcv ! routine called by sbc_ice_lim(_2).F90 62 60 PUBLIC sbc_cpl_snd ! routine called by step.F90 63 61 PUBLIC sbc_cpl_ice_tau ! routine called by sbc_ice_lim(_2).F90 64 62 PUBLIC sbc_cpl_ice_flx ! routine called by sbc_ice_lim(_2).F90 63 PUBLIC sbc_cpl_alloc ! routine called in sbcice_cice.F90 65 64 66 65 INTEGER, PARAMETER :: jpr_otx1 = 1 ! 3 atmosphere-ocean stress components on grid 1 … … 97 96 INTEGER, PARAMETER :: jpr_topm = 32 ! topmeltn 98 97 INTEGER, PARAMETER :: jpr_botm = 33 ! botmeltn 99 INTEGER, PARAMETER :: jprcv = 33 ! total number of fields received 100 101 INTEGER, PARAMETER :: jps_fice = 1 ! ice fraction 98 INTEGER, PARAMETER :: jpr_sflx = 34 ! salt flux 99 INTEGER, PARAMETER :: jpr_toce = 35 ! ocean temperature 100 INTEGER, PARAMETER :: jpr_soce = 36 ! ocean salinity 101 INTEGER, PARAMETER :: jpr_ocx1 = 37 ! ocean current on grid 1 102 INTEGER, PARAMETER :: jpr_ocy1 = 38 ! 103 INTEGER, PARAMETER :: jpr_ssh = 39 ! sea surface height 104 INTEGER, PARAMETER :: jpr_fice = 40 ! ice fraction 105 INTEGER, PARAMETER :: jpr_e3t1st = 41 ! first T level thickness 106 INTEGER, PARAMETER :: jpr_fraqsr = 42 ! fraction of solar net radiation absorbed in the first ocean level 107 INTEGER, PARAMETER :: jprcv = 42 ! total number of fields received 108 109 INTEGER, PARAMETER :: jps_fice = 1 ! ice fraction sent to the atmosphere 102 110 INTEGER, PARAMETER :: jps_toce = 2 ! ocean temperature 103 111 INTEGER, PARAMETER :: jps_tice = 3 ! ice temperature … … 114 122 INTEGER, PARAMETER :: jps_ivz1 = 14 ! 115 123 INTEGER, PARAMETER :: jps_co2 = 15 116 INTEGER, PARAMETER :: jpsnd = 15 ! total number of fields sended 124 INTEGER, PARAMETER :: jps_soce = 16 ! ocean salinity 125 INTEGER, PARAMETER :: jps_ssh = 17 ! sea surface height 126 INTEGER, PARAMETER :: jps_qsroce = 18 ! Qsr above the ocean 127 INTEGER, PARAMETER :: jps_qnsoce = 19 ! Qns above the ocean 128 INTEGER, PARAMETER :: jps_oemp = 20 ! ocean freshwater budget (evap - precip) 129 INTEGER, PARAMETER :: jps_sflx = 21 ! salt flux 130 INTEGER, PARAMETER :: jps_otx1 = 22 ! 2 atmosphere-ocean stress components on grid 1 131 INTEGER, PARAMETER :: jps_oty1 = 23 ! 132 INTEGER, PARAMETER :: jps_rnf = 24 ! runoffs 133 INTEGER, PARAMETER :: jps_taum = 25 ! wind stress module 134 INTEGER, PARAMETER :: jps_fice2 = 26 ! ice fraction sent to OPA (by SAS when doing SAS-OPA coupling) 135 INTEGER, PARAMETER :: jps_e3t1st = 27 ! first level depth (vvl) 136 INTEGER, PARAMETER :: jps_fraqsr = 28 ! fraction of solar net radiation absorbed in the first ocean level 137 INTEGER, PARAMETER :: jpsnd = 28 ! total number of fields sended 117 138 118 139 ! !!** namelist namsbc_cpl ** … … 129 150 TYPE(FLD_C) :: sn_rcv_w10m, sn_rcv_taumod, sn_rcv_tau, sn_rcv_dqnsdt, sn_rcv_qsr, sn_rcv_qns, sn_rcv_emp, sn_rcv_rnf 130 151 TYPE(FLD_C) :: sn_rcv_cal, sn_rcv_iceflx, sn_rcv_co2 131 152 ! Other namelist parameters ! 153 INTEGER :: nn_cplmodel ! Maximum number of models to/from which NEMO is potentialy sending/receiving data 154 LOGICAL :: ln_usecplmask ! use a coupling mask file to merge data received from several models 155 ! -> file cplmask.nc with the float variable called cplmask (jpi,jpj,nn_cplmodel) 132 156 TYPE :: DYNARR 133 157 REAL(wp), POINTER, DIMENSION(:,:,:) :: z3 … … 140 164 INTEGER , ALLOCATABLE, SAVE, DIMENSION( :) :: nrcvinfo ! OASIS info argument 141 165 142 #if ! defined key_lim2 && ! defined key_lim3143 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: u_ice, v_ice,fr1_i0,fr2_i0 ! jpi, jpj144 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: tn_ice, alb_ice, qns_ice, dqns_ice ! (jpi,jpj,jpl)145 #endif146 147 #if defined key_cice148 INTEGER, PARAMETER :: jpl = ncat149 #elif ! defined key_lim2 && ! defined key_lim3150 INTEGER, PARAMETER :: jpl = 1151 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: emp_ice152 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: qsr_ice153 #endif154 155 #if ! defined key_lim3 && ! defined key_cice156 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: a_i157 #endif158 159 #if ! defined key_lim3160 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: ht_i, ht_s161 #endif162 163 #if ! defined key_cice164 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: topmelt, botmelt165 #endif166 167 166 !! Substitution 167 # include "domzgr_substitute.h90" 168 168 # include "vectopt_loop_substitute.h90" 169 169 !!---------------------------------------------------------------------- … … 179 179 !! *** FUNCTION sbc_cpl_alloc *** 180 180 !!---------------------------------------------------------------------- 181 INTEGER :: ierr( 4),jn181 INTEGER :: ierr(3) 182 182 !!---------------------------------------------------------------------- 183 183 ierr(:) = 0 184 184 ! 185 185 ALLOCATE( albedo_oce_mix(jpi,jpj), nrcvinfo(jprcv), STAT=ierr(1) ) 186 ! 187 #if ! defined key_lim2 && ! defined key_lim3 188 ! quick patch to be able to run the coupled model without sea-ice... 189 ALLOCATE( u_ice(jpi,jpj) , fr1_i0(jpi,jpj) , tn_ice (jpi,jpj,1) , & 190 v_ice(jpi,jpj) , fr2_i0(jpi,jpj) , alb_ice(jpi,jpj,1), & 191 emp_ice(jpi,jpj) , qns_ice(jpi,jpj,1) , dqns_ice(jpi,jpj,1) , STAT=ierr(2) ) 186 187 #if ! defined key_lim3 && ! defined key_lim2 && ! defined key_cice 188 ALLOCATE( a_i(jpi,jpj,1) , STAT=ierr(2) ) ! used in sbcice_if.F90 (done here as there is no sbc_ice_if_init) 192 189 #endif 193 194 #if ! defined key_lim3 && ! defined key_cice 195 ALLOCATE( a_i(jpi,jpj,jpl) , STAT=ierr(3) ) 196 #endif 197 198 #if defined key_cice || defined key_lim2 199 ALLOCATE( ht_i(jpi,jpj,jpl) , ht_s(jpi,jpj,jpl) , STAT=ierr(4) ) 200 #endif 190 ALLOCATE( xcplmask(jpi,jpj,0:nn_cplmodel) , STAT=ierr(3) ) 191 ! 201 192 sbc_cpl_alloc = MAXVAL( ierr ) 202 193 IF( lk_mpp ) CALL mpp_sum ( sbc_cpl_alloc ) … … 210 201 !! *** ROUTINE sbc_cpl_init *** 211 202 !! 212 !! ** Purpose : Initialisation of send and rec ieved information from203 !! ** Purpose : Initialisation of send and received information from 213 204 !! the atmospheric component 214 205 !! … … 218 209 !! * initialise the OASIS coupler 219 210 !!---------------------------------------------------------------------- 220 INTEGER, INTENT(in) :: k_ice ! ice management in the sbc (=0/1/2/3)211 INTEGER, INTENT(in) :: k_ice ! ice management in the sbc (=0/1/2/3) 221 212 !! 222 213 INTEGER :: jn ! dummy loop index 223 214 INTEGER :: ios ! Local integer output status for namelist read 215 INTEGER :: inum 224 216 REAL(wp), POINTER, DIMENSION(:,:) :: zacs, zaos 225 217 !! 226 NAMELIST/namsbc_cpl/ sn_snd_temp, sn_snd_alb , sn_snd_thick, sn_snd_crt , sn_snd_co2, & 227 & sn_rcv_w10m, sn_rcv_taumod, sn_rcv_tau , sn_rcv_dqnsdt, sn_rcv_qsr, & 228 & sn_rcv_qns , sn_rcv_emp , sn_rcv_rnf , sn_rcv_cal , sn_rcv_iceflx , sn_rcv_co2 218 NAMELIST/namsbc_cpl/ sn_snd_temp, sn_snd_alb , sn_snd_thick, sn_snd_crt , sn_snd_co2, & 219 & sn_rcv_w10m, sn_rcv_taumod, sn_rcv_tau , sn_rcv_dqnsdt, sn_rcv_qsr, & 220 & sn_rcv_qns , sn_rcv_emp , sn_rcv_rnf , sn_rcv_cal , sn_rcv_iceflx, & 221 & sn_rcv_co2 , nn_cplmodel , ln_usecplmask 229 222 !!--------------------------------------------------------------------- 230 223 ! … … 250 243 WRITE(numout,*)'sbc_cpl_init : namsbc_cpl namelist ' 251 244 WRITE(numout,*)'~~~~~~~~~~~~' 245 ENDIF 246 IF( lwp .AND. ln_cpl ) THEN ! control print 252 247 WRITE(numout,*)' received fields (mutiple ice categogies)' 253 248 WRITE(numout,*)' 10m wind module = ', TRIM(sn_rcv_w10m%cldes ), ' (', TRIM(sn_rcv_w10m%clcat ), ')' … … 274 269 WRITE(numout,*)' - mesh = ', sn_snd_crt%clvgrd 275 270 WRITE(numout,*)' oce co2 flux = ', TRIM(sn_snd_co2%cldes ), ' (', TRIM(sn_snd_co2%clcat ), ')' 271 WRITE(numout,*)' nn_cplmodel = ', nn_cplmodel 272 WRITE(numout,*)' ln_usecplmask = ', ln_usecplmask 276 273 ENDIF 277 274 … … 391 388 srcv(jpr_oemp)%clname = 'OOEvaMPr' ! ocean water budget = ocean Evap - ocean precip 392 389 SELECT CASE( TRIM( sn_rcv_emp%cldes ) ) 390 CASE( 'none' ) ! nothing to do 393 391 CASE( 'oce only' ) ; srcv( jpr_oemp )%laction = .TRUE. 394 392 CASE( 'conservative' ) … … 402 400 ! ! Runoffs & Calving ! 403 401 ! ! ------------------------- ! 404 srcv(jpr_rnf )%clname = 'O_Runoff' ; IF( TRIM( sn_rcv_rnf%cldes ) == 'coupled' ) srcv(jpr_rnf)%laction = .TRUE. 405 ! This isn't right - really just want ln_rnf_emp changed 406 ! IF( TRIM( sn_rcv_rnf%cldes ) == 'climato' ) THEN ; ln_rnf = .TRUE. 407 ! ELSE ; ln_rnf = .FALSE. 408 ! ENDIF 402 srcv(jpr_rnf )%clname = 'O_Runoff' 403 IF( TRIM( sn_rcv_rnf%cldes ) == 'coupled' ) THEN 404 srcv(jpr_rnf)%laction = .TRUE. 405 l_rnfcpl = .TRUE. ! -> no need to read runoffs in sbcrnf 406 ln_rnf = nn_components /= jp_iam_sas ! -> force to go through sbcrnf if not sas 407 IF(lwp) WRITE(numout,*) 408 IF(lwp) WRITE(numout,*) ' runoffs received from oasis -> force ln_rnf = ', ln_rnf 409 ENDIF 410 ! 409 411 srcv(jpr_cal )%clname = 'OCalving' ; IF( TRIM( sn_rcv_cal%cldes ) == 'coupled' ) srcv(jpr_cal)%laction = .TRUE. 410 412 … … 416 418 srcv(jpr_qnsmix)%clname = 'O_QnsMix' 417 419 SELECT CASE( TRIM( sn_rcv_qns%cldes ) ) 420 CASE( 'none' ) ! nothing to do 418 421 CASE( 'oce only' ) ; srcv( jpr_qnsoce )%laction = .TRUE. 419 422 CASE( 'conservative' ) ; srcv( (/jpr_qnsice, jpr_qnsmix/) )%laction = .TRUE. … … 431 434 srcv(jpr_qsrmix)%clname = 'O_QsrMix' 432 435 SELECT CASE( TRIM( sn_rcv_qsr%cldes ) ) 436 CASE( 'none' ) ! nothing to do 433 437 CASE( 'oce only' ) ; srcv( jpr_qsroce )%laction = .TRUE. 434 438 CASE( 'conservative' ) ; srcv( (/jpr_qsrice, jpr_qsrmix/) )%laction = .TRUE. … … 446 450 ! 447 451 ! non solar sensitivity mandatory for LIM ice model 448 IF( TRIM( sn_rcv_dqnsdt%cldes ) == 'none' .AND. k_ice /= 0 .AND. k_ice /= 4 ) &452 IF( TRIM( sn_rcv_dqnsdt%cldes ) == 'none' .AND. k_ice /= 0 .AND. k_ice /= 4 .AND. nn_components /= jp_iam_sas ) & 449 453 CALL ctl_stop( 'sbc_cpl_init: sn_rcv_dqnsdt%cldes must be coupled in namsbc_cpl namelist' ) 450 454 ! non solar sensitivity mandatory for mixed oce-ice solar radiation coupling technique … … 479 483 srcv(jpr_topm:jpr_botm)%laction = .TRUE. 480 484 ENDIF 481 482 ! Allocate all parts of frcv used for received fields 485 ! ! ------------------------------- ! 486 ! ! OPA-SAS coupling - rcv by opa ! 487 ! ! ------------------------------- ! 488 srcv(jpr_sflx)%clname = 'O_SFLX' 489 srcv(jpr_fice)%clname = 'RIceFrc' 490 ! 491 IF( nn_components == jp_iam_opa ) THEN ! OPA coupled to SAS via OASIS: force received field by OPA (sent by SAS) 492 srcv(:)%laction = .FALSE. ! force default definition in case of opa <-> sas coupling 493 srcv(:)%clgrid = 'T' ! force default definition in case of opa <-> sas coupling 494 srcv(:)%nsgn = 1. ! force default definition in case of opa <-> sas coupling 495 srcv( (/jpr_qsroce, jpr_qnsoce, jpr_oemp, jpr_sflx, jpr_fice, jpr_otx1, jpr_oty1, jpr_taum/) )%laction = .TRUE. 496 srcv(jpr_otx1)%clgrid = 'U' ! oce components given at U-point 497 srcv(jpr_oty1)%clgrid = 'V' ! and V-point 498 ! Vectors: change of sign at north fold ONLY if on the local grid 499 srcv( (/jpr_otx1,jpr_oty1/) )%nsgn = -1. 500 sn_rcv_tau%clvgrd = 'U,V' 501 sn_rcv_tau%clvor = 'local grid' 502 sn_rcv_tau%clvref = 'spherical' 503 sn_rcv_emp%cldes = 'oce only' 504 ! 505 IF(lwp) THEN ! control print 506 WRITE(numout,*) 507 WRITE(numout,*)' Special conditions for SAS-OPA coupling ' 508 WRITE(numout,*)' OPA component ' 509 WRITE(numout,*) 510 WRITE(numout,*)' received fields from SAS component ' 511 WRITE(numout,*)' ice cover ' 512 WRITE(numout,*)' oce only EMP ' 513 WRITE(numout,*)' salt flux ' 514 WRITE(numout,*)' mixed oce-ice solar flux ' 515 WRITE(numout,*)' mixed oce-ice non solar flux ' 516 WRITE(numout,*)' wind stress U,V on local grid and sperical coordinates ' 517 WRITE(numout,*)' wind stress module' 518 WRITE(numout,*) 519 ENDIF 520 ENDIF 521 ! ! -------------------------------- ! 522 ! ! OPA-SAS coupling - rcv by sas ! 523 ! ! -------------------------------- ! 524 srcv(jpr_toce )%clname = 'I_SSTSST' 525 srcv(jpr_soce )%clname = 'I_SSSal' 526 srcv(jpr_ocx1 )%clname = 'I_OCurx1' 527 srcv(jpr_ocy1 )%clname = 'I_OCury1' 528 srcv(jpr_ssh )%clname = 'I_SSHght' 529 srcv(jpr_e3t1st)%clname = 'I_E3T1st' 530 srcv(jpr_fraqsr)%clname = 'I_FraQsr' 531 ! 532 IF( nn_components == jp_iam_sas ) THEN 533 IF( .NOT. ln_cpl ) srcv(:)%laction = .FALSE. ! force default definition in case of opa <-> sas coupling 534 IF( .NOT. ln_cpl ) srcv(:)%clgrid = 'T' ! force default definition in case of opa <-> sas coupling 535 IF( .NOT. ln_cpl ) srcv(:)%nsgn = 1. ! force default definition in case of opa <-> sas coupling 536 srcv( (/jpr_toce, jpr_soce, jpr_ssh, jpr_fraqsr, jpr_ocx1, jpr_ocy1/) )%laction = .TRUE. 537 srcv( jpr_e3t1st )%laction = lk_vvl 538 srcv(jpr_ocx1)%clgrid = 'U' ! oce components given at U-point 539 srcv(jpr_ocy1)%clgrid = 'V' ! and V-point 540 ! Vectors: change of sign at north fold ONLY if on the local grid 541 srcv(jpr_ocx1:jpr_ocy1)%nsgn = -1. 542 ! Change first letter to couple with atmosphere if already coupled OPA 543 ! this is nedeed as each variable name used in the namcouple must be unique: 544 ! for example O_Runoff received by OPA from SAS and therefore O_Runoff received by SAS from the Atmosphere 545 DO jn = 1, jprcv 546 IF ( srcv(jn)%clname(1:1) == "O" ) srcv(jn)%clname = "S"//srcv(jn)%clname(2:LEN(srcv(jn)%clname)) 547 END DO 548 ! 549 IF(lwp) THEN ! control print 550 WRITE(numout,*) 551 WRITE(numout,*)' Special conditions for SAS-OPA coupling ' 552 WRITE(numout,*)' SAS component ' 553 WRITE(numout,*) 554 IF( .NOT. ln_cpl ) THEN 555 WRITE(numout,*)' received fields from OPA component ' 556 ELSE 557 WRITE(numout,*)' Additional received fields from OPA component : ' 558 ENDIF 559 WRITE(numout,*)' sea surface temperature (Celcius) ' 560 WRITE(numout,*)' sea surface salinity ' 561 WRITE(numout,*)' surface currents ' 562 WRITE(numout,*)' sea surface height ' 563 WRITE(numout,*)' thickness of first ocean T level ' 564 WRITE(numout,*)' fraction of solar net radiation absorbed in the first ocean level' 565 WRITE(numout,*) 566 ENDIF 567 ENDIF 568 569 ! =================================================== ! 570 ! Allocate all parts of frcv used for received fields ! 571 ! =================================================== ! 483 572 DO jn = 1, jprcv 484 573 IF ( srcv(jn)%laction ) ALLOCATE( frcv(jn)%z3(jpi,jpj,srcv(jn)%nct) ) 485 574 END DO 486 575 ! Allocate taum part of frcv which is used even when not received as coupling field 487 IF ( .NOT. srcv(jpr_taum)%laction ) ALLOCATE( frcv(jpr_taum)%z3(jpi,jpj,srcv(jn)%nct) ) 576 IF ( .NOT. srcv(jpr_taum)%laction ) ALLOCATE( frcv(jpr_taum)%z3(jpi,jpj,srcv(jpr_taum)%nct) ) 577 ! Allocate w10m part of frcv which is used even when not received as coupling field 578 IF ( .NOT. srcv(jpr_w10m)%laction ) ALLOCATE( frcv(jpr_w10m)%z3(jpi,jpj,srcv(jpr_w10m)%nct) ) 579 ! Allocate jpr_otx1 part of frcv which is used even when not received as coupling field 580 IF ( .NOT. srcv(jpr_otx1)%laction ) ALLOCATE( frcv(jpr_otx1)%z3(jpi,jpj,srcv(jpr_otx1)%nct) ) 581 IF ( .NOT. srcv(jpr_oty1)%laction ) ALLOCATE( frcv(jpr_oty1)%z3(jpi,jpj,srcv(jpr_oty1)%nct) ) 488 582 ! Allocate itx1 and ity1 as they are used in sbc_cpl_ice_tau even if srcv(jpr_itx1)%laction = .FALSE. 489 583 IF( k_ice /= 0 ) THEN 490 IF ( .NOT. srcv(jpr_itx1)%laction ) ALLOCATE( frcv(jpr_itx1)%z3(jpi,jpj,srcv(j n)%nct) )491 IF ( .NOT. srcv(jpr_ity1)%laction ) ALLOCATE( frcv(jpr_ity1)%z3(jpi,jpj,srcv(j n)%nct) )584 IF ( .NOT. srcv(jpr_itx1)%laction ) ALLOCATE( frcv(jpr_itx1)%z3(jpi,jpj,srcv(jpr_itx1)%nct) ) 585 IF ( .NOT. srcv(jpr_ity1)%laction ) ALLOCATE( frcv(jpr_ity1)%z3(jpi,jpj,srcv(jpr_ity1)%nct) ) 492 586 END IF 493 587 … … 509 603 ssnd(jps_tmix)%clname = 'O_TepMix' 510 604 SELECT CASE( TRIM( sn_snd_temp%cldes ) ) 511 CASE( 'none' ) ! nothing to do512 CASE( 'oce only' ) ; ssnd( jps_toce)%laction = .TRUE.513 CASE( ' weighted oce and ice' )605 CASE( 'none' ) ! nothing to do 606 CASE( 'oce only' ) ; ssnd( jps_toce )%laction = .TRUE. 607 CASE( 'oce and ice' , 'weighted oce and ice' ) 514 608 ssnd( (/jps_toce, jps_tice/) )%laction = .TRUE. 515 609 IF ( TRIM( sn_snd_temp%clcat ) == 'yes' ) ssnd(jps_tice)%nct = jpl 516 CASE( 'mixed oce-ice' ) ; ssnd( jps_tmix)%laction = .TRUE.610 CASE( 'mixed oce-ice' ) ; ssnd( jps_tmix )%laction = .TRUE. 517 611 CASE default ; CALL ctl_stop( 'sbc_cpl_init: wrong definition of sn_snd_temp%cldes' ) 518 612 END SELECT 519 613 520 614 ! ! ------------------------- ! 521 615 ! ! Albedo ! … … 524 618 ssnd(jps_albmix)%clname = 'O_AlbMix' 525 619 SELECT CASE( TRIM( sn_snd_alb%cldes ) ) 526 CASE( 'none' )! nothing to do527 CASE( ' weighted ice' ) ;ssnd(jps_albice)%laction = .TRUE.528 CASE( 'mixed oce-ice' ) ;ssnd(jps_albmix)%laction = .TRUE.620 CASE( 'none' ) ! nothing to do 621 CASE( 'ice' , 'weighted ice' ) ; ssnd(jps_albice)%laction = .TRUE. 622 CASE( 'mixed oce-ice' ) ; ssnd(jps_albmix)%laction = .TRUE. 529 623 CASE default ; CALL ctl_stop( 'sbc_cpl_init: wrong definition of sn_snd_alb%cldes' ) 530 624 END SELECT … … 550 644 IF ( TRIM( sn_snd_thick%clcat ) == 'yes' ) ssnd(jps_fice)%nct = jpl 551 645 ENDIF 552 646 553 647 SELECT CASE ( TRIM( sn_snd_thick%cldes ) ) 554 648 CASE( 'none' ) ! nothing to do … … 557 651 IF ( TRIM( sn_snd_thick%clcat ) == 'yes' ) THEN 558 652 ssnd(jps_hice:jps_hsnw)%nct = jpl 559 ELSE560 IF ( jpl > 1 ) THEN561 CALL ctl_stop( 'sbc_cpl_init: use weighted ice and snow option for sn_snd_thick%cldes if not exchanging category fields' )562 ENDIF563 653 ENDIF 564 654 CASE ( 'weighted ice and snow' ) … … 599 689 ! ! ------------------------- ! 600 690 ssnd(jps_co2)%clname = 'O_CO2FLX' ; IF( TRIM(sn_snd_co2%cldes) == 'coupled' ) ssnd(jps_co2 )%laction = .TRUE. 691 692 ! ! ------------------------------- ! 693 ! ! OPA-SAS coupling - snd by opa ! 694 ! ! ------------------------------- ! 695 ssnd(jps_ssh )%clname = 'O_SSHght' 696 ssnd(jps_soce )%clname = 'O_SSSal' 697 ssnd(jps_e3t1st)%clname = 'O_E3T1st' 698 ssnd(jps_fraqsr)%clname = 'O_FraQsr' 699 ! 700 IF( nn_components == jp_iam_opa ) THEN 701 ssnd(:)%laction = .FALSE. ! force default definition in case of opa <-> sas coupling 702 ssnd( (/jps_toce, jps_soce, jps_ssh, jps_fraqsr, jps_ocx1, jps_ocy1/) )%laction = .TRUE. 703 ssnd( jps_e3t1st )%laction = lk_vvl 704 ! vector definition: not used but cleaner... 705 ssnd(jps_ocx1)%clgrid = 'U' ! oce components given at U-point 706 ssnd(jps_ocy1)%clgrid = 'V' ! and V-point 707 sn_snd_crt%clvgrd = 'U,V' 708 sn_snd_crt%clvor = 'local grid' 709 sn_snd_crt%clvref = 'spherical' 710 ! 711 IF(lwp) THEN ! control print 712 WRITE(numout,*) 713 WRITE(numout,*)' sent fields to SAS component ' 714 WRITE(numout,*)' sea surface temperature (T before, Celcius) ' 715 WRITE(numout,*)' sea surface salinity ' 716 WRITE(numout,*)' surface currents U,V on local grid and spherical coordinates' 717 WRITE(numout,*)' sea surface height ' 718 WRITE(numout,*)' thickness of first ocean T level ' 719 WRITE(numout,*)' fraction of solar net radiation absorbed in the first ocean level' 720 WRITE(numout,*) 721 ENDIF 722 ENDIF 723 ! ! ------------------------------- ! 724 ! ! OPA-SAS coupling - snd by sas ! 725 ! ! ------------------------------- ! 726 ssnd(jps_sflx )%clname = 'I_SFLX' 727 ssnd(jps_fice2 )%clname = 'IIceFrc' 728 ssnd(jps_qsroce)%clname = 'I_QsrOce' 729 ssnd(jps_qnsoce)%clname = 'I_QnsOce' 730 ssnd(jps_oemp )%clname = 'IOEvaMPr' 731 ssnd(jps_otx1 )%clname = 'I_OTaux1' 732 ssnd(jps_oty1 )%clname = 'I_OTauy1' 733 ssnd(jps_rnf )%clname = 'I_Runoff' 734 ssnd(jps_taum )%clname = 'I_TauMod' 735 ! 736 IF( nn_components == jp_iam_sas ) THEN 737 IF( .NOT. ln_cpl ) ssnd(:)%laction = .FALSE. ! force default definition in case of opa <-> sas coupling 738 ssnd( (/jps_qsroce, jps_qnsoce, jps_oemp, jps_fice2, jps_sflx, jps_otx1, jps_oty1, jps_taum/) )%laction = .TRUE. 739 ! 740 ! Change first letter to couple with atmosphere if already coupled with sea_ice 741 ! this is nedeed as each variable name used in the namcouple must be unique: 742 ! for example O_SSTSST sent by OPA to SAS and therefore S_SSTSST sent by SAS to the Atmosphere 743 DO jn = 1, jpsnd 744 IF ( ssnd(jn)%clname(1:1) == "O" ) ssnd(jn)%clname = "S"//ssnd(jn)%clname(2:LEN(ssnd(jn)%clname)) 745 END DO 746 ! 747 IF(lwp) THEN ! control print 748 WRITE(numout,*) 749 IF( .NOT. ln_cpl ) THEN 750 WRITE(numout,*)' sent fields to OPA component ' 751 ELSE 752 WRITE(numout,*)' Additional sent fields to OPA component : ' 753 ENDIF 754 WRITE(numout,*)' ice cover ' 755 WRITE(numout,*)' oce only EMP ' 756 WRITE(numout,*)' salt flux ' 757 WRITE(numout,*)' mixed oce-ice solar flux ' 758 WRITE(numout,*)' mixed oce-ice non solar flux ' 759 WRITE(numout,*)' wind stress U,V components' 760 WRITE(numout,*)' wind stress module' 761 ENDIF 762 ENDIF 763 601 764 ! 602 765 ! ================================ ! … … 604 767 ! ================================ ! 605 768 606 CALL cpl_prism_define(jprcv, jpsnd) 607 ! 608 IF( ln_dm2dc .AND. ( cpl_prism_freq( jpr_qsroce ) + cpl_prism_freq( jpr_qsrmix ) /= 86400 ) ) & 769 CALL cpl_define(jprcv, jpsnd, nn_cplmodel) 770 771 IF (ln_usecplmask) THEN 772 xcplmask(:,:,:) = 0. 773 CALL iom_open( 'cplmask', inum ) 774 CALL iom_get( inum, jpdom_unknown, 'cplmask', xcplmask(1:nlci,1:nlcj,1:nn_cplmodel), & 775 & kstart = (/ mig(1),mjg(1),1 /), kcount = (/ nlci,nlcj,nn_cplmodel /) ) 776 CALL iom_close( inum ) 777 ELSE 778 xcplmask(:,:,:) = 1. 779 ENDIF 780 xcplmask(:,:,0) = 1. - SUM( xcplmask(:,:,1:nn_cplmodel), dim = 3 ) 781 ! 782 ncpl_qsr_freq = cpl_freq( 'O_QsrOce' ) + cpl_freq( 'O_QsrMix' ) + cpl_freq( 'I_QsrOce' ) + cpl_freq( 'I_QsrMix' ) 783 IF( ln_dm2dc .AND. ln_cpl .AND. ncpl_qsr_freq /= 86400 ) & 609 784 & CALL ctl_stop( 'sbc_cpl_init: diurnal cycle reconstruction (ln_dm2dc) needs daily couping for solar radiation' ) 785 ncpl_qsr_freq = 86400 / ncpl_qsr_freq 610 786 611 787 CALL wrk_dealloc( jpi,jpj, zacs, zaos ) … … 654 830 !! 655 831 !! ** Action : update utau, vtau ocean stress at U,V grid 656 !! taum, wndm wind stres and wind speed module at T-point 832 !! taum wind stress module at T-point 833 !! wndm wind speed module at T-point over free ocean or leads in presence of sea-ice 657 834 !! qns non solar heat fluxes including emp heat content (ocean only case) 658 835 !! and the latent heat flux of solid precip. melting … … 660 837 !! emp upward mass flux [evap. - precip. (- runoffs) (- calving)] (ocean only case) 661 838 !!---------------------------------------------------------------------- 662 INTEGER, INTENT(in) :: kt ! ocean model time step index 663 INTEGER, INTENT(in) :: k_fsbc ! frequency of sbc (-> ice model) computation 664 INTEGER, INTENT(in) :: k_ice ! ice management in the sbc (=0/1/2/3) 665 !! 666 LOGICAL :: llnewtx, llnewtau ! update wind stress components and module?? 839 INTEGER, INTENT(in) :: kt ! ocean model time step index 840 INTEGER, INTENT(in) :: k_fsbc ! frequency of sbc (-> ice model) computation 841 INTEGER, INTENT(in) :: k_ice ! ice management in the sbc (=0/1/2/3) 842 843 !! 844 LOGICAL :: llnewtx, llnewtau ! update wind stress components and module?? 667 845 INTEGER :: ji, jj, jn ! dummy loop indices 668 846 INTEGER :: isec ! number of seconds since nit000 (assuming rdttra did not change since nit000) … … 672 850 REAL(wp) :: zcdrag = 1.5e-3 ! drag coefficient 673 851 REAL(wp) :: zzx, zzy ! temporary variables 674 REAL(wp), POINTER, DIMENSION(:,:) :: ztx, zty 852 REAL(wp), POINTER, DIMENSION(:,:) :: ztx, zty, zmsk, zemp, zqns, zqsr 675 853 !!---------------------------------------------------------------------- 676 854 ! 677 855 IF( nn_timing == 1 ) CALL timing_start('sbc_cpl_rcv') 678 856 ! 679 CALL wrk_alloc( jpi,jpj, ztx, zty ) 680 681 IF( kt == nit000 ) CALL sbc_cpl_init( k_ice ) ! initialisation 682 683 ! ! Receive all the atmos. fields (including ice information) 684 isec = ( kt - nit000 ) * NINT( rdttra(1) ) ! date of exchanges 685 DO jn = 1, jprcv ! received fields sent by the atmosphere 686 IF( srcv(jn)%laction ) CALL cpl_prism_rcv( jn, isec, frcv(jn)%z3, nrcvinfo(jn) ) 857 CALL wrk_alloc( jpi,jpj, ztx, zty, zmsk, zemp, zqns, zqsr ) 858 ! 859 IF( ln_mixcpl ) zmsk(:,:) = 1. - xcplmask(:,:,0) 860 ! 861 ! ! ======================================================= ! 862 ! ! Receive all the atmos. fields (including ice information) 863 ! ! ======================================================= ! 864 isec = ( kt - nit000 ) * NINT( rdttra(1) ) ! date of exchanges 865 DO jn = 1, jprcv ! received fields sent by the atmosphere 866 IF( srcv(jn)%laction ) CALL cpl_rcv( jn, isec, frcv(jn)%z3, xcplmask(:,:,1:nn_cplmodel), nrcvinfo(jn) ) 687 867 END DO 688 868 … … 744 924 ! 745 925 ENDIF 746 747 926 ! ! ========================= ! 748 927 ! ! wind stress module ! (taum) … … 773 952 ENDIF 774 953 ENDIF 775 954 ! 776 955 ! ! ========================= ! 777 956 ! ! 10 m wind speed ! (wndm) … … 786 965 !CDIR NOVERRCHK 787 966 DO ji = 1, jpi 788 wndm(ji,jj) = SQRT( frcv(jpr_taum)%z3(ji,jj,1) * zcoef )967 frcv(jpr_w10m)%z3(ji,jj,1) = SQRT( frcv(jpr_taum)%z3(ji,jj,1) * zcoef ) 789 968 END DO 790 969 END DO 791 970 ENDIF 792 ELSE793 IF ( nrcvinfo(jpr_w10m) == OASIS_Rcv ) wndm(:,:) = frcv(jpr_w10m)%z3(:,:,1)794 971 ENDIF 795 972 … … 798 975 IF( MOD( kt-1, k_fsbc ) == 0 ) THEN 799 976 ! 800 utau(:,:) = frcv(jpr_otx1)%z3(:,:,1) 801 vtau(:,:) = frcv(jpr_oty1)%z3(:,:,1) 802 taum(:,:) = frcv(jpr_taum)%z3(:,:,1) 977 IF( ln_mixcpl ) THEN 978 utau(:,:) = utau(:,:) * xcplmask(:,:,0) + frcv(jpr_otx1)%z3(:,:,1) * zmsk(:,:) 979 vtau(:,:) = vtau(:,:) * xcplmask(:,:,0) + frcv(jpr_oty1)%z3(:,:,1) * zmsk(:,:) 980 taum(:,:) = taum(:,:) * xcplmask(:,:,0) + frcv(jpr_taum)%z3(:,:,1) * zmsk(:,:) 981 wndm(:,:) = wndm(:,:) * xcplmask(:,:,0) + frcv(jpr_w10m)%z3(:,:,1) * zmsk(:,:) 982 ELSE 983 utau(:,:) = frcv(jpr_otx1)%z3(:,:,1) 984 vtau(:,:) = frcv(jpr_oty1)%z3(:,:,1) 985 taum(:,:) = frcv(jpr_taum)%z3(:,:,1) 986 wndm(:,:) = frcv(jpr_w10m)%z3(:,:,1) 987 ENDIF 803 988 CALL iom_put( "taum_oce", taum ) ! output wind stress module 804 989 ! … … 806 991 807 992 #if defined key_cpl_carbon_cycle 808 ! ! atmosph. CO2 (ppm) 993 ! ! ================== ! 994 ! ! atmosph. CO2 (ppm) ! 995 ! ! ================== ! 809 996 IF( srcv(jpr_co2)%laction ) atm_co2(:,:) = frcv(jpr_co2)%z3(:,:,1) 810 997 #endif 811 998 999 ! Fields received by SAS when OASIS coupling 1000 ! (arrays no more filled at sbcssm stage) 1001 ! ! ================== ! 1002 ! ! SSS ! 1003 ! ! ================== ! 1004 IF( srcv(jpr_soce)%laction ) THEN ! received by sas in case of opa <-> sas coupling 1005 sss_m(:,:) = frcv(jpr_soce)%z3(:,:,1) 1006 CALL iom_put( 'sss_m', sss_m ) 1007 ENDIF 1008 ! 1009 ! ! ================== ! 1010 ! ! SST ! 1011 ! ! ================== ! 1012 IF( srcv(jpr_toce)%laction ) THEN ! received by sas in case of opa <-> sas coupling 1013 sst_m(:,:) = frcv(jpr_toce)%z3(:,:,1) 1014 IF( srcv(jpr_soce)%laction .AND. ln_useCT ) THEN ! make sure that sst_m is the potential temperature 1015 sst_m(:,:) = eos_pt_from_ct( sst_m(:,:), sss_m(:,:) ) 1016 ENDIF 1017 ENDIF 1018 ! ! ================== ! 1019 ! ! SSH ! 1020 ! ! ================== ! 1021 IF( srcv(jpr_ssh )%laction ) THEN ! received by sas in case of opa <-> sas coupling 1022 ssh_m(:,:) = frcv(jpr_ssh )%z3(:,:,1) 1023 CALL iom_put( 'ssh_m', ssh_m ) 1024 ENDIF 1025 ! ! ================== ! 1026 ! ! surface currents ! 1027 ! ! ================== ! 1028 IF( srcv(jpr_ocx1)%laction ) THEN ! received by sas in case of opa <-> sas coupling 1029 ssu_m(:,:) = frcv(jpr_ocx1)%z3(:,:,1) 1030 ub (:,:,1) = ssu_m(:,:) ! will be used in sbcice_lim in the call of lim_sbc_tau 1031 CALL iom_put( 'ssu_m', ssu_m ) 1032 ENDIF 1033 IF( srcv(jpr_ocy1)%laction ) THEN 1034 ssv_m(:,:) = frcv(jpr_ocy1)%z3(:,:,1) 1035 vb (:,:,1) = ssv_m(:,:) ! will be used in sbcice_lim in the call of lim_sbc_tau 1036 CALL iom_put( 'ssv_m', ssv_m ) 1037 ENDIF 1038 ! ! ======================== ! 1039 ! ! first T level thickness ! 1040 ! ! ======================== ! 1041 IF( srcv(jpr_e3t1st )%laction ) THEN ! received by sas in case of opa <-> sas coupling 1042 e3t_m(:,:) = frcv(jpr_e3t1st )%z3(:,:,1) 1043 CALL iom_put( 'e3t_m', e3t_m(:,:) ) 1044 ENDIF 1045 ! ! ================================ ! 1046 ! ! fraction of solar net radiation ! 1047 ! ! ================================ ! 1048 IF( srcv(jpr_fraqsr)%laction ) THEN ! received by sas in case of opa <-> sas coupling 1049 frq_m(:,:) = frcv(jpr_fraqsr)%z3(:,:,1) 1050 CALL iom_put( 'frq_m', frq_m ) 1051 ENDIF 1052 812 1053 ! ! ========================= ! 813 IF( k_ice <= 1 ) THEN! heat & freshwater fluxes ! (Ocean only case)1054 IF( k_ice <= 1 .AND. MOD( kt-1, k_fsbc ) == 0 ) THEN ! heat & freshwater fluxes ! (Ocean only case) 814 1055 ! ! ========================= ! 815 1056 ! 816 1057 ! ! total freshwater fluxes over the ocean (emp) 817 SELECT CASE( TRIM( sn_rcv_emp%cldes ) ) ! evaporation - precipitation 818 CASE( 'conservative' ) 819 emp(:,:) = frcv(jpr_tevp)%z3(:,:,1) - ( frcv(jpr_rain)%z3(:,:,1) + frcv(jpr_snow)%z3(:,:,1) ) 820 CASE( 'oce only', 'oce and ice' ) 821 emp(:,:) = frcv(jpr_oemp)%z3(:,:,1) 822 CASE default 823 CALL ctl_stop( 'sbc_cpl_rcv: wrong definition of sn_rcv_emp%cldes' ) 824 END SELECT 1058 IF( srcv(jpr_oemp)%laction .OR. srcv(jpr_rain)%laction ) THEN 1059 SELECT CASE( TRIM( sn_rcv_emp%cldes ) ) ! evaporation - precipitation 1060 CASE( 'conservative' ) 1061 zemp(:,:) = frcv(jpr_tevp)%z3(:,:,1) - ( frcv(jpr_rain)%z3(:,:,1) + frcv(jpr_snow)%z3(:,:,1) ) 1062 CASE( 'oce only', 'oce and ice' ) 1063 zemp(:,:) = frcv(jpr_oemp)%z3(:,:,1) 1064 CASE default 1065 CALL ctl_stop( 'sbc_cpl_rcv: wrong definition of sn_rcv_emp%cldes' ) 1066 END SELECT 1067 ELSE 1068 zemp(:,:) = 0._wp 1069 ENDIF 825 1070 ! 826 1071 ! ! runoffs and calving (added in emp) 827 IF( srcv(jpr_rnf)%laction ) emp(:,:) = emp(:,:) - frcv(jpr_rnf)%z3(:,:,1) 828 IF( srcv(jpr_cal)%laction ) emp(:,:) = emp(:,:) - frcv(jpr_cal)%z3(:,:,1) 829 ! 830 !!gm : this seems to be internal cooking, not sure to need that in a generic interface 831 !!gm at least should be optional... 832 !! IF( TRIM( sn_rcv_rnf%cldes ) == 'coupled' ) THEN ! add to the total freshwater budget 833 !! ! remove negative runoff 834 !! zcumulpos = SUM( MAX( frcv(jpr_rnf)%z3(:,:,1), 0.e0 ) * e1t(:,:) * e2t(:,:) * tmask_i(:,:) ) 835 !! zcumulneg = SUM( MIN( frcv(jpr_rnf)%z3(:,:,1), 0.e0 ) * e1t(:,:) * e2t(:,:) * tmask_i(:,:) ) 836 !! IF( lk_mpp ) CALL mpp_sum( zcumulpos ) ! sum over the global domain 837 !! IF( lk_mpp ) CALL mpp_sum( zcumulneg ) 838 !! IF( zcumulpos /= 0. ) THEN ! distribute negative runoff on positive runoff grid points 839 !! zcumulneg = 1.e0 + zcumulneg / zcumulpos 840 !! frcv(jpr_rnf)%z3(:,:,1) = MAX( frcv(jpr_rnf)%z3(:,:,1), 0.e0 ) * zcumulneg 841 !! ENDIF 842 !! ! add runoff to e-p 843 !! emp(:,:) = emp(:,:) - frcv(jpr_rnf)%z3(:,:,1) 844 !! ENDIF 845 !!gm end of internal cooking 1072 IF( srcv(jpr_rnf)%laction ) rnf(:,:) = frcv(jpr_rnf)%z3(:,:,1) 1073 IF( srcv(jpr_cal)%laction ) zemp(:,:) = zemp(:,:) - frcv(jpr_cal)%z3(:,:,1) 1074 1075 IF( ln_mixcpl ) THEN ; emp(:,:) = emp(:,:) * xcplmask(:,:,0) + zemp(:,:) * zmsk(:,:) 1076 ELSE ; emp(:,:) = zemp(:,:) 1077 ENDIF 846 1078 ! 847 1079 ! ! non solar heat flux over the ocean (qns) 848 IF( srcv(jpr_qnsoce)%laction ) qns(:,:) = frcv(jpr_qnsoce)%z3(:,:,1) 849 IF( srcv(jpr_qnsmix)%laction ) qns(:,:) = frcv(jpr_qnsmix)%z3(:,:,1) 850 ! add the latent heat of solid precip. melting 851 IF( srcv(jpr_snow )%laction ) THEN ! update qns over the free ocean with: 852 qns(:,:) = qns(:,:) - frcv(jpr_snow)%z3(:,:,1) * lfus & ! energy for melting solid precipitation over the free ocean 853 & - emp(:,:) * sst_m(:,:) * rcp ! remove heat content due to mass flux (assumed to be at SST) 1080 IF( srcv(jpr_qnsoce)%laction ) THEN ; zqns(:,:) = frcv(jpr_qnsoce)%z3(:,:,1) 1081 ELSE IF( srcv(jpr_qnsmix)%laction ) THEN ; zqns(:,:) = frcv(jpr_qnsmix)%z3(:,:,1) 1082 ELSE ; zqns(:,:) = 0._wp 1083 END IF 1084 ! update qns over the free ocean with: 1085 IF( nn_components /= jp_iam_opa ) THEN 1086 zqns(:,:) = zqns(:,:) - zemp(:,:) * sst_m(:,:) * rcp ! remove heat content due to mass flux (assumed to be at SST) 1087 IF( srcv(jpr_snow )%laction ) THEN 1088 zqns(:,:) = zqns(:,:) - frcv(jpr_snow)%z3(:,:,1) * lfus ! energy for melting solid precipitation over the free ocean 1089 ENDIF 1090 ENDIF 1091 IF( ln_mixcpl ) THEN ; qns(:,:) = qns(:,:) * xcplmask(:,:,0) + zqns(:,:) * zmsk(:,:) 1092 ELSE ; qns(:,:) = zqns(:,:) 854 1093 ENDIF 855 1094 856 1095 ! ! solar flux over the ocean (qsr) 857 IF( srcv(jpr_qsroce)%laction ) qsr(:,:) = frcv(jpr_qsroce)%z3(:,:,1) 858 IF( srcv(jpr_qsrmix)%laction ) qsr(:,:) = frcv(jpr_qsrmix)%z3(:,:,1) 859 IF( ln_dm2dc ) qsr(:,:) = sbc_dcy( qsr ) ! modify qsr to include the diurnal cycle 1096 IF ( srcv(jpr_qsroce)%laction ) THEN ; zqsr(:,:) = frcv(jpr_qsroce)%z3(:,:,1) 1097 ELSE IF( srcv(jpr_qsrmix)%laction ) then ; zqsr(:,:) = frcv(jpr_qsrmix)%z3(:,:,1) 1098 ELSE ; zqsr(:,:) = 0._wp 1099 ENDIF 1100 IF( ln_dm2dc .AND. ln_cpl ) zqsr(:,:) = sbc_dcy( zqsr ) ! modify qsr to include the diurnal cycle 1101 IF( ln_mixcpl ) THEN ; qsr(:,:) = qsr(:,:) * xcplmask(:,:,0) + zqsr(:,:) * zmsk(:,:) 1102 ELSE ; qsr(:,:) = zqsr(:,:) 1103 ENDIF 860 1104 ! 861 862 ENDIF 863 ! 864 CALL wrk_dealloc( jpi,jpj, ztx, zty ) 1105 ! salt flux over the ocean (received by opa in case of opa <-> sas coupling) 1106 IF( srcv(jpr_sflx )%laction ) sfx(:,:) = frcv(jpr_sflx )%z3(:,:,1) 1107 ! Ice cover (received by opa in case of opa <-> sas coupling) 1108 IF( srcv(jpr_fice )%laction ) fr_i(:,:) = frcv(jpr_fice )%z3(:,:,1) 1109 ! 1110 1111 ENDIF 1112 ! 1113 CALL wrk_dealloc( jpi,jpj, ztx, zty, zmsk, zemp, zqns, zqsr ) 865 1114 ! 866 1115 IF( nn_timing == 1 ) CALL timing_stop('sbc_cpl_rcv') … … 914 1163 CALL wrk_alloc( jpi,jpj, ztx, zty ) 915 1164 916 !AC Pour eviter un stress nul sur la glace dans le cas mixed oce-ice 917 IF( srcv(jpr_itx1)%laction .AND. TRIM( sn_rcv_tau%cldes ) == 'oce and ice') THEN ; itx = jpr_itx1 1165 IF( srcv(jpr_itx1)%laction ) THEN ; itx = jpr_itx1 918 1166 ELSE ; itx = jpr_otx1 919 1167 ENDIF … … 922 1170 IF( nrcvinfo(itx) == OASIS_Rcv ) THEN 923 1171 924 ! ! ======================= ! 925 !AC Pour eviter un stress nul sur la glace dans le cas mixes oce-ice 926 IF( srcv(jpr_itx1)%laction .AND. TRIM( sn_rcv_tau%cldes ) == 'oce and ice') THEN ! ice stress received ! 927 ! ! ======================= ! 1172 ! ! ======================= ! 1173 IF( srcv(jpr_itx1)%laction ) THEN ! ice stress received ! 1174 ! ! ======================= ! 928 1175 ! 929 1176 IF( TRIM( sn_rcv_tau%clvref ) == 'cartesian' ) THEN ! 2 components on the sphere … … 961 1208 ! 962 1209 ENDIF 963 964 1210 ! ! ======================= ! 965 1211 ! ! put on ice grid ! … … 1083 1329 1084 1330 1085 SUBROUTINE sbc_cpl_ice_flx( p_frld , palbi , psst , pist)1331 SUBROUTINE sbc_cpl_ice_flx( p_frld, palbi, psst, pist ) 1086 1332 !!---------------------------------------------------------------------- 1087 1333 !! *** ROUTINE sbc_cpl_ice_flx *** … … 1125 1371 REAL(wp), INTENT(in ), DIMENSION(:,:) :: p_frld ! lead fraction [0 to 1] 1126 1372 ! optional arguments, used only in 'mixed oce-ice' case 1127 REAL(wp), INTENT(in ), DIMENSION(:,:,:), OPTIONAL :: palbi ! ice albedo 1128 REAL(wp), INTENT(in ), DIMENSION(:,: ), OPTIONAL :: psst ! sea surface temperature [Celcius] 1129 REAL(wp), INTENT(in ), DIMENSION(:,:,:), OPTIONAL :: pist ! ice surface temperature [Kelvin] 1130 ! 1131 INTEGER :: jl ! dummy loop index 1132 REAL(wp), POINTER, DIMENSION(:,:) :: zcptn, ztmp, zicefr 1373 REAL(wp), INTENT(in ), DIMENSION(:,:,:), OPTIONAL :: palbi ! all skies ice albedo 1374 REAL(wp), INTENT(in ), DIMENSION(:,: ), OPTIONAL :: psst ! sea surface temperature [Celsius] 1375 REAL(wp), INTENT(in ), DIMENSION(:,:,:), OPTIONAL :: pist ! ice surface temperature [Kelvin] 1376 ! 1377 INTEGER :: jl ! dummy loop index 1378 REAL(wp), POINTER, DIMENSION(:,: ) :: zcptn, ztmp, zicefr, zmsk 1379 REAL(wp), POINTER, DIMENSION(:,: ) :: zemp_tot, zemp_ice, zsprecip, ztprecip, zqns_tot, zqsr_tot 1380 REAL(wp), POINTER, DIMENSION(:,:,:) :: zqns_ice, zqsr_ice, zdqns_ice 1381 REAL(wp), POINTER, DIMENSION(:,: ) :: zevap, zsnw, zqns_oce, zqsr_oce, zqprec_ice, zqemp_oce ! for LIM3 1133 1382 !!---------------------------------------------------------------------- 1134 1383 ! 1135 1384 IF( nn_timing == 1 ) CALL timing_start('sbc_cpl_ice_flx') 1136 1385 ! 1137 CALL wrk_alloc( jpi,jpj, zcptn, ztmp, zicefr ) 1138 1386 CALL wrk_alloc( jpi,jpj, zcptn, ztmp, zicefr, zmsk, zemp_tot, zemp_ice, zsprecip, ztprecip, zqns_tot, zqsr_tot ) 1387 CALL wrk_alloc( jpi,jpj,jpl, zqns_ice, zqsr_ice, zdqns_ice ) 1388 1389 IF( ln_mixcpl ) zmsk(:,:) = 1. - xcplmask(:,:,0) 1139 1390 zicefr(:,:) = 1.- p_frld(:,:) 1140 1391 zcptn(:,:) = rcp * sst_m(:,:) … … 1144 1395 ! ! ========================= ! 1145 1396 ! 1146 ! ! total Precipitations - total Evaporation (emp_tot) 1147 ! ! solid precipitation - sublimation (emp_ice) 1148 ! ! solid Precipitation (sprecip) 1397 ! ! total Precipitation - total Evaporation (emp_tot) 1398 ! ! solid precipitation - sublimation (emp_ice) 1399 ! ! solid Precipitation (sprecip) 1400 ! ! liquid + solid Precipitation (tprecip) 1149 1401 SELECT CASE( TRIM( sn_rcv_emp%cldes ) ) 1150 1402 CASE( 'conservative' ) ! received fields: jpr_rain, jpr_snow, jpr_ievp, jpr_tevp 1151 sprecip(:,:) = frcv(jpr_snow)%z3(:,:,1) ! May need to ensure positive here 1152 tprecip(:,:) = frcv(jpr_rain)%z3(:,:,1) + sprecip (:,:) ! May need to ensure positive here 1153 emp_tot(:,:) = frcv(jpr_tevp)%z3(:,:,1) - tprecip(:,:) 1154 emp_ice(:,:) = frcv(jpr_ievp)%z3(:,:,1) - frcv(jpr_snow)%z3(:,:,1) 1155 CALL iom_put( 'rain' , frcv(jpr_rain)%z3(:,:,1) ) ! liquid precipitation 1156 IF( lk_diaar5 ) CALL iom_put( 'hflx_rain_cea', frcv(jpr_rain)%z3(:,:,1) * zcptn(:,:) ) ! heat flux from liq. precip. 1157 ztmp(:,:) = frcv(jpr_tevp)%z3(:,:,1) - frcv(jpr_ievp)%z3(:,:,1) * zicefr(:,:) 1158 CALL iom_put( 'evap_ao_cea' , ztmp ) ! ice-free oce evap (cell average) 1159 IF( lk_diaar5 ) CALL iom_put( 'hflx_evap_cea', ztmp(:,: ) * zcptn(:,:) ) ! heat flux from from evap (cell ave) 1403 zsprecip(:,:) = frcv(jpr_snow)%z3(:,:,1) ! May need to ensure positive here 1404 ztprecip(:,:) = frcv(jpr_rain)%z3(:,:,1) + zsprecip(:,:) ! May need to ensure positive here 1405 zemp_tot(:,:) = frcv(jpr_tevp)%z3(:,:,1) - ztprecip(:,:) 1406 zemp_ice(:,:) = frcv(jpr_ievp)%z3(:,:,1) - frcv(jpr_snow)%z3(:,:,1) 1407 CALL iom_put( 'rain' , frcv(jpr_rain)%z3(:,:,1) ) ! liquid precipitation 1408 IF( iom_use('hflx_rain_cea') ) & 1409 CALL iom_put( 'hflx_rain_cea', frcv(jpr_rain)%z3(:,:,1) * zcptn(:,:) ) ! heat flux from liq. precip. 1410 IF( iom_use('evap_ao_cea') .OR. iom_use('hflx_evap_cea') ) & 1411 ztmp(:,:) = frcv(jpr_tevp)%z3(:,:,1) - frcv(jpr_ievp)%z3(:,:,1) * zicefr(:,:) 1412 IF( iom_use('evap_ao_cea' ) ) & 1413 CALL iom_put( 'evap_ao_cea' , ztmp ) ! ice-free oce evap (cell average) 1414 IF( iom_use('hflx_evap_cea') ) & 1415 CALL iom_put( 'hflx_evap_cea', ztmp(:,:) * zcptn(:,:) ) ! heat flux from from evap (cell average) 1160 1416 CASE( 'oce and ice' ) ! received fields: jpr_sbpr, jpr_semp, jpr_oemp, jpr_ievp 1161 emp_tot(:,:) = p_frld(:,:) * frcv(jpr_oemp)%z3(:,:,1) + zicefr(:,:) * frcv(jpr_sbpr)%z3(:,:,1) 1162 emp_ice(:,:) = frcv(jpr_semp)%z3(:,:,1) 1163 sprecip(:,:) = - frcv(jpr_semp)%z3(:,:,1) + frcv(jpr_ievp)%z3(:,:,1) 1417 zemp_tot(:,:) = p_frld(:,:) * frcv(jpr_oemp)%z3(:,:,1) + zicefr(:,:) * frcv(jpr_sbpr)%z3(:,:,1) 1418 zemp_ice(:,:) = frcv(jpr_semp)%z3(:,:,1) 1419 zsprecip(:,:) = frcv(jpr_ievp)%z3(:,:,1) - frcv(jpr_semp)%z3(:,:,1) 1420 ztprecip(:,:) = frcv(jpr_semp)%z3(:,:,1) - frcv(jpr_sbpr)%z3(:,:,1) + zsprecip(:,:) 1164 1421 END SELECT 1165 1422 1166 CALL iom_put( 'snowpre' , sprecip ) ! Snow 1167 CALL iom_put( 'snow_ao_cea', sprecip(:,: ) * p_frld(:,:) ) ! Snow over ice-free ocean (cell average) 1168 CALL iom_put( 'snow_ai_cea', sprecip(:,: ) * zicefr(:,:) ) ! Snow over sea-ice (cell average) 1169 CALL iom_put( 'subl_ai_cea', frcv(jpr_ievp)%z3(:,:,1) * zicefr(:,:) ) ! Sublimation over sea-ice (cell average) 1423 IF( iom_use('subl_ai_cea') ) & 1424 CALL iom_put( 'subl_ai_cea', frcv(jpr_ievp)%z3(:,:,1) * zicefr(:,:) ) ! Sublimation over sea-ice (cell average) 1170 1425 ! 1171 1426 ! ! runoffs and calving (put in emp_tot) 1172 IF( srcv(jpr_rnf)%laction ) THEN 1173 emp_tot(:,:) = emp_tot(:,:) - frcv(jpr_rnf)%z3(:,:,1) 1174 CALL iom_put( 'runoffs' , frcv(jpr_rnf)%z3(:,:,1) ) ! rivers 1175 IF( lk_diaar5 ) CALL iom_put( 'hflx_rnf_cea' , frcv(jpr_rnf)%z3(:,:,1) * zcptn(:,:) ) ! heat flux from rivers 1176 ENDIF 1427 IF( srcv(jpr_rnf)%laction ) rnf(:,:) = frcv(jpr_rnf)%z3(:,:,1) 1177 1428 IF( srcv(jpr_cal)%laction ) THEN 1178 emp_tot(:,:) = emp_tot(:,:) - frcv(jpr_cal)%z3(:,:,1) 1179 CALL iom_put( 'calving', frcv(jpr_cal)%z3(:,:,1) ) 1180 ENDIF 1181 ! 1182 !!gm : this seems to be internal cooking, not sure to need that in a generic interface 1183 !!gm at least should be optional... 1184 !! ! remove negative runoff ! sum over the global domain 1185 !! zcumulpos = SUM( MAX( frcv(jpr_rnf)%z3(:,:,1), 0.e0 ) * e1t(:,:) * e2t(:,:) * tmask_i(:,:) ) 1186 !! zcumulneg = SUM( MIN( frcv(jpr_rnf)%z3(:,:,1), 0.e0 ) * e1t(:,:) * e2t(:,:) * tmask_i(:,:) ) 1187 !! IF( lk_mpp ) CALL mpp_sum( zcumulpos ) 1188 !! IF( lk_mpp ) CALL mpp_sum( zcumulneg ) 1189 !! IF( zcumulpos /= 0. ) THEN ! distribute negative runoff on positive runoff grid points 1190 !! zcumulneg = 1.e0 + zcumulneg / zcumulpos 1191 !! frcv(jpr_rnf)%z3(:,:,1) = MAX( frcv(jpr_rnf)%z3(:,:,1), 0.e0 ) * zcumulneg 1192 !! ENDIF 1193 !! emp_tot(:,:) = emp_tot(:,:) - frcv(jpr_rnf)%z3(:,:,1) ! add runoff to e-p 1194 !! 1195 !!gm end of internal cooking 1429 zemp_tot(:,:) = zemp_tot(:,:) - frcv(jpr_cal)%z3(:,:,1) 1430 CALL iom_put( 'calving_cea', frcv(jpr_cal)%z3(:,:,1) ) 1431 ENDIF 1432 1433 IF( ln_mixcpl ) THEN 1434 emp_tot(:,:) = emp_tot(:,:) * xcplmask(:,:,0) + zemp_tot(:,:) * zmsk(:,:) 1435 emp_ice(:,:) = emp_ice(:,:) * xcplmask(:,:,0) + zemp_ice(:,:) * zmsk(:,:) 1436 sprecip(:,:) = sprecip(:,:) * xcplmask(:,:,0) + zsprecip(:,:) * zmsk(:,:) 1437 tprecip(:,:) = tprecip(:,:) * xcplmask(:,:,0) + ztprecip(:,:) * zmsk(:,:) 1438 ELSE 1439 emp_tot(:,:) = zemp_tot(:,:) 1440 emp_ice(:,:) = zemp_ice(:,:) 1441 sprecip(:,:) = zsprecip(:,:) 1442 tprecip(:,:) = ztprecip(:,:) 1443 ENDIF 1444 1445 CALL iom_put( 'snowpre' , sprecip ) ! Snow 1446 IF( iom_use('snow_ao_cea') ) & 1447 CALL iom_put( 'snow_ao_cea', sprecip(:,:) * p_frld(:,:) ) ! Snow over ice-free ocean (cell average) 1448 IF( iom_use('snow_ai_cea') ) & 1449 CALL iom_put( 'snow_ai_cea', sprecip(:,:) * zicefr(:,:) ) ! Snow over sea-ice (cell average) 1196 1450 1197 1451 ! ! ========================= ! … … 1199 1453 ! ! ========================= ! 1200 1454 CASE( 'oce only' ) ! the required field is directly provided 1201 qns_tot(:,: ) = frcv(jpr_qnsoce)%z3(:,:,1)1455 zqns_tot(:,: ) = frcv(jpr_qnsoce)%z3(:,:,1) 1202 1456 CASE( 'conservative' ) ! the required fields are directly provided 1203 qns_tot(:,: ) = frcv(jpr_qnsmix)%z3(:,:,1)1457 zqns_tot(:,: ) = frcv(jpr_qnsmix)%z3(:,:,1) 1204 1458 IF ( TRIM(sn_rcv_qns%clcat) == 'yes' ) THEN 1205 qns_ice(:,:,1:jpl) = frcv(jpr_qnsice)%z3(:,:,1:jpl)1459 zqns_ice(:,:,1:jpl) = frcv(jpr_qnsice)%z3(:,:,1:jpl) 1206 1460 ELSE 1207 1461 ! Set all category values equal for the moment 1208 1462 DO jl=1,jpl 1209 qns_ice(:,:,jl) = frcv(jpr_qnsice)%z3(:,:,1)1463 zqns_ice(:,:,jl) = frcv(jpr_qnsice)%z3(:,:,1) 1210 1464 ENDDO 1211 1465 ENDIF 1212 1466 CASE( 'oce and ice' ) ! the total flux is computed from ocean and ice fluxes 1213 qns_tot(:,: ) = p_frld(:,:) * frcv(jpr_qnsoce)%z3(:,:,1)1467 zqns_tot(:,: ) = p_frld(:,:) * frcv(jpr_qnsoce)%z3(:,:,1) 1214 1468 IF ( TRIM(sn_rcv_qns%clcat) == 'yes' ) THEN 1215 1469 DO jl=1,jpl 1216 qns_tot(:,: ) =qns_tot(:,:) + a_i(:,:,jl) * frcv(jpr_qnsice)%z3(:,:,jl)1217 qns_ice(:,:,jl) = frcv(jpr_qnsice)%z3(:,:,jl)1470 zqns_tot(:,: ) = zqns_tot(:,:) + a_i(:,:,jl) * frcv(jpr_qnsice)%z3(:,:,jl) 1471 zqns_ice(:,:,jl) = frcv(jpr_qnsice)%z3(:,:,jl) 1218 1472 ENDDO 1219 1473 ELSE 1474 qns_tot(:,: ) = qns_tot(:,:) + zicefr(:,:) * frcv(jpr_qnsice)%z3(:,:,1) 1220 1475 DO jl=1,jpl 1221 qns_tot(:,: ) =qns_tot(:,:) + zicefr(:,:) * frcv(jpr_qnsice)%z3(:,:,1)1222 qns_ice(:,:,jl) = frcv(jpr_qnsice)%z3(:,:,1)1476 zqns_tot(:,: ) = zqns_tot(:,:) + zicefr(:,:) * frcv(jpr_qnsice)%z3(:,:,1) 1477 zqns_ice(:,:,jl) = frcv(jpr_qnsice)%z3(:,:,1) 1223 1478 ENDDO 1224 1479 ENDIF 1225 1480 CASE( 'mixed oce-ice' ) ! the ice flux is cumputed from the total flux, the SST and ice informations 1226 1481 ! ** NEED TO SORT OUT HOW THIS SHOULD WORK IN THE MULTI-CATEGORY CASE - CURRENTLY NOT ALLOWED WHEN INTERFACE INITIALISED ** 1227 qns_tot(:,: ) = frcv(jpr_qnsmix)%z3(:,:,1)1228 qns_ice(:,:,1) = frcv(jpr_qnsmix)%z3(:,:,1) &1482 zqns_tot(:,: ) = frcv(jpr_qnsmix)%z3(:,:,1) 1483 zqns_ice(:,:,1) = frcv(jpr_qnsmix)%z3(:,:,1) & 1229 1484 & + frcv(jpr_dqnsdt)%z3(:,:,1) * ( pist(:,:,1) - ( (rt0 + psst(:,: ) ) * p_frld(:,:) & 1230 1485 & + pist(:,:,1) * zicefr(:,:) ) ) 1231 1486 END SELECT 1232 ztmp(:,:) = p_frld(:,:) * sprecip(:,:) * lfus1233 qns_tot(:,:) = qns_tot(:,:) & ! qns_tot update over free ocean with:1234 & - ztmp(:,:) & ! remove the latent heat flux of solid precip. melting1235 & - ( emp_tot(:,:) & ! remove the heat content of mass flux (assumed to be at SST)1236 & - emp_ice(:,:) * zicefr(:,:) ) * zcptn(:,:)1237 IF( lk_diaar5 ) CALL iom_put( 'hflx_snow_cea', ztmp + sprecip(:,:) * zcptn(:,:) ) ! heat flux from snow (cell average)1238 1487 !!gm 1239 !! currently it is taken into account in leads budget but not in the qns_tot, and thus not in1488 !! currently it is taken into account in leads budget but not in the zqns_tot, and thus not in 1240 1489 !! the flux that enter the ocean.... 1241 1490 !! moreover 1 - it is not diagnose anywhere.... … … 1246 1495 IF( srcv(jpr_cal)%laction ) THEN ! Iceberg melting 1247 1496 ztmp(:,:) = frcv(jpr_cal)%z3(:,:,1) * lfus ! add the latent heat of iceberg melting 1248 qns_tot(:,:) = qns_tot(:,:) - ztmp(:,:) 1249 IF( lk_diaar5 ) CALL iom_put( 'hflx_cal_cea', ztmp + frcv(jpr_cal)%z3(:,:,1) * zcptn(:,:) ) ! heat flux from calving 1250 ENDIF 1497 zqns_tot(:,:) = zqns_tot(:,:) - ztmp(:,:) 1498 IF( iom_use('hflx_cal_cea') ) & 1499 CALL iom_put( 'hflx_cal_cea', ztmp + frcv(jpr_cal)%z3(:,:,1) * zcptn(:,:) ) ! heat flux from calving 1500 ENDIF 1501 1502 ztmp(:,:) = p_frld(:,:) * zsprecip(:,:) * lfus 1503 IF( iom_use('hflx_snow_cea') ) CALL iom_put( 'hflx_snow_cea', ztmp + sprecip(:,:) * zcptn(:,:) ) ! heat flux from snow (cell average) 1504 1505 #if defined key_lim3 1506 CALL wrk_alloc( jpi,jpj, zevap, zsnw, zqns_oce, zqprec_ice, zqemp_oce ) 1507 1508 ! --- evaporation --- ! 1509 ! clem: evap_ice is set to 0 for LIM3 since we still do not know what to do with sublimation 1510 ! the problem is: the atm. imposes both mass evaporation and heat removed from the snow/ice 1511 ! but it is incoherent WITH the ice model 1512 DO jl=1,jpl 1513 evap_ice(:,:,jl) = 0._wp ! should be: frcv(jpr_ievp)%z3(:,:,1) 1514 ENDDO 1515 zevap(:,:) = zemp_tot(:,:) + ztprecip(:,:) ! evaporation over ocean 1516 1517 ! --- evaporation minus precipitation --- ! 1518 emp_oce(:,:) = emp_tot(:,:) - emp_ice(:,:) 1519 1520 ! --- non solar flux over ocean --- ! 1521 ! note: p_frld cannot be = 0 since we limit the ice concentration to amax 1522 zqns_oce = 0._wp 1523 WHERE( p_frld /= 0._wp ) zqns_oce(:,:) = ( zqns_tot(:,:) - SUM( a_i * zqns_ice, dim=3 ) ) / p_frld(:,:) 1524 1525 ! --- heat flux associated with emp --- ! 1526 zsnw(:,:) = 0._wp 1527 CALL lim_thd_snwblow( p_frld, zsnw ) ! snow distribution over ice after wind blowing 1528 zqemp_oce(:,:) = - zevap(:,:) * p_frld(:,:) * zcptn(:,:) & ! evap 1529 & + ( ztprecip(:,:) - zsprecip(:,:) ) * zcptn(:,:) & ! liquid precip 1530 & + zsprecip(:,:) * ( 1._wp - zsnw ) * ( zcptn(:,:) - lfus ) ! solid precip over ocean 1531 qemp_ice(:,:) = - frcv(jpr_ievp)%z3(:,:,1) * zicefr(:,:) * zcptn(:,:) & ! ice evap 1532 & + zsprecip(:,:) * zsnw * ( zcptn(:,:) - lfus ) ! solid precip over ice 1533 1534 ! --- heat content of precip over ice in J/m3 (to be used in 1D-thermo) --- ! 1535 zqprec_ice(:,:) = rhosn * ( zcptn(:,:) - lfus ) 1536 1537 ! --- total non solar flux --- ! 1538 zqns_tot(:,:) = zqns_tot(:,:) + qemp_ice(:,:) + zqemp_oce(:,:) 1539 1540 ! --- in case both coupled/forced are active, we must mix values --- ! 1541 IF( ln_mixcpl ) THEN 1542 qns_tot(:,:) = qns_tot(:,:) * xcplmask(:,:,0) + zqns_tot(:,:)* zmsk(:,:) 1543 qns_oce(:,:) = qns_oce(:,:) * xcplmask(:,:,0) + zqns_oce(:,:)* zmsk(:,:) 1544 DO jl=1,jpl 1545 qns_ice(:,:,jl) = qns_ice(:,:,jl) * xcplmask(:,:,0) + zqns_ice(:,:,jl)* zmsk(:,:) 1546 ENDDO 1547 qprec_ice(:,:) = qprec_ice(:,:) * xcplmask(:,:,0) + zqprec_ice(:,:)* zmsk(:,:) 1548 qemp_oce (:,:) = qemp_oce(:,:) * xcplmask(:,:,0) + zqemp_oce(:,:)* zmsk(:,:) 1549 !!clem evap_ice(:,:) = evap_ice(:,:) * xcplmask(:,:,0) 1550 ELSE 1551 qns_tot (:,: ) = zqns_tot (:,: ) 1552 qns_oce (:,: ) = zqns_oce (:,: ) 1553 qns_ice (:,:,:) = zqns_ice (:,:,:) 1554 qprec_ice(:,:) = zqprec_ice(:,:) 1555 qemp_oce (:,:) = zqemp_oce (:,:) 1556 ENDIF 1557 1558 CALL wrk_dealloc( jpi,jpj, zevap, zsnw, zqns_oce, zqprec_ice, zqemp_oce ) 1559 #else 1560 1561 ! clem: this formulation is certainly wrong... but better than it was... 1562 zqns_tot(:,:) = zqns_tot(:,:) & ! zqns_tot update over free ocean with: 1563 & - ztmp(:,:) & ! remove the latent heat flux of solid precip. melting 1564 & - ( zemp_tot(:,:) & ! remove the heat content of mass flux (assumed to be at SST) 1565 & - zemp_ice(:,:) * zicefr(:,:) ) * zcptn(:,:) 1566 1567 IF( ln_mixcpl ) THEN 1568 qns_tot(:,:) = qns(:,:) * p_frld(:,:) + SUM( qns_ice(:,:,:) * a_i(:,:,:), dim=3 ) ! total flux from blk 1569 qns_tot(:,:) = qns_tot(:,:) * xcplmask(:,:,0) + zqns_tot(:,:)* zmsk(:,:) 1570 DO jl=1,jpl 1571 qns_ice(:,:,jl) = qns_ice(:,:,jl) * xcplmask(:,:,0) + zqns_ice(:,:,jl)* zmsk(:,:) 1572 ENDDO 1573 ELSE 1574 qns_tot(:,: ) = zqns_tot(:,: ) 1575 qns_ice(:,:,:) = zqns_ice(:,:,:) 1576 ENDIF 1577 1578 #endif 1251 1579 1252 1580 ! ! ========================= ! … … 1254 1582 ! ! ========================= ! 1255 1583 CASE( 'oce only' ) 1256 qsr_tot(:,: ) = MAX( 0._wp , frcv(jpr_qsroce)%z3(:,:,1) )1584 zqsr_tot(:,: ) = MAX( 0._wp , frcv(jpr_qsroce)%z3(:,:,1) ) 1257 1585 CASE( 'conservative' ) 1258 qsr_tot(:,: ) = frcv(jpr_qsrmix)%z3(:,:,1)1586 zqsr_tot(:,: ) = frcv(jpr_qsrmix)%z3(:,:,1) 1259 1587 IF ( TRIM(sn_rcv_qsr%clcat) == 'yes' ) THEN 1260 qsr_ice(:,:,1:jpl) = frcv(jpr_qsrice)%z3(:,:,1:jpl)1588 zqsr_ice(:,:,1:jpl) = frcv(jpr_qsrice)%z3(:,:,1:jpl) 1261 1589 ELSE 1262 1590 ! Set all category values equal for the moment 1263 1591 DO jl=1,jpl 1264 qsr_ice(:,:,jl) = frcv(jpr_qsrice)%z3(:,:,1)1592 zqsr_ice(:,:,jl) = frcv(jpr_qsrice)%z3(:,:,1) 1265 1593 ENDDO 1266 1594 ENDIF 1267 qsr_tot(:,: ) = frcv(jpr_qsrmix)%z3(:,:,1)1268 qsr_ice(:,:,1) = frcv(jpr_qsrice)%z3(:,:,1)1595 zqsr_tot(:,: ) = frcv(jpr_qsrmix)%z3(:,:,1) 1596 zqsr_ice(:,:,1) = frcv(jpr_qsrice)%z3(:,:,1) 1269 1597 CASE( 'oce and ice' ) 1270 qsr_tot(:,: ) = p_frld(:,:) * frcv(jpr_qsroce)%z3(:,:,1)1598 zqsr_tot(:,: ) = p_frld(:,:) * frcv(jpr_qsroce)%z3(:,:,1) 1271 1599 IF ( TRIM(sn_rcv_qsr%clcat) == 'yes' ) THEN 1272 1600 DO jl=1,jpl 1273 qsr_tot(:,: ) =qsr_tot(:,:) + a_i(:,:,jl) * frcv(jpr_qsrice)%z3(:,:,jl)1274 qsr_ice(:,:,jl) = frcv(jpr_qsrice)%z3(:,:,jl)1601 zqsr_tot(:,: ) = zqsr_tot(:,:) + a_i(:,:,jl) * frcv(jpr_qsrice)%z3(:,:,jl) 1602 zqsr_ice(:,:,jl) = frcv(jpr_qsrice)%z3(:,:,jl) 1275 1603 ENDDO 1276 1604 ELSE 1605 qsr_tot(:,: ) = qsr_tot(:,:) + zicefr(:,:) * frcv(jpr_qsrice)%z3(:,:,1) 1277 1606 DO jl=1,jpl 1278 qsr_tot(:,: ) =qsr_tot(:,:) + zicefr(:,:) * frcv(jpr_qsrice)%z3(:,:,1)1279 qsr_ice(:,:,jl) = frcv(jpr_qsrice)%z3(:,:,1)1607 zqsr_tot(:,: ) = zqsr_tot(:,:) + zicefr(:,:) * frcv(jpr_qsrice)%z3(:,:,1) 1608 zqsr_ice(:,:,jl) = frcv(jpr_qsrice)%z3(:,:,1) 1280 1609 ENDDO 1281 1610 ENDIF 1282 1611 CASE( 'mixed oce-ice' ) 1283 qsr_tot(:,: ) = frcv(jpr_qsrmix)%z3(:,:,1)1612 zqsr_tot(:,: ) = frcv(jpr_qsrmix)%z3(:,:,1) 1284 1613 ! ** NEED TO SORT OUT HOW THIS SHOULD WORK IN THE MULTI-CATEGORY CASE - CURRENTLY NOT ALLOWED WHEN INTERFACE INITIALISED ** 1285 1614 ! Create solar heat flux over ice using incoming solar heat flux and albedos 1286 1615 ! ( see OASIS3 user guide, 5th edition, p39 ) 1287 qsr_ice(:,:,1) = frcv(jpr_qsrmix)%z3(:,:,1) * ( 1.- palbi(:,:,1) ) &1616 zqsr_ice(:,:,1) = frcv(jpr_qsrmix)%z3(:,:,1) * ( 1.- palbi(:,:,1) ) & 1288 1617 & / ( 1.- ( albedo_oce_mix(:,: ) * p_frld(:,:) & 1289 1618 & + palbi (:,:,1) * zicefr(:,:) ) ) 1290 1619 END SELECT 1291 IF( ln_dm2dc ) THEN ! modify qsr to include the diurnal cycle1292 qsr_tot(:,: ) = sbc_dcy(qsr_tot(:,: ) )1620 IF( ln_dm2dc .AND. ln_cpl ) THEN ! modify qsr to include the diurnal cycle 1621 zqsr_tot(:,: ) = sbc_dcy( zqsr_tot(:,: ) ) 1293 1622 DO jl=1,jpl 1294 qsr_ice(:,:,jl) = sbc_dcy(qsr_ice(:,:,jl) )1623 zqsr_ice(:,:,jl) = sbc_dcy( zqsr_ice(:,:,jl) ) 1295 1624 ENDDO 1296 1625 ENDIF 1297 1626 1298 SELECT CASE( TRIM( sn_rcv_dqnsdt%cldes ) ) 1627 #if defined key_lim3 1628 CALL wrk_alloc( jpi,jpj, zqsr_oce ) 1629 ! --- solar flux over ocean --- ! 1630 ! note: p_frld cannot be = 0 since we limit the ice concentration to amax 1631 zqsr_oce = 0._wp 1632 WHERE( p_frld /= 0._wp ) zqsr_oce(:,:) = ( zqsr_tot(:,:) - SUM( a_i * zqsr_ice, dim=3 ) ) / p_frld(:,:) 1633 1634 IF( ln_mixcpl ) THEN ; qsr_oce(:,:) = qsr_oce(:,:) * xcplmask(:,:,0) + zqsr_oce(:,:)* zmsk(:,:) 1635 ELSE ; qsr_oce(:,:) = zqsr_oce(:,:) ; ENDIF 1636 1637 CALL wrk_dealloc( jpi,jpj, zqsr_oce ) 1638 #endif 1639 1640 IF( ln_mixcpl ) THEN 1641 qsr_tot(:,:) = qsr(:,:) * p_frld(:,:) + SUM( qsr_ice(:,:,:) * a_i(:,:,:), dim=3 ) ! total flux from blk 1642 qsr_tot(:,:) = qsr_tot(:,:) * xcplmask(:,:,0) + zqsr_tot(:,:)* zmsk(:,:) 1643 DO jl=1,jpl 1644 qsr_ice(:,:,jl) = qsr_ice(:,:,jl) * xcplmask(:,:,0) + zqsr_ice(:,:,jl)* zmsk(:,:) 1645 ENDDO 1646 ELSE 1647 qsr_tot(:,: ) = zqsr_tot(:,: ) 1648 qsr_ice(:,:,:) = zqsr_ice(:,:,:) 1649 ENDIF 1650 1651 ! ! ========================= ! 1652 SELECT CASE( TRIM( sn_rcv_dqnsdt%cldes ) ) ! d(qns)/dt ! 1653 ! ! ========================= ! 1299 1654 CASE ('coupled') 1300 1655 IF ( TRIM(sn_rcv_dqnsdt%clcat) == 'yes' ) THEN 1301 dqns_ice(:,:,1:jpl) = frcv(jpr_dqnsdt)%z3(:,:,1:jpl)1656 zdqns_ice(:,:,1:jpl) = frcv(jpr_dqnsdt)%z3(:,:,1:jpl) 1302 1657 ELSE 1303 1658 ! Set all category values equal for the moment 1304 1659 DO jl=1,jpl 1305 dqns_ice(:,:,jl) = frcv(jpr_dqnsdt)%z3(:,:,1)1660 zdqns_ice(:,:,jl) = frcv(jpr_dqnsdt)%z3(:,:,1) 1306 1661 ENDDO 1307 1662 ENDIF 1308 1663 END SELECT 1309 1310 SELECT CASE( TRIM( sn_rcv_iceflx%cldes ) ) 1664 1665 IF( ln_mixcpl ) THEN 1666 DO jl=1,jpl 1667 dqns_ice(:,:,jl) = dqns_ice(:,:,jl) * xcplmask(:,:,0) + zdqns_ice(:,:,jl) * zmsk(:,:) 1668 ENDDO 1669 ELSE 1670 dqns_ice(:,:,:) = zdqns_ice(:,:,:) 1671 ENDIF 1672 1673 ! ! ========================= ! 1674 SELECT CASE( TRIM( sn_rcv_iceflx%cldes ) ) ! topmelt and botmelt ! 1675 ! ! ========================= ! 1311 1676 CASE ('coupled') 1312 1677 topmelt(:,:,:)=frcv(jpr_topm)%z3(:,:,:) … … 1314 1679 END SELECT 1315 1680 1316 ! Ice Qsr penetration used (only?)in lim2 or lim3 1317 ! fraction of net shortwave radiation which is not absorbed in the thin surface layer 1318 ! and penetrates inside the ice cover ( Maykut and Untersteiner, 1971 ; Elbert anbd Curry, 1993 ) 1681 ! Surface transimission parameter io (Maykut Untersteiner , 1971 ; Ebert and Curry, 1993 ) 1682 ! Used for LIM2 and LIM3 1319 1683 ! Coupled case: since cloud cover is not received from atmosphere 1320 ! ===> defined as constant value -> definition done in sbc_cpl_init1321 fr1_i0(:,:) = 0.181322 fr2_i0(:,:) = 0.821323 1324 1325 CALL wrk_dealloc( jpi,jpj, zcptn, ztmp, zicefr)1684 ! ===> used prescribed cloud fraction representative for polar oceans in summer (0.81) 1685 fr1_i0(:,:) = ( 0.18 * ( 1.0 - cldf_ice ) + 0.35 * cldf_ice ) 1686 fr2_i0(:,:) = ( 0.82 * ( 1.0 - cldf_ice ) + 0.65 * cldf_ice ) 1687 1688 CALL wrk_dealloc( jpi,jpj, zcptn, ztmp, zicefr, zmsk, zemp_tot, zemp_ice, zsprecip, ztprecip, zqns_tot, zqsr_tot ) 1689 CALL wrk_dealloc( jpi,jpj,jpl, zqns_ice, zqsr_ice, zdqns_ice ) 1326 1690 ! 1327 1691 IF( nn_timing == 1 ) CALL timing_stop('sbc_cpl_ice_flx') … … 1336 1700 !! ** Purpose : provide the ocean-ice informations to the atmosphere 1337 1701 !! 1338 !! ** Method : send to the atmosphere through a call to cpl_ prism_snd1702 !! ** Method : send to the atmosphere through a call to cpl_snd 1339 1703 !! all the needed fields (as defined in sbc_cpl_init) 1340 1704 !!---------------------------------------------------------------------- … … 1343 1707 INTEGER :: ji, jj, jl ! dummy loop indices 1344 1708 INTEGER :: isec, info ! local integer 1709 REAL(wp) :: zumax, zvmax 1345 1710 REAL(wp), POINTER, DIMENSION(:,:) :: zfr_l, ztmp1, ztmp2, zotx1, zoty1, zotz1, zitx1, zity1, zitz1 1346 1711 REAL(wp), POINTER, DIMENSION(:,:,:) :: ztmp3, ztmp4 … … 1355 1720 1356 1721 zfr_l(:,:) = 1.- fr_i(:,:) 1357 1358 1722 ! ! ------------------------- ! 1359 1723 ! ! Surface temperature ! in Kelvin 1360 1724 ! ! ------------------------- ! 1361 1725 IF( ssnd(jps_toce)%laction .OR. ssnd(jps_tice)%laction .OR. ssnd(jps_tmix)%laction ) THEN 1362 SELECT CASE( sn_snd_temp%cldes) 1363 CASE( 'oce only' ) ; ztmp1(:,:) = tsn(:,:,1,jp_tem) + rt0 1364 CASE( 'weighted oce and ice' ) ; ztmp1(:,:) = ( tsn(:,:,1,jp_tem) + rt0 ) * zfr_l(:,:) 1365 SELECT CASE( sn_snd_temp%clcat ) 1366 CASE( 'yes' ) 1367 ztmp3(:,:,1:jpl) = tn_ice(:,:,1:jpl) * a_i(:,:,1:jpl) 1368 CASE( 'no' ) 1369 ztmp3(:,:,:) = 0.0 1726 1727 IF ( nn_components == jp_iam_opa ) THEN 1728 ztmp1(:,:) = tsn(:,:,1,jp_tem) ! send temperature as it is (potential or conservative) -> use of ln_useCT on the received part 1729 ELSE 1730 ! we must send the surface potential temperature 1731 IF( ln_useCT ) THEN ; ztmp1(:,:) = eos_pt_from_ct( tsn(:,:,1,jp_tem), tsn(:,:,1,jp_sal) ) 1732 ELSE ; ztmp1(:,:) = tsn(:,:,1,jp_tem) 1733 ENDIF 1734 ! 1735 SELECT CASE( sn_snd_temp%cldes) 1736 CASE( 'oce only' ) ; ztmp1(:,:) = ztmp1(:,:) + rt0 1737 CASE( 'oce and ice' ) ; ztmp1(:,:) = ztmp1(:,:) + rt0 1738 SELECT CASE( sn_snd_temp%clcat ) 1739 CASE( 'yes' ) 1740 ztmp3(:,:,1:jpl) = tn_ice(:,:,1:jpl) 1741 CASE( 'no' ) 1742 WHERE( SUM( a_i, dim=3 ) /= 0. ) 1743 ztmp3(:,:,1) = SUM( tn_ice * a_i, dim=3 ) / SUM( a_i, dim=3 ) 1744 ELSEWHERE 1745 ztmp3(:,:,1) = rt0 ! TODO: Is freezing point a good default? (Maybe SST is better?) 1746 END WHERE 1747 CASE default ; CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_temp%clcat' ) 1748 END SELECT 1749 CASE( 'weighted oce and ice' ) ; ztmp1(:,:) = ( ztmp1(:,:) + rt0 ) * zfr_l(:,:) 1750 SELECT CASE( sn_snd_temp%clcat ) 1751 CASE( 'yes' ) 1752 ztmp3(:,:,1:jpl) = tn_ice(:,:,1:jpl) * a_i(:,:,1:jpl) 1753 CASE( 'no' ) 1754 ztmp3(:,:,:) = 0.0 1755 DO jl=1,jpl 1756 ztmp3(:,:,1) = ztmp3(:,:,1) + tn_ice(:,:,jl) * a_i(:,:,jl) 1757 ENDDO 1758 CASE default ; CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_temp%clcat' ) 1759 END SELECT 1760 CASE( 'mixed oce-ice' ) 1761 ztmp1(:,:) = ( ztmp1(:,:) + rt0 ) * zfr_l(:,:) 1370 1762 DO jl=1,jpl 1371 ztmp 3(:,:,1) = ztmp3(:,:,1) + tn_ice(:,:,jl) * a_i(:,:,jl)1763 ztmp1(:,:) = ztmp1(:,:) + tn_ice(:,:,jl) * a_i(:,:,jl) 1372 1764 ENDDO 1373 CASE default ; CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_temp%clcat' )1765 CASE default ; CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_temp%cldes' ) 1374 1766 END SELECT 1375 CASE( 'mixed oce-ice' ) 1376 ztmp1(:,:) = ( tsn(:,:,1,1) + rt0 ) * zfr_l(:,:) 1377 DO jl=1,jpl 1378 ztmp1(:,:) = ztmp1(:,:) + tn_ice(:,:,jl) * a_i(:,:,jl) 1379 ENDDO 1380 CASE default ; CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_temp%cldes' ) 1767 ENDIF 1768 IF( ssnd(jps_toce)%laction ) CALL cpl_snd( jps_toce, isec, RESHAPE ( ztmp1, (/jpi,jpj,1/) ), info ) 1769 IF( ssnd(jps_tice)%laction ) CALL cpl_snd( jps_tice, isec, ztmp3, info ) 1770 IF( ssnd(jps_tmix)%laction ) CALL cpl_snd( jps_tmix, isec, RESHAPE ( ztmp1, (/jpi,jpj,1/) ), info ) 1771 ENDIF 1772 ! ! ------------------------- ! 1773 ! ! Albedo ! 1774 ! ! ------------------------- ! 1775 IF( ssnd(jps_albice)%laction ) THEN ! ice 1776 SELECT CASE( sn_snd_alb%cldes ) 1777 CASE( 'ice' ) ; ztmp3(:,:,1:jpl) = alb_ice(:,:,1:jpl) 1778 CASE( 'weighted ice' ) ; ztmp3(:,:,1:jpl) = alb_ice(:,:,1:jpl) * a_i(:,:,1:jpl) 1779 CASE default ; CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_alb%cldes' ) 1381 1780 END SELECT 1382 IF( ssnd(jps_toce)%laction ) CALL cpl_prism_snd( jps_toce, isec, RESHAPE ( ztmp1, (/jpi,jpj,1/) ), info ) 1383 IF( ssnd(jps_tice)%laction ) CALL cpl_prism_snd( jps_tice, isec, ztmp3, info ) 1384 IF( ssnd(jps_tmix)%laction ) CALL cpl_prism_snd( jps_tmix, isec, RESHAPE ( ztmp1, (/jpi,jpj,1/) ), info ) 1385 ENDIF 1386 ! 1387 ! ! ------------------------- ! 1388 ! ! Albedo ! 1389 ! ! ------------------------- ! 1390 IF( ssnd(jps_albice)%laction ) THEN ! ice 1391 ztmp3(:,:,1:jpl) = alb_ice(:,:,1:jpl) * a_i(:,:,1:jpl) 1392 CALL cpl_prism_snd( jps_albice, isec, ztmp3, info ) 1781 CALL cpl_snd( jps_albice, isec, ztmp3, info ) 1393 1782 ENDIF 1394 1783 IF( ssnd(jps_albmix)%laction ) THEN ! mixed ice-ocean … … 1397 1786 ztmp1(:,:) = ztmp1(:,:) + alb_ice(:,:,jl) * a_i(:,:,jl) 1398 1787 ENDDO 1399 CALL cpl_ prism_snd( jps_albmix, isec, RESHAPE ( ztmp1, (/jpi,jpj,1/) ), info )1788 CALL cpl_snd( jps_albmix, isec, RESHAPE ( ztmp1, (/jpi,jpj,1/) ), info ) 1400 1789 ENDIF 1401 1790 ! ! ------------------------- ! 1402 1791 ! ! Ice fraction & Thickness ! 1403 1792 ! ! ------------------------- ! 1404 ! Send ice fraction field 1793 ! Send ice fraction field to atmosphere 1405 1794 IF( ssnd(jps_fice)%laction ) THEN 1406 1795 SELECT CASE( sn_snd_thick%clcat ) … … 1409 1798 CASE default ; CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_thick%clcat' ) 1410 1799 END SELECT 1411 CALL cpl_prism_snd( jps_fice, isec, ztmp3, info ) 1800 IF( ssnd(jps_fice)%laction ) CALL cpl_snd( jps_fice, isec, ztmp3, info ) 1801 ENDIF 1802 1803 ! Send ice fraction field to OPA (sent by SAS in SAS-OPA coupling) 1804 IF( ssnd(jps_fice2)%laction ) THEN 1805 ztmp3(:,:,1) = fr_i(:,:) 1806 IF( ssnd(jps_fice2)%laction ) CALL cpl_snd( jps_fice2, isec, ztmp3, info ) 1412 1807 ENDIF 1413 1808 … … 1430 1825 END SELECT 1431 1826 CASE( 'ice and snow' ) 1432 ztmp3(:,:,1:jpl) = ht_i(:,:,1:jpl) 1433 ztmp4(:,:,1:jpl) = ht_s(:,:,1:jpl) 1827 SELECT CASE( sn_snd_thick%clcat ) 1828 CASE( 'yes' ) 1829 ztmp3(:,:,1:jpl) = ht_i(:,:,1:jpl) 1830 ztmp4(:,:,1:jpl) = ht_s(:,:,1:jpl) 1831 CASE( 'no' ) 1832 WHERE( SUM( a_i, dim=3 ) /= 0. ) 1833 ztmp3(:,:,1) = SUM( ht_i * a_i, dim=3 ) / SUM( a_i, dim=3 ) 1834 ztmp4(:,:,1) = SUM( ht_s * a_i, dim=3 ) / SUM( a_i, dim=3 ) 1835 ELSEWHERE 1836 ztmp3(:,:,1) = 0. 1837 ztmp4(:,:,1) = 0. 1838 END WHERE 1839 CASE default ; CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_thick%clcat' ) 1840 END SELECT 1434 1841 CASE default ; CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_thick%cldes' ) 1435 1842 END SELECT 1436 IF( ssnd(jps_hice)%laction ) CALL cpl_ prism_snd( jps_hice, isec, ztmp3, info )1437 IF( ssnd(jps_hsnw)%laction ) CALL cpl_ prism_snd( jps_hsnw, isec, ztmp4, info )1843 IF( ssnd(jps_hice)%laction ) CALL cpl_snd( jps_hice, isec, ztmp3, info ) 1844 IF( ssnd(jps_hsnw)%laction ) CALL cpl_snd( jps_hsnw, isec, ztmp4, info ) 1438 1845 ENDIF 1439 1846 ! … … 1442 1849 ! ! CO2 flux from PISCES ! 1443 1850 ! ! ------------------------- ! 1444 IF( ssnd(jps_co2)%laction ) CALL cpl_ prism_snd( jps_co2, isec, RESHAPE ( oce_co2, (/jpi,jpj,1/) ) , info )1851 IF( ssnd(jps_co2)%laction ) CALL cpl_snd( jps_co2, isec, RESHAPE ( oce_co2, (/jpi,jpj,1/) ) , info ) 1445 1852 ! 1446 1853 #endif … … 1457 1864 ! i-1 i i 1458 1865 ! i i+1 (for I) 1459 SELECT CASE( TRIM( sn_snd_crt%cldes ) ) 1460 CASE( 'oce only' ) ! C-grid ==> T 1461 DO jj = 2, jpjm1 1462 DO ji = fs_2, fs_jpim1 ! vector opt. 1463 zotx1(ji,jj) = 0.5 * ( un(ji,jj,1) + un(ji-1,jj ,1) ) 1464 zoty1(ji,jj) = 0.5 * ( vn(ji,jj,1) + vn(ji ,jj-1,1) ) 1465 END DO 1466 END DO 1467 CASE( 'weighted oce and ice' ) 1468 SELECT CASE ( cp_ice_msh ) 1469 CASE( 'C' ) ! Ocean and Ice on C-grid ==> T 1866 IF( nn_components == jp_iam_opa ) THEN 1867 zotx1(:,:) = un(:,:,1) 1868 zoty1(:,:) = vn(:,:,1) 1869 ELSE 1870 SELECT CASE( TRIM( sn_snd_crt%cldes ) ) 1871 CASE( 'oce only' ) ! C-grid ==> T 1470 1872 DO jj = 2, jpjm1 1471 1873 DO ji = fs_2, fs_jpim1 ! vector opt. 1472 zotx1(ji,jj) = 0.5 * ( un (ji,jj,1) + un (ji-1,jj ,1) ) * zfr_l(ji,jj) 1473 zoty1(ji,jj) = 0.5 * ( vn (ji,jj,1) + vn (ji ,jj-1,1) ) * zfr_l(ji,jj) 1474 zitx1(ji,jj) = 0.5 * ( u_ice(ji,jj ) + u_ice(ji-1,jj ) ) * fr_i(ji,jj) 1475 zity1(ji,jj) = 0.5 * ( v_ice(ji,jj ) + v_ice(ji ,jj-1 ) ) * fr_i(ji,jj) 1874 zotx1(ji,jj) = 0.5 * ( un(ji,jj,1) + un(ji-1,jj ,1) ) 1875 zoty1(ji,jj) = 0.5 * ( vn(ji,jj,1) + vn(ji ,jj-1,1) ) 1476 1876 END DO 1477 1877 END DO 1478 CASE( 'I' ) ! Ocean on C grid, Ice on I-point (B-grid) ==> T 1479 DO jj = 2, jpjm1 1480 DO ji = 2, jpim1 ! NO vector opt. 1481 zotx1(ji,jj) = 0.5 * ( un(ji,jj,1) + un(ji-1,jj ,1) ) * zfr_l(ji,jj) 1482 zoty1(ji,jj) = 0.5 * ( vn(ji,jj,1) + vn(ji ,jj-1,1) ) * zfr_l(ji,jj) 1483 zitx1(ji,jj) = 0.25 * ( u_ice(ji+1,jj+1) + u_ice(ji,jj+1) & 1484 & + u_ice(ji+1,jj ) + u_ice(ji,jj ) ) * fr_i(ji,jj) 1485 zity1(ji,jj) = 0.25 * ( v_ice(ji+1,jj+1) + v_ice(ji,jj+1) & 1486 & + v_ice(ji+1,jj ) + v_ice(ji,jj ) ) * fr_i(ji,jj) 1878 CASE( 'weighted oce and ice' ) 1879 SELECT CASE ( cp_ice_msh ) 1880 CASE( 'C' ) ! Ocean and Ice on C-grid ==> T 1881 DO jj = 2, jpjm1 1882 DO ji = fs_2, fs_jpim1 ! vector opt. 1883 zotx1(ji,jj) = 0.5 * ( un (ji,jj,1) + un (ji-1,jj ,1) ) * zfr_l(ji,jj) 1884 zoty1(ji,jj) = 0.5 * ( vn (ji,jj,1) + vn (ji ,jj-1,1) ) * zfr_l(ji,jj) 1885 zitx1(ji,jj) = 0.5 * ( u_ice(ji,jj ) + u_ice(ji-1,jj ) ) * fr_i(ji,jj) 1886 zity1(ji,jj) = 0.5 * ( v_ice(ji,jj ) + v_ice(ji ,jj-1 ) ) * fr_i(ji,jj) 1887 END DO 1487 1888 END DO 1488 END DO1489 CASE( 'F' ) ! Ocean on C grid, Ice on F-point (B-grid) ==> T1490 DO jj = 2, jpjm11491 DO ji = 2, jpim1 ! NO vector opt.1492 zotx1(ji,jj) = 0.5 * ( un(ji,jj,1) + un(ji-1,jj,1) ) * zfr_l(ji,jj)1493 zoty1(ji,jj) = 0.5 * ( vn(ji,jj,1) + vn(ji ,jj-1,1) ) * zfr_l(ji,jj)1494 zitx1(ji,jj) = 0.25 * ( u_ice(ji-1,jj-1) + u_ice(ji,jj-1) &1495 & + u_ice(ji-1,jj ) + u_ice(ji,jj ) ) * fr_i(ji,jj)1496 zity1(ji,jj) = 0.25 * ( v_ice(ji-1,jj-1) + v_ice(ji,jj-1) &1497 & + v_ice(ji-1,jj ) + v_ice(ji,jj ) ) * fr_i(ji,jj)1889 CASE( 'I' ) ! Ocean on C grid, Ice on I-point (B-grid) ==> T 1890 DO jj = 2, jpjm1 1891 DO ji = 2, jpim1 ! NO vector opt. 1892 zotx1(ji,jj) = 0.5 * ( un(ji,jj,1) + un(ji-1,jj ,1) ) * zfr_l(ji,jj) 1893 zoty1(ji,jj) = 0.5 * ( vn(ji,jj,1) + vn(ji ,jj-1,1) ) * zfr_l(ji,jj) 1894 zitx1(ji,jj) = 0.25 * ( u_ice(ji+1,jj+1) + u_ice(ji,jj+1) & 1895 & + u_ice(ji+1,jj ) + u_ice(ji,jj ) ) * fr_i(ji,jj) 1896 zity1(ji,jj) = 0.25 * ( v_ice(ji+1,jj+1) + v_ice(ji,jj+1) & 1897 & + v_ice(ji+1,jj ) + v_ice(ji,jj ) ) * fr_i(ji,jj) 1898 END DO 1498 1899 END DO 1499 END DO 1900 CASE( 'F' ) ! Ocean on C grid, Ice on F-point (B-grid) ==> T 1901 DO jj = 2, jpjm1 1902 DO ji = 2, jpim1 ! NO vector opt. 1903 zotx1(ji,jj) = 0.5 * ( un(ji,jj,1) + un(ji-1,jj ,1) ) * zfr_l(ji,jj) 1904 zoty1(ji,jj) = 0.5 * ( vn(ji,jj,1) + vn(ji ,jj-1,1) ) * zfr_l(ji,jj) 1905 zitx1(ji,jj) = 0.25 * ( u_ice(ji-1,jj-1) + u_ice(ji,jj-1) & 1906 & + u_ice(ji-1,jj ) + u_ice(ji,jj ) ) * fr_i(ji,jj) 1907 zity1(ji,jj) = 0.25 * ( v_ice(ji-1,jj-1) + v_ice(ji,jj-1) & 1908 & + v_ice(ji-1,jj ) + v_ice(ji,jj ) ) * fr_i(ji,jj) 1909 END DO 1910 END DO 1911 END SELECT 1912 CALL lbc_lnk( zitx1, 'T', -1. ) ; CALL lbc_lnk( zity1, 'T', -1. ) 1913 CASE( 'mixed oce-ice' ) 1914 SELECT CASE ( cp_ice_msh ) 1915 CASE( 'C' ) ! Ocean and Ice on C-grid ==> T 1916 DO jj = 2, jpjm1 1917 DO ji = fs_2, fs_jpim1 ! vector opt. 1918 zotx1(ji,jj) = 0.5 * ( un (ji,jj,1) + un (ji-1,jj ,1) ) * zfr_l(ji,jj) & 1919 & + 0.5 * ( u_ice(ji,jj ) + u_ice(ji-1,jj ) ) * fr_i(ji,jj) 1920 zoty1(ji,jj) = 0.5 * ( vn (ji,jj,1) + vn (ji ,jj-1,1) ) * zfr_l(ji,jj) & 1921 & + 0.5 * ( v_ice(ji,jj ) + v_ice(ji ,jj-1 ) ) * fr_i(ji,jj) 1922 END DO 1923 END DO 1924 CASE( 'I' ) ! Ocean on C grid, Ice on I-point (B-grid) ==> T 1925 DO jj = 2, jpjm1 1926 DO ji = 2, jpim1 ! NO vector opt. 1927 zotx1(ji,jj) = 0.5 * ( un(ji,jj,1) + un(ji-1,jj ,1) ) * zfr_l(ji,jj) & 1928 & + 0.25 * ( u_ice(ji+1,jj+1) + u_ice(ji,jj+1) & 1929 & + u_ice(ji+1,jj ) + u_ice(ji,jj ) ) * fr_i(ji,jj) 1930 zoty1(ji,jj) = 0.5 * ( vn(ji,jj,1) + vn(ji ,jj-1,1) ) * zfr_l(ji,jj) & 1931 & + 0.25 * ( v_ice(ji+1,jj+1) + v_ice(ji,jj+1) & 1932 & + v_ice(ji+1,jj ) + v_ice(ji,jj ) ) * fr_i(ji,jj) 1933 END DO 1934 END DO 1935 CASE( 'F' ) ! Ocean on C grid, Ice on F-point (B-grid) ==> T 1936 DO jj = 2, jpjm1 1937 DO ji = 2, jpim1 ! NO vector opt. 1938 zotx1(ji,jj) = 0.5 * ( un(ji,jj,1) + un(ji-1,jj ,1) ) * zfr_l(ji,jj) & 1939 & + 0.25 * ( u_ice(ji-1,jj-1) + u_ice(ji,jj-1) & 1940 & + u_ice(ji-1,jj ) + u_ice(ji,jj ) ) * fr_i(ji,jj) 1941 zoty1(ji,jj) = 0.5 * ( vn(ji,jj,1) + vn(ji ,jj-1,1) ) * zfr_l(ji,jj) & 1942 & + 0.25 * ( v_ice(ji-1,jj-1) + v_ice(ji,jj-1) & 1943 & + v_ice(ji-1,jj ) + v_ice(ji,jj ) ) * fr_i(ji,jj) 1944 END DO 1945 END DO 1946 END SELECT 1500 1947 END SELECT 1501 CALL lbc_lnk( zitx1, 'T', -1. ) ; CALL lbc_lnk( zity1, 'T', -1. ) 1502 CASE( 'mixed oce-ice' ) 1503 SELECT CASE ( cp_ice_msh ) 1504 CASE( 'C' ) ! Ocean and Ice on C-grid ==> T 1505 DO jj = 2, jpjm1 1506 DO ji = fs_2, fs_jpim1 ! vector opt. 1507 zotx1(ji,jj) = 0.5 * ( un (ji,jj,1) + un (ji-1,jj ,1) ) * zfr_l(ji,jj) & 1508 & + 0.5 * ( u_ice(ji,jj ) + u_ice(ji-1,jj ) ) * fr_i(ji,jj) 1509 zoty1(ji,jj) = 0.5 * ( vn (ji,jj,1) + vn (ji ,jj-1,1) ) * zfr_l(ji,jj) & 1510 & + 0.5 * ( v_ice(ji,jj ) + v_ice(ji ,jj-1 ) ) * fr_i(ji,jj) 1511 END DO 1512 END DO 1513 CASE( 'I' ) ! Ocean on C grid, Ice on I-point (B-grid) ==> T 1514 DO jj = 2, jpjm1 1515 DO ji = 2, jpim1 ! NO vector opt. 1516 zotx1(ji,jj) = 0.5 * ( un(ji,jj,1) + un(ji-1,jj ,1) ) * zfr_l(ji,jj) & 1517 & + 0.25 * ( u_ice(ji+1,jj+1) + u_ice(ji,jj+1) & 1518 & + u_ice(ji+1,jj ) + u_ice(ji,jj ) ) * fr_i(ji,jj) 1519 zoty1(ji,jj) = 0.5 * ( vn(ji,jj,1) + vn(ji ,jj-1,1) ) * zfr_l(ji,jj) & 1520 & + 0.25 * ( v_ice(ji+1,jj+1) + v_ice(ji,jj+1) & 1521 & + v_ice(ji+1,jj ) + v_ice(ji,jj ) ) * fr_i(ji,jj) 1522 END DO 1523 END DO 1524 CASE( 'F' ) ! Ocean on C grid, Ice on F-point (B-grid) ==> T 1525 DO jj = 2, jpjm1 1526 DO ji = 2, jpim1 ! NO vector opt. 1527 zotx1(ji,jj) = 0.5 * ( un(ji,jj,1) + un(ji-1,jj ,1) ) * zfr_l(ji,jj) & 1528 & + 0.25 * ( u_ice(ji-1,jj-1) + u_ice(ji,jj-1) & 1529 & + u_ice(ji-1,jj ) + u_ice(ji,jj ) ) * fr_i(ji,jj) 1530 zoty1(ji,jj) = 0.5 * ( vn(ji,jj,1) + vn(ji ,jj-1,1) ) * zfr_l(ji,jj) & 1531 & + 0.25 * ( v_ice(ji-1,jj-1) + v_ice(ji,jj-1) & 1532 & + v_ice(ji-1,jj ) + v_ice(ji,jj ) ) * fr_i(ji,jj) 1533 END DO 1534 END DO 1535 END SELECT 1536 END SELECT 1537 CALL lbc_lnk( zotx1, ssnd(jps_ocx1)%clgrid, -1. ) ; CALL lbc_lnk( zoty1, ssnd(jps_ocy1)%clgrid, -1. ) 1948 CALL lbc_lnk( zotx1, ssnd(jps_ocx1)%clgrid, -1. ) ; CALL lbc_lnk( zoty1, ssnd(jps_ocy1)%clgrid, -1. ) 1949 ! 1950 ENDIF 1538 1951 ! 1539 1952 ! … … 1565 1978 ENDIF 1566 1979 ! 1567 IF( ssnd(jps_ocx1)%laction ) CALL cpl_ prism_snd( jps_ocx1, isec, RESHAPE ( zotx1, (/jpi,jpj,1/) ), info ) ! ocean x current 1st grid1568 IF( ssnd(jps_ocy1)%laction ) CALL cpl_ prism_snd( jps_ocy1, isec, RESHAPE ( zoty1, (/jpi,jpj,1/) ), info ) ! ocean y current 1st grid1569 IF( ssnd(jps_ocz1)%laction ) CALL cpl_ prism_snd( jps_ocz1, isec, RESHAPE ( zotz1, (/jpi,jpj,1/) ), info ) ! ocean z current 1st grid1980 IF( ssnd(jps_ocx1)%laction ) CALL cpl_snd( jps_ocx1, isec, RESHAPE ( zotx1, (/jpi,jpj,1/) ), info ) ! ocean x current 1st grid 1981 IF( ssnd(jps_ocy1)%laction ) CALL cpl_snd( jps_ocy1, isec, RESHAPE ( zoty1, (/jpi,jpj,1/) ), info ) ! ocean y current 1st grid 1982 IF( ssnd(jps_ocz1)%laction ) CALL cpl_snd( jps_ocz1, isec, RESHAPE ( zotz1, (/jpi,jpj,1/) ), info ) ! ocean z current 1st grid 1570 1983 ! 1571 IF( ssnd(jps_ivx1)%laction ) CALL cpl_ prism_snd( jps_ivx1, isec, RESHAPE ( zitx1, (/jpi,jpj,1/) ), info ) ! ice x current 1st grid1572 IF( ssnd(jps_ivy1)%laction ) CALL cpl_ prism_snd( jps_ivy1, isec, RESHAPE ( zity1, (/jpi,jpj,1/) ), info ) ! ice y current 1st grid1573 IF( ssnd(jps_ivz1)%laction ) CALL cpl_ prism_snd( jps_ivz1, isec, RESHAPE ( zitz1, (/jpi,jpj,1/) ), info ) ! ice z current 1st grid1984 IF( ssnd(jps_ivx1)%laction ) CALL cpl_snd( jps_ivx1, isec, RESHAPE ( zitx1, (/jpi,jpj,1/) ), info ) ! ice x current 1st grid 1985 IF( ssnd(jps_ivy1)%laction ) CALL cpl_snd( jps_ivy1, isec, RESHAPE ( zity1, (/jpi,jpj,1/) ), info ) ! ice y current 1st grid 1986 IF( ssnd(jps_ivz1)%laction ) CALL cpl_snd( jps_ivz1, isec, RESHAPE ( zitz1, (/jpi,jpj,1/) ), info ) ! ice z current 1st grid 1574 1987 ! 1575 1988 ENDIF 1576 1989 ! 1990 ! 1991 ! Fields sent by OPA to SAS when doing OPA<->SAS coupling 1992 ! ! SSH 1993 IF( ssnd(jps_ssh )%laction ) THEN 1994 ! ! removed inverse barometer ssh when Patm 1995 ! forcing is used (for sea-ice dynamics) 1996 IF( ln_apr_dyn ) THEN ; ztmp1(:,:) = sshb(:,:) - 0.5 * ( ssh_ib(:,:) + ssh_ibb(:,:) ) 1997 ELSE ; ztmp1(:,:) = sshn(:,:) 1998 ENDIF 1999 CALL cpl_snd( jps_ssh , isec, RESHAPE ( ztmp1 , (/jpi,jpj,1/) ), info ) 2000 2001 ENDIF 2002 ! ! SSS 2003 IF( ssnd(jps_soce )%laction ) THEN 2004 CALL cpl_snd( jps_soce , isec, RESHAPE ( tsn(:,:,1,jp_sal), (/jpi,jpj,1/) ), info ) 2005 ENDIF 2006 ! ! first T level thickness 2007 IF( ssnd(jps_e3t1st )%laction ) THEN 2008 CALL cpl_snd( jps_e3t1st, isec, RESHAPE ( fse3t_n(:,:,1) , (/jpi,jpj,1/) ), info ) 2009 ENDIF 2010 ! ! Qsr fraction 2011 IF( ssnd(jps_fraqsr)%laction ) THEN 2012 CALL cpl_snd( jps_fraqsr, isec, RESHAPE ( fraqsr_1lev(:,:) , (/jpi,jpj,1/) ), info ) 2013 ENDIF 2014 ! 2015 ! Fields sent by SAS to OPA when OASIS coupling 2016 ! ! Solar heat flux 2017 IF( ssnd(jps_qsroce)%laction ) CALL cpl_snd( jps_qsroce, isec, RESHAPE ( qsr , (/jpi,jpj,1/) ), info ) 2018 IF( ssnd(jps_qnsoce)%laction ) CALL cpl_snd( jps_qnsoce, isec, RESHAPE ( qns , (/jpi,jpj,1/) ), info ) 2019 IF( ssnd(jps_oemp )%laction ) CALL cpl_snd( jps_oemp , isec, RESHAPE ( emp , (/jpi,jpj,1/) ), info ) 2020 IF( ssnd(jps_sflx )%laction ) CALL cpl_snd( jps_sflx , isec, RESHAPE ( sfx , (/jpi,jpj,1/) ), info ) 2021 IF( ssnd(jps_otx1 )%laction ) CALL cpl_snd( jps_otx1 , isec, RESHAPE ( utau, (/jpi,jpj,1/) ), info ) 2022 IF( ssnd(jps_oty1 )%laction ) CALL cpl_snd( jps_oty1 , isec, RESHAPE ( vtau, (/jpi,jpj,1/) ), info ) 2023 IF( ssnd(jps_rnf )%laction ) CALL cpl_snd( jps_rnf , isec, RESHAPE ( rnf , (/jpi,jpj,1/) ), info ) 2024 IF( ssnd(jps_taum )%laction ) CALL cpl_snd( jps_taum , isec, RESHAPE ( taum, (/jpi,jpj,1/) ), info ) 2025 1577 2026 CALL wrk_dealloc( jpi,jpj, zfr_l, ztmp1, ztmp2, zotx1, zoty1, zotz1, zitx1, zity1, zitz1 ) 1578 2027 CALL wrk_dealloc( jpi,jpj,jpl, ztmp3, ztmp4 ) … … 1582 2031 END SUBROUTINE sbc_cpl_snd 1583 2032 1584 #else1585 !!----------------------------------------------------------------------1586 !! Dummy module NO coupling1587 !!----------------------------------------------------------------------1588 USE par_kind ! kind definition1589 CONTAINS1590 SUBROUTINE sbc_cpl_snd( kt )1591 WRITE(*,*) 'sbc_cpl_snd: You should not have seen this print! error?', kt1592 END SUBROUTINE sbc_cpl_snd1593 !1594 SUBROUTINE sbc_cpl_rcv( kt, k_fsbc, k_ice )1595 WRITE(*,*) 'sbc_cpl_snd: You should not have seen this print! error?', kt, k_fsbc, k_ice1596 END SUBROUTINE sbc_cpl_rcv1597 !1598 SUBROUTINE sbc_cpl_ice_tau( p_taui, p_tauj )1599 REAL(wp), INTENT(out), DIMENSION(:,:) :: p_taui ! i- & j-components of atmos-ice stress [N/m2]1600 REAL(wp), INTENT(out), DIMENSION(:,:) :: p_tauj ! at I-point (B-grid) or U & V-point (C-grid)1601 p_taui(:,:) = 0. ; p_tauj(:,:) = 0. ! stupid definition to avoid warning message when compiling...1602 WRITE(*,*) 'sbc_cpl_snd: You should not have seen this print! error?'1603 END SUBROUTINE sbc_cpl_ice_tau1604 !1605 SUBROUTINE sbc_cpl_ice_flx( p_frld , palbi , psst , pist )1606 REAL(wp), INTENT(in ), DIMENSION(:,: ) :: p_frld ! lead fraction [0 to 1]1607 REAL(wp), INTENT(in ), DIMENSION(:,:,:), OPTIONAL :: palbi ! ice albedo1608 REAL(wp), INTENT(in ), DIMENSION(:,: ), OPTIONAL :: psst ! sea surface temperature [Celcius]1609 REAL(wp), INTENT(in ), DIMENSION(:,:,:), OPTIONAL :: pist ! ice surface temperature [Kelvin]1610 WRITE(*,*) 'sbc_cpl_snd: You should not have seen this print! error?', p_frld(1,1), palbi(1,1,1), psst(1,1), pist(1,1,1)1611 END SUBROUTINE sbc_cpl_ice_flx1612 1613 #endif1614 1615 2033 !!====================================================================== 1616 2034 END MODULE sbccpl -
branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/sbcflx.F90
r4624 r5837 156 156 END DO 157 157 END DO 158 taum(:,:) = taum(:,:) * tmask(:,:,1) ; wndm(:,:) = wndm(:,:) * tmask(:,:,1) 158 159 CALL lbc_lnk( taum(:,:), 'T', 1. ) ; CALL lbc_lnk( wndm(:,:), 'T', 1. ) 159 160 -
branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/sbcfwb.F90
r4347 r5837 8 8 !! 3.0 ! 2006-08 (G. Madec) Surface module 9 9 !! 3.2 ! 2009-07 (C. Talandier) emp mean s spread over erp area 10 !! 3.6 ! 2014-11 (P. Mathiot ) add ice shelf melting 10 11 !!---------------------------------------------------------------------- 11 12 … … 19 20 USE phycst ! physical constants 20 21 USE sbcrnf ! ocean runoffs 22 USE sbcisf ! ice shelf melting contribution 21 23 USE sbcssr ! SS damping terms 22 24 USE in_out_manager ! I/O manager … … 57 59 !! =1 global mean of emp set to zero at each nn_fsbc time step 58 60 !! =2 annual global mean corrected from previous year 61 !! =3 global mean of emp set to zero at each nn_fsbc time step 62 !! & spread out over erp area depending its sign 59 63 !! Note: if sea ice is embedded it is taken into account when computing the budget 60 64 !!---------------------------------------------------------------------- … … 81 85 IF( kn_fwb == 1 ) WRITE(numout,*) ' instantaneously set to zero' 82 86 IF( kn_fwb == 2 ) WRITE(numout,*) ' adjusted from previous year budget' 83 ENDIF 84 ! 85 area = glob_sum( e1e2t(:,:) ) ! interior global domain surface 86 ! 87 #if ! defined key_lim2 && ! defined key_lim3 && ! defined key_cice 87 IF( kn_fwb == 3 ) WRITE(numout,*) ' fwf set to zero and spread out over erp area' 88 ENDIF 89 ! 90 IF( kn_fwb == 3 .AND. nn_sssr /= 2 ) CALL ctl_stop( 'sbc_fwb: nn_fwb = 3 requires nn_sssr = 2, we stop ' ) 91 IF( kn_fwb == 3 .AND. ln_isfcav ) CALL ctl_stop( 'sbc_fwb: nn_fwb = 3 with ln_isfcav = .TRUE. not working, we stop ' ) 92 ! 93 area = glob_sum( e1e2t(:,:) * tmask(:,:,1)) ! interior global domain surface 94 ! isf cavities are excluded because it can feedback to the melting with generation of inhibition of plumes 95 ! and in case of no melt, it can generate HSSW. 96 ! 97 #if ! defined key_lim2 && ! defined key_lim3 && ! defined key_cice 88 98 snwice_mass_b(:,:) = 0.e0 ! no sea-ice model is being used : no snow+ice mass 89 99 snwice_mass (:,:) = 0.e0 … … 98 108 ! 99 109 IF( MOD( kt-1, kn_fsbc ) == 0 ) THEN 100 z_fwf = glob_sum( e1e2t(:,:) * ( emp(:,:) - rnf(:,:) - snwice_fmass(:,:) ) ) / area ! sum over the global domain110 z_fwf = glob_sum( e1e2t(:,:) * ( emp(:,:) - rnf(:,:) + rdivisf * fwfisf(:,:) - snwice_fmass(:,:) ) ) / area ! sum over the global domain 101 111 zcoef = z_fwf * rcp 102 emp(:,:) = emp(:,:) - z_fwf 103 qns(:,:) = qns(:,:) + zcoef * sst_m(:,:) ! account for change to the heat budget due to fw correction112 emp(:,:) = emp(:,:) - z_fwf * tmask(:,:,1) 113 qns(:,:) = qns(:,:) + zcoef * sst_m(:,:) * tmask(:,:,1) ! account for change to the heat budget due to fw correction 104 114 ENDIF 105 115 ! … … 132 142 IF( MOD( kt-1, kn_fsbc ) == 0 ) THEN ! correct the freshwater fluxes 133 143 zcoef = fwfold * rcp 134 emp(:,:) = emp(:,:) + fwfold 135 qns(:,:) = qns(:,:) - zcoef * sst_m(:,:) ! account for change to the heat budget due to fw correction144 emp(:,:) = emp(:,:) + fwfold * tmask(:,:,1) 145 qns(:,:) = qns(:,:) - zcoef * sst_m(:,:) * tmask(:,:,1) ! account for change to the heat budget due to fw correction 136 146 ENDIF 137 147 ! … … 142 152 ENDIF 143 153 ! 154 CASE ( 3 ) !== global fwf set to zero and spread out over erp area ==! 155 ! 156 IF( MOD( kt-1, kn_fsbc ) == 0 ) THEN 157 ztmsk_pos(:,:) = tmask_i(:,:) ! Select <0 and >0 area of erp 158 WHERE( erp < 0._wp ) ztmsk_pos = 0._wp 159 ztmsk_neg(:,:) = tmask_i(:,:) - ztmsk_pos(:,:) 160 ! 161 zsurf_neg = glob_sum( e1e2t(:,:)*ztmsk_neg(:,:) ) ! Area filled by <0 and >0 erp 162 zsurf_pos = glob_sum( e1e2t(:,:)*ztmsk_pos(:,:) ) 163 ! ! fwf global mean (excluding ocean to ice/snow exchanges) 164 z_fwf = glob_sum( e1e2t(:,:) * ( emp(:,:) - rnf(:,:) + rdivisf * fwfisf(:,:) - snwice_fmass(:,:) ) ) / area 165 ! 166 IF( z_fwf < 0._wp ) THEN ! spread out over >0 erp area to increase evaporation 167 zsurf_tospread = zsurf_pos 168 ztmsk_tospread(:,:) = ztmsk_pos(:,:) 169 ELSE ! spread out over <0 erp area to increase precipitation 170 zsurf_tospread = zsurf_neg 171 ztmsk_tospread(:,:) = ztmsk_neg(:,:) 172 ENDIF 173 ! 174 zsum_fwf = glob_sum( e1e2t(:,:) * z_fwf ) ! fwf global mean over <0 or >0 erp area 175 !!gm : zsum_fwf = z_fwf * area ??? it is right? I think so.... 176 z_fwf_nsrf = zsum_fwf / ( zsurf_tospread + rsmall ) 177 ! ! weight to respect erp field 2D structure 178 zsum_erp = glob_sum( ztmsk_tospread(:,:) * erp(:,:) * e1e2t(:,:) ) 179 z_wgt(:,:) = ztmsk_tospread(:,:) * erp(:,:) / ( zsum_erp + rsmall ) 180 ! ! final correction term to apply 181 zerp_cor(:,:) = -1. * z_fwf_nsrf * zsurf_tospread * z_wgt(:,:) 182 ! 183 !!gm ===>>>> lbc_lnk should be useless as all the computation is done over the whole domain ! 184 CALL lbc_lnk( zerp_cor, 'T', 1. ) 185 ! 186 emp(:,:) = emp(:,:) + zerp_cor(:,:) 187 qns(:,:) = qns(:,:) - zerp_cor(:,:) * rcp * sst_m(:,:) ! account for change to the heat budget due to fw correction 188 erp(:,:) = erp(:,:) + zerp_cor(:,:) 189 ! 190 IF( nprint == 1 .AND. lwp ) THEN ! control print 191 IF( z_fwf < 0._wp ) THEN 192 WRITE(numout,*)' z_fwf < 0' 193 WRITE(numout,*)' SUM(erp+) = ', SUM( ztmsk_tospread(:,:)*erp(:,:)*e1e2t(:,:) )*1.e-9,' Sv' 194 ELSE 195 WRITE(numout,*)' z_fwf >= 0' 196 WRITE(numout,*)' SUM(erp-) = ', SUM( ztmsk_tospread(:,:)*erp(:,:)*e1e2t(:,:) )*1.e-9,' Sv' 197 ENDIF 198 WRITE(numout,*)' SUM(empG) = ', SUM( z_fwf*e1e2t(:,:) )*1.e-9,' Sv' 199 WRITE(numout,*)' z_fwf = ', z_fwf ,' Kg/m2/s' 200 WRITE(numout,*)' z_fwf_nsrf = ', z_fwf_nsrf ,' Kg/m2/s' 201 WRITE(numout,*)' MIN(zerp_cor) = ', MINVAL(zerp_cor) 202 WRITE(numout,*)' MAX(zerp_cor) = ', MAXVAL(zerp_cor) 203 ENDIF 204 ENDIF 205 ! 144 206 CASE DEFAULT !== you should never be there ==! 145 CALL ctl_stop( 'sbc_fwb : wrong nn_fwb value for the FreshWater Budget correction, choose either 1 or 2' )207 CALL ctl_stop( 'sbc_fwb : wrong nn_fwb value for the FreshWater Budget correction, choose either 1, 2 or 3' ) 146 208 ! 147 209 END SELECT -
branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/sbcice_cice.F90
- Property svn:keywords set to Id
r4627 r5837 17 17 USE phycst, only : rcp, rau0, r1_rau0, rhosn, rhoic 18 18 USE in_out_manager ! I/O manager 19 USE iom, ONLY : iom_put,iom_use ! I/O manager library !!Joakim edit 19 20 USE lib_mpp ! distributed memory computing library 20 21 USE lbclnk ! ocean lateral boundary conditions (or mpp link) … … 23 24 USE daymod ! calendar 24 25 USE fldread ! read input fields 25 26 26 USE sbc_oce ! Surface boundary condition: ocean fields 27 27 USE sbc_ice ! Surface boundary condition: ice fields … … 38 38 USE ice_calendar, only: dt 39 39 USE ice_state, only: aice,aicen,uvel,vvel,vsno,vsnon,vice,vicen 40 # if defined key_cice4 40 41 USE ice_flux, only: strax,stray,strocnx,strocny,frain,fsnow, & 42 strocnxT,strocnyT, & 41 43 sst,sss,uocn,vocn,ss_tltx,ss_tlty,fsalt_gbm, & 42 44 fresh_gbm,fhocn_gbm,fswthru_gbm,frzmlt, & … … 44 46 uatm,vatm,wind,fsw,flw,Tair,potT,Qa,rhoa,zlvl, & 45 47 swvdr,swvdf,swidr,swidf 48 USE ice_therm_vertical, only: calc_Tsfc 49 #else 50 USE ice_flux, only: strax,stray,strocnx,strocny,frain,fsnow, & 51 strocnxT,strocnyT, & 52 sst,sss,uocn,vocn,ss_tltx,ss_tlty,fsalt_ai, & 53 fresh_ai,fhocn_ai,fswthru_ai,frzmlt, & 54 flatn_f,fsurfn_f,fcondtopn_f, & 55 uatm,vatm,wind,fsw,flw,Tair,potT,Qa,rhoa,zlvl, & 56 swvdr,swvdf,swidr,swidf 57 USE ice_therm_shared, only: calc_Tsfc 58 #endif 46 59 USE ice_forcing, only: frcvdr,frcvdf,frcidr,frcidf 47 60 USE ice_atmo, only: calc_strair 48 USE ice_therm_vertical, only: calc_Tsfc49 61 50 62 USE CICE_InitMod … … 84 96 # include "domzgr_substitute.h90" 85 97 98 !! $Id$ 86 99 CONTAINS 87 100 … … 95 108 END FUNCTION sbc_ice_cice_alloc 96 109 97 SUBROUTINE sbc_ice_cice( kt, nsbc )110 SUBROUTINE sbc_ice_cice( kt, ksbc ) 98 111 !!--------------------------------------------------------------------- 99 112 !! *** ROUTINE sbc_ice_cice *** … … 113 126 !!--------------------------------------------------------------------- 114 127 INTEGER, INTENT(in) :: kt ! ocean time step 115 INTEGER, INTENT(in) :: nsbc ! surface forcing type128 INTEGER, INTENT(in) :: ksbc ! surface forcing type 116 129 !!---------------------------------------------------------------------- 117 130 ! … … 123 136 124 137 ! Make sure any fluxes required for CICE are set 125 IF ( nsbc == 2 )THEN138 IF ( ksbc == jp_flx ) THEN 126 139 CALL cice_sbc_force(kt) 127 ELSE IF ( nsbc == 5) THEN140 ELSE IF ( ksbc == jp_purecpl ) THEN 128 141 CALL sbc_cpl_ice_flx( 1.0-fr_i ) 129 142 ENDIF 130 143 131 CALL cice_sbc_in ( kt, nsbc )144 CALL cice_sbc_in ( kt, ksbc ) 132 145 CALL CICE_Run 133 CALL cice_sbc_out ( kt, nsbc )134 135 IF ( nsbc == 5) CALL cice_sbc_hadgam(kt+1)146 CALL cice_sbc_out ( kt, ksbc ) 147 148 IF ( ksbc == jp_purecpl ) CALL cice_sbc_hadgam(kt+1) 136 149 137 150 ENDIF ! End sea-ice time step only … … 141 154 END SUBROUTINE sbc_ice_cice 142 155 143 SUBROUTINE cice_sbc_init ( nsbc)156 SUBROUTINE cice_sbc_init (ksbc) 144 157 !!--------------------------------------------------------------------- 145 158 !! *** ROUTINE cice_sbc_init *** 146 159 !! ** Purpose: Initialise ice related fields for NEMO and coupling 147 160 !! 148 INTEGER, INTENT( in ) :: nsbc ! surface forcing type161 INTEGER, INTENT( in ) :: ksbc ! surface forcing type 149 162 REAL(wp), DIMENSION(:,:), POINTER :: ztmp1, ztmp2 150 163 REAL(wp) :: zcoefu, zcoefv, zcoeff ! local scalar 151 INTEGER :: ji, jj, jl 164 INTEGER :: ji, jj, jl, jk ! dummy loop indices 152 165 !!--------------------------------------------------------------------- 153 166 … … 161 174 jj_off = INT ( (jpjglo - ny_global) / 2 ) 162 175 176 #if defined key_nemocice_decomp 177 ! Pass initial SST from NEMO to CICE so ice is initialised correctly if 178 ! there is no restart file. 179 ! Values from a CICE restart file would overwrite this 180 IF ( .NOT. ln_rstart ) THEN 181 CALL nemo2cice( tsn(:,:,1,jp_tem) , sst , 'T' , 1.) 182 ENDIF 183 #endif 184 163 185 ! Initialize CICE 164 186 CALL CICE_Initialize 165 187 166 188 ! Do some CICE consistency checks 167 IF ( ( nsbc == 2) .OR. (nsbc == 5) ) THEN189 IF ( (ksbc == jp_flx) .OR. (ksbc == jp_purecpl) ) THEN 168 190 IF ( calc_strair .OR. calc_Tsfc ) THEN 169 191 CALL ctl_stop( 'STOP', 'cice_sbc_init : Forcing option requires calc_strair=F and calc_Tsfc=F in ice_in' ) 170 192 ENDIF 171 ELSEIF ( nsbc == 4) THEN193 ELSEIF (ksbc == jp_core) THEN 172 194 IF ( .NOT. (calc_strair .AND. calc_Tsfc) ) THEN 173 195 CALL ctl_stop( 'STOP', 'cice_sbc_init : Forcing option requires calc_strair=T and calc_Tsfc=T in ice_in' ) … … 190 212 191 213 CALL cice2nemo(aice,fr_i, 'T', 1. ) 192 IF ( ( nsbc == 2).OR.(nsbc == 5) ) THEN214 IF ( (ksbc == jp_flx) .OR. (ksbc == jp_purecpl) ) THEN 193 215 DO jl=1,ncat 194 216 CALL cice2nemo(aicen(:,:,jl,:),a_i(:,:,jl), 'T', 1. ) … … 218 240 snwice_mass_b(:,:) = 0.0_wp ! no mass exchanges 219 241 ENDIF 220 IF( nn_ice_embd == 2 .AND. & ! full embedment (case 2) & no restart : 221 & .NOT.ln_rstart ) THEN ! deplete the initial ssh belew sea-ice area 222 sshn(:,:) = sshn(:,:) - snwice_mass(:,:) * r1_rau0 223 sshb(:,:) = sshb(:,:) - snwice_mass(:,:) * r1_rau0 224 ! 242 IF( .NOT. ln_rstart ) THEN 243 IF( nn_ice_embd == 2 ) THEN ! full embedment (case 2) deplete the initial ssh below sea-ice area 244 sshn(:,:) = sshn(:,:) - snwice_mass(:,:) * r1_rau0 245 sshb(:,:) = sshb(:,:) - snwice_mass(:,:) * r1_rau0 246 #if defined key_vvl 247 ! key_vvl necessary? clem: yes for compilation purpose 248 DO jk = 1,jpkm1 ! adjust initial vertical scale factors 249 fse3t_n(:,:,jk) = e3t_0(:,:,jk)*( 1._wp + sshn(:,:)*tmask(:,:,1)/(ht_0(:,:) + 1.0 - tmask(:,:,1)) ) 250 fse3t_b(:,:,jk) = e3t_0(:,:,jk)*( 1._wp + sshb(:,:)*tmask(:,:,1)/(ht_0(:,:) + 1.0 - tmask(:,:,1)) ) 251 ENDDO 252 fse3t_a(:,:,:) = fse3t_b(:,:,:) 253 ! Reconstruction of all vertical scale factors at now and before time 254 ! steps 255 ! ============================================================================= 256 ! Horizontal scale factor interpolations 257 ! -------------------------------------- 258 CALL dom_vvl_interpol( fse3t_b(:,:,:), fse3u_b(:,:,:), 'U' ) 259 CALL dom_vvl_interpol( fse3t_b(:,:,:), fse3v_b(:,:,:), 'V' ) 260 CALL dom_vvl_interpol( fse3t_n(:,:,:), fse3u_n(:,:,:), 'U' ) 261 CALL dom_vvl_interpol( fse3t_n(:,:,:), fse3v_n(:,:,:), 'V' ) 262 CALL dom_vvl_interpol( fse3u_n(:,:,:), fse3f_n(:,:,:), 'F' ) 263 ! Vertical scale factor interpolations 264 ! ------------------------------------ 265 CALL dom_vvl_interpol( fse3t_n(:,:,:), fse3w_n (:,:,:), 'W' ) 266 CALL dom_vvl_interpol( fse3u_n(:,:,:), fse3uw_n(:,:,:), 'UW' ) 267 CALL dom_vvl_interpol( fse3v_n(:,:,:), fse3vw_n(:,:,:), 'VW' ) 268 CALL dom_vvl_interpol( fse3u_b(:,:,:), fse3uw_b(:,:,:), 'UW' ) 269 CALL dom_vvl_interpol( fse3v_b(:,:,:), fse3vw_b(:,:,:), 'VW' ) 270 ! t- and w- points depth 271 ! ---------------------- 272 fsdept_n(:,:,1) = 0.5_wp * fse3w_n(:,:,1) 273 fsdepw_n(:,:,1) = 0.0_wp 274 fsde3w_n(:,:,1) = fsdept_n(:,:,1) - sshn(:,:) 275 DO jk = 2, jpk 276 fsdept_n(:,:,jk) = fsdept_n(:,:,jk-1) + fse3w_n(:,:,jk) 277 fsdepw_n(:,:,jk) = fsdepw_n(:,:,jk-1) + fse3t_n(:,:,jk-1) 278 fsde3w_n(:,:,jk) = fsdept_n(:,:,jk ) - sshn (:,:) 279 END DO 280 #endif 281 ENDIF 225 282 ENDIF 226 283 … … 232 289 233 290 234 SUBROUTINE cice_sbc_in (kt, nsbc)291 SUBROUTINE cice_sbc_in (kt, ksbc) 235 292 !!--------------------------------------------------------------------- 236 293 !! *** ROUTINE cice_sbc_in *** … … 238 295 !!--------------------------------------------------------------------- 239 296 INTEGER, INTENT(in ) :: kt ! ocean time step 240 INTEGER, INTENT(in ) :: nsbc ! surface forcing type297 INTEGER, INTENT(in ) :: ksbc ! surface forcing type 241 298 242 299 INTEGER :: ji, jj, jl ! dummy loop indices … … 262 319 ! forced and coupled case 263 320 264 IF ( ( nsbc == 2).OR.(nsbc == 5) ) THEN321 IF ( (ksbc == jp_flx).OR.(ksbc == jp_purecpl) ) THEN 265 322 266 323 ztmpn(:,:,:)=0.0 … … 287 344 288 345 ! Surface downward latent heat flux (CI_5) 289 IF ( nsbc == 2) THEN346 IF (ksbc == jp_flx) THEN 290 347 DO jl=1,ncat 291 348 ztmpn(:,:,jl)=qla_ice(:,:,1)*a_i(:,:,jl) … … 316 373 ! GBM conductive flux through ice (CI_6) 317 374 ! Convert to GBM 318 IF ( nsbc == 2) THEN375 IF (ksbc == jp_flx) THEN 319 376 ztmp(:,:) = botmelt(:,:,jl)*a_i(:,:,jl) 320 377 ELSE … … 325 382 ! GBM surface heat flux (CI_7) 326 383 ! Convert to GBM 327 IF ( nsbc == 2) THEN384 IF (ksbc == jp_flx) THEN 328 385 ztmp(:,:) = (topmelt(:,:,jl)+botmelt(:,:,jl))*a_i(:,:,jl) 329 386 ELSE … … 333 390 ENDDO 334 391 335 ELSE IF ( nsbc == 4) THEN392 ELSE IF (ksbc == jp_core) THEN 336 393 337 394 ! Pass CORE forcing fields to CICE (which will calculate heat fluxes etc itself) … … 375 432 376 433 ! Snowfall 377 ! Ensure fsnow is positive (as in CICE routine prepare_forcing) 434 ! Ensure fsnow is positive (as in CICE routine prepare_forcing) 435 IF( iom_use('snowpre') ) CALL iom_put('snowpre',MAX( (1.0-fr_i(:,:))*sprecip(:,:) ,0.0)) !!Joakim edit 378 436 ztmp(:,:)=MAX(fr_i(:,:)*sprecip(:,:),0.0) 379 437 CALL nemo2cice(ztmp,fsnow,'T', 1. ) 380 438 381 439 ! Rainfall 440 IF( iom_use('precip') ) CALL iom_put('precip', (1.0-fr_i(:,:))*(tprecip(:,:)-sprecip(:,:)) ) !!Joakim edit 382 441 ztmp(:,:)=fr_i(:,:)*(tprecip(:,:)-sprecip(:,:)) 383 442 CALL nemo2cice(ztmp,frain,'T', 1. ) … … 450 509 CALL nemo2cice(ztmp,ss_tlty,'F', -1. ) 451 510 452 CALL wrk_dealloc( jpi,jpj, ztmp )511 CALL wrk_dealloc( jpi,jpj, ztmp, zpice ) 453 512 CALL wrk_dealloc( jpi,jpj,ncat, ztmpn ) 454 513 ! … … 458 517 459 518 460 SUBROUTINE cice_sbc_out (kt, nsbc)519 SUBROUTINE cice_sbc_out (kt,ksbc) 461 520 !!--------------------------------------------------------------------- 462 521 !! *** ROUTINE cice_sbc_out *** … … 464 523 !!--------------------------------------------------------------------- 465 524 INTEGER, INTENT( in ) :: kt ! ocean time step 466 INTEGER, INTENT( in ) :: nsbc ! surface forcing type525 INTEGER, INTENT( in ) :: ksbc ! surface forcing type 467 526 468 527 INTEGER :: ji, jj, jl ! dummy loop indices … … 504 563 ! Combine wind stress and ocean-ice stress 505 564 ! [Note that fr_iu hasn't yet been updated, so still from start of CICE timestep] 565 ! strocnx and strocny already weighted by ice fraction in CICE so not done here 506 566 507 567 utau(:,:)=(1.0-fr_iu(:,:))*utau(:,:)-ss_iou(:,:) 508 568 vtau(:,:)=(1.0-fr_iv(:,:))*vtau(:,:)-ss_iov(:,:) 569 570 ! Also need ice/ocean stress on T points so that taum can be updated 571 ! This interpolation is already done in CICE so best to use those values 572 CALL cice2nemo(strocnxT,ztmp1,'T',-1.) 573 CALL cice2nemo(strocnyT,ztmp2,'T',-1.) 574 575 ! Update taum with modulus of ice-ocean stress 576 ! strocnxT and strocnyT are not weighted by ice fraction in CICE so must be done here 577 taum(:,:)=(1.0-fr_i(:,:))*taum(:,:)+fr_i(:,:)*SQRT(ztmp1**2. + ztmp2**2.) 509 578 510 579 ! Freshwater fluxes 511 580 512 IF ( nsbc == 2) THEN581 IF (ksbc == jp_flx) THEN 513 582 ! Note that emp from the forcing files is evap*(1-aice)-(tprecip-aice*sprecip) 514 583 ! What we want here is evap*(1-aice)-tprecip*(1-aice) hence manipulation below … … 516 585 ! Better to use evap and tprecip? (but for now don't read in evap in this case) 517 586 emp(:,:) = emp(:,:)+fr_i(:,:)*(tprecip(:,:)-sprecip(:,:)) 518 ELSE IF ( nsbc == 4) THEN587 ELSE IF (ksbc == jp_core) THEN 519 588 emp(:,:) = (1.0-fr_i(:,:))*emp(:,:) 520 ELSE IF ( nsbc ==5) THEN589 ELSE IF (ksbc == jp_purecpl) THEN 521 590 ! emp_tot is set in sbc_cpl_ice_flx (called from cice_sbc_in above) 522 591 ! This is currently as required with the coupling fields from the UM atmosphere … … 524 593 ENDIF 525 594 595 #if defined key_cice4 526 596 CALL cice2nemo(fresh_gbm,ztmp1,'T', 1. ) 527 597 CALL cice2nemo(fsalt_gbm,ztmp2,'T', 1. ) 598 #else 599 CALL cice2nemo(fresh_ai,ztmp1,'T', 1. ) 600 CALL cice2nemo(fsalt_ai,ztmp2,'T', 1. ) 601 #endif 528 602 529 603 ! Check to avoid unphysical expression when ice is forming (ztmp1 negative) … … 535 609 sfx(:,:)=ztmp2(:,:)*1000.0 536 610 emp(:,:)=emp(:,:)-ztmp1(:,:) 537 611 fmmflx(:,:) = ztmp1(:,:) !!Joakim edit 612 538 613 CALL lbc_lnk( emp , 'T', 1. ) 539 614 CALL lbc_lnk( sfx , 'T', 1. ) … … 543 618 ! Scale qsr and qns according to ice fraction (bulk formulae only) 544 619 545 IF ( nsbc == 4) THEN620 IF (ksbc == jp_core) THEN 546 621 qsr(:,:)=qsr(:,:)*(1.0-fr_i(:,:)) 547 622 qns(:,:)=qns(:,:)*(1.0-fr_i(:,:)) 548 623 ENDIF 549 624 ! Take into account snow melting except for fully coupled when already in qns_tot 550 IF ( nsbc == 5) THEN625 IF (ksbc == jp_purecpl) THEN 551 626 qsr(:,:)= qsr_tot(:,:) 552 627 qns(:,:)= qns_tot(:,:) … … 557 632 ! Now add in ice / snow related terms 558 633 ! [fswthru will be zero unless running with calc_Tsfc=T in CICE] 634 #if defined key_cice4 559 635 CALL cice2nemo(fswthru_gbm,ztmp1,'T', 1. ) 636 #else 637 CALL cice2nemo(fswthru_ai,ztmp1,'T', 1. ) 638 #endif 560 639 qsr(:,:)=qsr(:,:)+ztmp1(:,:) 561 640 CALL lbc_lnk( qsr , 'T', 1. ) … … 567 646 ENDDO 568 647 648 #if defined key_cice4 569 649 CALL cice2nemo(fhocn_gbm,ztmp1,'T', 1. ) 650 #else 651 CALL cice2nemo(fhocn_ai,ztmp1,'T', 1. ) 652 #endif 570 653 qns(:,:)=qns(:,:)+nfrzmlt(:,:)+ztmp1(:,:) 571 654 … … 575 658 576 659 CALL cice2nemo(aice,fr_i,'T', 1. ) 577 IF ( ( nsbc == 2).OR.(nsbc == 5) ) THEN660 IF ( (ksbc == jp_flx).OR.(ksbc == jp_purecpl) ) THEN 578 661 DO jl=1,ncat 579 662 CALL cice2nemo(aicen(:,:,jl,:),a_i(:,:,jl), 'T', 1. ) … … 611 694 612 695 613 #if defined key_oasis3 || defined key_oasis4614 696 SUBROUTINE cice_sbc_hadgam( kt ) 615 697 !!--------------------------------------------------------------------- … … 653 735 END SUBROUTINE cice_sbc_hadgam 654 736 655 #else656 SUBROUTINE cice_sbc_hadgam( kt ) ! Dummy routine657 INTEGER, INTENT( in ) :: kt ! ocean time step658 WRITE(*,*) 'cice_sbc_hadgam: You should not have seen this print! error?'659 END SUBROUTINE cice_sbc_hadgam660 #endif661 737 662 738 SUBROUTINE cice_sbc_final … … 713 789 IF( kt == nit000 ) THEN ! First call kt=nit000 ! 714 790 ! ! ====================== ! 791 ! namsbc_cice is not yet in the reference namelist 792 ! set file information (default values) 793 cn_dir = './' ! directory in which the model is executed 794 795 ! (NB: frequency positive => hours, negative => months) 796 ! ! file ! frequency ! variable ! time intep ! clim ! 'yearly' or ! weights ! rotation ! landmask 797 ! ! name ! (hours) ! name ! (T/F) ! (T/F) ! 'monthly' ! filename ! pairs ! file 798 sn_snow = FLD_N( 'snowfall_1m' , -1. , 'snowfall' , .true. , .true. , ' yearly' , '' , '' , '' ) 799 sn_rain = FLD_N( 'rainfall_1m' , -1. , 'rainfall' , .true. , .true. , ' yearly' , '' , '' , '' ) 800 sn_sblm = FLD_N( 'sublim_1m' , -1. , 'sublim' , .true. , .true. , ' yearly' , '' , '' , '' ) 801 sn_top1 = FLD_N( 'topmeltn1_1m' , -1. , 'topmeltn1' , .true. , .true. , ' yearly' , '' , '' , '' ) 802 sn_top2 = FLD_N( 'topmeltn2_1m' , -1. , 'topmeltn2' , .true. , .true. , ' yearly' , '' , '' , '' ) 803 sn_top3 = FLD_N( 'topmeltn3_1m' , -1. , 'topmeltn3' , .true. , .true. , ' yearly' , '' , '' , '' ) 804 sn_top4 = FLD_N( 'topmeltn4_1m' , -1. , 'topmeltn4' , .true. , .true. , ' yearly' , '' , '' , '' ) 805 sn_top5 = FLD_N( 'topmeltn5_1m' , -1. , 'topmeltn5' , .true. , .true. , ' yearly' , '' , '' , '' ) 806 sn_bot1 = FLD_N( 'botmeltn1_1m' , -1. , 'botmeltn1' , .true. , .true. , ' yearly' , '' , '' , '' ) 807 sn_bot2 = FLD_N( 'botmeltn2_1m' , -1. , 'botmeltn2' , .true. , .true. , ' yearly' , '' , '' , '' ) 808 sn_bot3 = FLD_N( 'botmeltn3_1m' , -1. , 'botmeltn3' , .true. , .true. , ' yearly' , '' , '' , '' ) 809 sn_bot4 = FLD_N( 'botmeltn4_1m' , -1. , 'botmeltn4' , .true. , .true. , ' yearly' , '' , '' , '' ) 810 sn_bot5 = FLD_N( 'botmeltn5_1m' , -1. , 'botmeltn5' , .true. , .true. , ' yearly' , '' , '' , '' ) 811 715 812 REWIND( numnam_ref ) ! Namelist namsbc_cice in reference namelist : 716 813 READ ( numnam_ref, namsbc_cice, IOSTAT = ios, ERR = 901) … … 999 1096 !! Default option Dummy module NO CICE sea-ice model 1000 1097 !!---------------------------------------------------------------------- 1098 !! $Id$ 1001 1099 CONTAINS 1002 1100 1003 SUBROUTINE sbc_ice_cice ( kt, nsbc ) ! Dummy routine1101 SUBROUTINE sbc_ice_cice ( kt, ksbc ) ! Dummy routine 1004 1102 WRITE(*,*) 'sbc_ice_cice: You should not have seen this print! error?', kt 1005 1103 END SUBROUTINE sbc_ice_cice 1006 1104 1007 SUBROUTINE cice_sbc_init ( nsbc) ! Dummy routine1105 SUBROUTINE cice_sbc_init (ksbc) ! Dummy routine 1008 1106 WRITE(*,*) 'cice_sbc_init: You should not have seen this print! error?' 1009 1107 END SUBROUTINE cice_sbc_init -
branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/sbcice_if.F90
r4624 r5837 16 16 USE eosbn2 ! equation of state 17 17 USE sbc_oce ! surface boundary condition: ocean fields 18 USE sbccpl 18 #if defined key_lim3 19 USE ice , ONLY : a_i 20 #else 21 USE sbc_ice, ONLY : a_i 22 #endif 19 23 USE fldread ! read input field 20 24 USE iom ! I/O manager library … … 99 103 ! ( d rho / dt ) / ( d rho / ds ) ( s = 34, t = -1.8 ) 100 104 101 fr_i(:,:) = tfreez( sss_m ) * tmask(:,:,1) ! sea surface freezing temperature [Celcius]105 fr_i(:,:) = eos_fzp( sss_m ) * tmask(:,:,1) ! sea surface freezing temperature [Celcius] 102 106 103 ! OM : probleme. a_i pas defini dans les cas lim3 et cice 104 #if defined key_coupled && defined key_lim2 105 a_i(:,:,1) = fr_i(:,:) 106 #endif 107 IF( ln_cpl ) a_i(:,:,1) = fr_i(:,:) 107 108 108 109 ! Flux and ice fraction computation 109 !CDIR COLLAPSE110 110 DO jj = 1, jpj 111 111 DO ji = 1, jpi -
branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/sbcice_lim.F90
r4333 r5837 12 12 !! 3.4 ! 2011-01 (A Porter) dynamical allocation 13 13 !! - ! 2012-10 (C. Rousset) add lim_diahsb 14 !! 3.6 ! 2014-07 (M. Vancoppenolle, G. Madec, O. Marti) revise coupled interface 14 15 !!---------------------------------------------------------------------- 15 16 #if defined key_lim3 … … 18 19 !!---------------------------------------------------------------------- 19 20 !! sbc_ice_lim : sea-ice model time-stepping and update ocean sbc over ice-covered area 20 !! lim_ctl : alerts in case of ice model crash21 !! lim_prt_state : ice control print at a given grid point22 21 !!---------------------------------------------------------------------- 23 22 USE oce ! ocean dynamics and tracers 24 23 USE dom_oce ! ocean space and time domain 25 USE par_ice ! sea-ice parameters26 24 USE ice ! LIM-3: ice variables 27 USE iceini ! LIM-3: ice initialisation25 USE thd_ice ! LIM-3: thermodynamical variables 28 26 USE dom_ice ! LIM-3: ice domain 29 27 … … 39 37 USE limdyn ! Ice dynamics 40 38 USE limtrp ! Ice transport 39 USE limhdf ! Ice horizontal diffusion 41 40 USE limthd ! Ice thermodynamics 42 USE limitd_th ! Thermodynamics on ice thickness distribution43 41 USE limitd_me ! Mechanics on ice thickness distribution 44 42 USE limsbc ! sea surface boundary condition … … 46 44 USE limwri ! Ice outputs 47 45 USE limrst ! Ice restarts 48 USE limupdate1 49 USE limupdate2 46 USE limupdate1 ! update of global variables 47 USE limupdate2 ! update of global variables 50 48 USE limvar ! Ice variables switch 49 50 USE limmsh ! LIM mesh 51 USE limistate ! LIM initial state 52 USE limthd_sal ! LIM ice thermodynamics: salinity 51 53 52 54 USE c1d ! 1D vertical configuration … … 59 61 USE prtctl ! Print control 60 62 USE lib_fortran ! 63 USE limctl 61 64 62 65 #if defined key_bdy … … 68 71 69 72 PUBLIC sbc_ice_lim ! routine called by sbcmod.F90 73 PUBLIC sbc_lim_init ! routine called by sbcmod.F90 70 74 71 75 !! * Substitutions … … 79 83 CONTAINS 80 84 81 FUNCTION fice_cell_ave ( ptab) 85 !!====================================================================== 86 87 SUBROUTINE sbc_ice_lim( kt, kblk ) 88 !!--------------------------------------------------------------------- 89 !! *** ROUTINE sbc_ice_lim *** 90 !! 91 !! ** Purpose : update the ocean surface boundary condition via the 92 !! Louvain la Neuve Sea Ice Model time stepping 93 !! 94 !! ** Method : ice model time stepping 95 !! - call the ice dynamics routine 96 !! - call the ice advection/diffusion routine 97 !! - call the ice thermodynamics routine 98 !! - call the routine that computes mass and 99 !! heat fluxes at the ice/ocean interface 100 !! - save the outputs 101 !! - save the outputs for restart when necessary 102 !! 103 !! ** Action : - time evolution of the LIM sea-ice model 104 !! - update all sbc variables below sea-ice: 105 !! utau, vtau, taum, wndm, qns , qsr, emp , sfx 106 !!--------------------------------------------------------------------- 107 INTEGER, INTENT(in) :: kt ! ocean time step 108 INTEGER, INTENT(in) :: kblk ! type of bulk (=3 CLIO, =4 CORE, =5 COUPLED) 109 !! 110 INTEGER :: jl ! dummy loop index 111 REAL(wp), POINTER, DIMENSION(:,:,:) :: zalb_os, zalb_cs ! ice albedo under overcast/clear sky 112 REAL(wp), POINTER, DIMENSION(:,:,:) :: zalb_ice ! mean ice albedo (for coupled) 113 REAL(wp), POINTER, DIMENSION(:,: ) :: zutau_ice, zvtau_ice 114 !!---------------------------------------------------------------------- 115 116 IF( nn_timing == 1 ) CALL timing_start('sbc_ice_lim') 117 118 !-----------------------! 119 ! --- Ice time step --- ! 120 !-----------------------! 121 IF( MOD( kt-1, nn_fsbc ) == 0 ) THEN 122 123 ! mean surface ocean current at ice velocity point (C-grid dynamics : U- & V-points as the ocean) 124 u_oce(:,:) = ssu_m(:,:) * umask(:,:,1) 125 v_oce(:,:) = ssv_m(:,:) * vmask(:,:,1) 126 127 ! masked sea surface freezing temperature [Kelvin] (set to rt0 over land) 128 t_bo(:,:) = ( eos_fzp( sss_m ) + rt0 ) * tmask(:,:,1) + rt0 * ( 1._wp - tmask(:,:,1) ) 129 130 ! Mask sea ice surface temperature (set to rt0 over land) 131 DO jl = 1, jpl 132 t_su(:,:,jl) = t_su(:,:,jl) * tmask(:,:,1) + rt0 * ( 1._wp - tmask(:,:,1) ) 133 END DO 134 ! 135 !------------------------------------------------! 136 ! --- Dynamical coupling with the atmosphere --- ! 137 !------------------------------------------------! 138 ! It provides the following fields: 139 ! utau_ice, vtau_ice : surface ice stress (U- & V-points) [N/m2] 140 !----------------------------------------------------------------- 141 SELECT CASE( kblk ) 142 CASE( jp_clio ) ; CALL blk_ice_clio_tau ! CLIO bulk formulation 143 CASE( jp_core ) ; CALL blk_ice_core_tau ! CORE bulk formulation 144 CASE( jp_purecpl ) ; CALL sbc_cpl_ice_tau( utau_ice , vtau_ice ) ! Coupled formulation 145 END SELECT 146 147 IF( ln_mixcpl) THEN ! Case of a mixed Bulk/Coupled formulation 148 CALL wrk_alloc( jpi,jpj , zutau_ice, zvtau_ice) 149 CALL sbc_cpl_ice_tau( zutau_ice , zvtau_ice ) 150 utau_ice(:,:) = utau_ice(:,:) * xcplmask(:,:,0) + zutau_ice(:,:) * ( 1. - xcplmask(:,:,0) ) 151 vtau_ice(:,:) = vtau_ice(:,:) * xcplmask(:,:,0) + zvtau_ice(:,:) * ( 1. - xcplmask(:,:,0) ) 152 CALL wrk_dealloc( jpi,jpj , zutau_ice, zvtau_ice) 153 ENDIF 154 155 !-------------------------------------------------------! 156 ! --- ice dynamics and transport (except in 1D case) ---! 157 !-------------------------------------------------------! 158 numit = numit + nn_fsbc ! Ice model time step 159 ! 160 CALL sbc_lim_bef ! Store previous ice values 161 CALL sbc_lim_diag0 ! set diag of mass, heat and salt fluxes to 0 162 CALL lim_rst_opn( kt ) ! Open Ice restart file 163 ! 164 IF( .NOT. lk_c1d ) THEN 165 ! 166 CALL lim_dyn( kt ) ! Ice dynamics ( rheology/dynamics ) 167 ! 168 CALL lim_trp( kt ) ! Ice transport ( Advection/diffusion ) 169 ! 170 IF( nn_monocat /= 2 ) CALL lim_itd_me ! Mechanical redistribution ! (ridging/rafting) 171 ! 172 #if defined key_bdy 173 CALL bdy_ice_lim( kt ) ! bdy ice thermo 174 IF( ln_icectl ) CALL lim_prt( kt, iiceprt, jiceprt, 1, ' - ice thermo bdy - ' ) 175 #endif 176 ! 177 CALL lim_update1( kt ) ! Corrections 178 ! 179 ENDIF 180 181 ! previous lead fraction and ice volume for flux calculations 182 CALL sbc_lim_bef 183 CALL lim_var_glo2eqv ! ht_i and ht_s for ice albedo calculation 184 CALL lim_var_agg(1) ! at_i for coupling (via pfrld) 185 pfrld(:,:) = 1._wp - at_i(:,:) 186 phicif(:,:) = vt_i(:,:) 187 188 !------------------------------------------------------! 189 ! --- Thermodynamical coupling with the atmosphere --- ! 190 !------------------------------------------------------! 191 ! It provides the following fields: 192 ! qsr_ice , qns_ice : solar & non solar heat flux over ice (T-point) [W/m2] 193 ! qla_ice : latent heat flux over ice (T-point) [W/m2] 194 ! dqns_ice, dqla_ice : non solar & latent heat sensistivity (T-point) [W/m2] 195 ! tprecip , sprecip : total & solid precipitation (T-point) [Kg/m2/s] 196 ! fr1_i0 , fr2_i0 : 1sr & 2nd fraction of qsr penetration in ice [%] 197 !---------------------------------------------------------------------------------------- 198 CALL wrk_alloc( jpi,jpj,jpl, zalb_os, zalb_cs, zalb_ice ) 199 CALL albedo_ice( t_su, ht_i, ht_s, zalb_cs, zalb_os ) ! cloud-sky and overcast-sky ice albedos 200 201 SELECT CASE( kblk ) 202 CASE( jp_clio ) ! CLIO bulk formulation 203 ! In CLIO the cloud fraction is read in the climatology and the all-sky albedo 204 ! (zalb_ice) is computed within the bulk routine 205 CALL blk_ice_clio_flx( t_su, zalb_cs, zalb_os, zalb_ice ) 206 IF( ln_mixcpl ) CALL sbc_cpl_ice_flx( p_frld=pfrld, palbi=zalb_ice, psst=sst_m, pist=t_su ) 207 IF( nn_limflx /= 2 ) CALL ice_lim_flx( t_su, zalb_ice, qns_ice, qsr_ice, dqns_ice, evap_ice, devap_ice, nn_limflx ) 208 CASE( jp_core ) ! CORE bulk formulation 209 ! albedo depends on cloud fraction because of non-linear spectral effects 210 zalb_ice(:,:,:) = ( 1. - cldf_ice ) * zalb_cs(:,:,:) + cldf_ice * zalb_os(:,:,:) 211 CALL blk_ice_core_flx( t_su, zalb_ice ) 212 IF( ln_mixcpl ) CALL sbc_cpl_ice_flx( p_frld=pfrld, palbi=zalb_ice, psst=sst_m, pist=t_su ) 213 IF( nn_limflx /= 2 ) CALL ice_lim_flx( t_su, zalb_ice, qns_ice, qsr_ice, dqns_ice, evap_ice, devap_ice, nn_limflx ) 214 CASE ( jp_purecpl ) 215 ! albedo depends on cloud fraction because of non-linear spectral effects 216 zalb_ice(:,:,:) = ( 1. - cldf_ice ) * zalb_cs(:,:,:) + cldf_ice * zalb_os(:,:,:) 217 CALL sbc_cpl_ice_flx( p_frld=pfrld, palbi=zalb_ice, psst=sst_m, pist=t_su ) 218 ! clem: evap_ice is forced to 0 in coupled mode for now 219 ! but it needs to be changed (along with modif in limthd_dh) once heat flux from evap will be avail. from atm. models 220 evap_ice (:,:,:) = 0._wp ; devap_ice (:,:,:) = 0._wp 221 IF( nn_limflx == 2 ) CALL ice_lim_flx( t_su, zalb_ice, qns_ice, qsr_ice, dqns_ice, evap_ice, devap_ice, nn_limflx ) 222 END SELECT 223 CALL wrk_dealloc( jpi,jpj,jpl, zalb_os, zalb_cs, zalb_ice ) 224 225 !----------------------------! 226 ! --- ice thermodynamics --- ! 227 !----------------------------! 228 CALL lim_thd( kt ) ! Ice thermodynamics 229 ! 230 CALL lim_update2( kt ) ! Corrections 231 ! 232 CALL lim_sbc_flx( kt ) ! Update surface ocean mass, heat and salt fluxes 233 ! 234 IF(ln_limdiaout) CALL lim_diahsb ! Diagnostics and outputs 235 ! 236 CALL lim_wri( 1 ) ! Ice outputs 237 ! 238 IF( kt == nit000 .AND. ln_rstart ) & 239 & CALL iom_close( numrir ) ! close input ice restart file 240 ! 241 IF( lrst_ice ) CALL lim_rst_write( kt ) ! Ice restart file 242 ! 243 IF( ln_icectl ) CALL lim_ctl( kt ) ! alerts in case of model crash 244 ! 245 ENDIF ! End sea-ice time step only 246 247 !-------------------------! 248 ! --- Ocean time step --- ! 249 !-------------------------! 250 ! Update surface ocean stresses (only in ice-dynamic case) otherwise the atm.-ocean stresses are used everywhere 251 IF( ln_limdyn ) CALL lim_sbc_tau( kt, ub(:,:,1), vb(:,:,1) ) ! using before instantaneous surf. currents 252 !!gm remark, the ocean-ice stress is not saved in ice diag call above ..... find a solution!!! 253 ! 254 IF( nn_timing == 1 ) CALL timing_stop('sbc_ice_lim') 255 ! 256 END SUBROUTINE sbc_ice_lim 257 258 259 SUBROUTINE sbc_lim_init 260 !!---------------------------------------------------------------------- 261 !! *** ROUTINE sbc_lim_init *** 262 !! 263 !! ** purpose : Allocate all the dynamic arrays of the LIM-3 modules 264 !!---------------------------------------------------------------------- 265 INTEGER :: ierr 266 !!---------------------------------------------------------------------- 267 IF(lwp) WRITE(numout,*) 268 IF(lwp) WRITE(numout,*) 'sbc_ice_lim : update ocean surface boudary condition' 269 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ via Louvain la Neuve Ice Model (LIM-3) time stepping' 270 ! 271 ! Open the reference and configuration namelist files and namelist output file 272 CALL ctl_opn( numnam_ice_ref, 'namelist_ice_ref', 'OLD', 'FORMATTED', 'SEQUENTIAL', -1, numout, lwp ) 273 CALL ctl_opn( numnam_ice_cfg, 'namelist_ice_cfg', 'OLD', 'FORMATTED', 'SEQUENTIAL', -1, numout, lwp ) 274 IF(lwm) CALL ctl_opn( numoni, 'output.namelist.ice', 'UNKNOWN', 'FORMATTED', 'SEQUENTIAL', -1, numout, lwp, 1 ) 275 276 CALL ice_run ! set some ice run parameters 277 ! 278 ! ! Allocate the ice arrays 279 ierr = ice_alloc () ! ice variables 280 ierr = ierr + dom_ice_alloc () ! domain 281 ierr = ierr + sbc_ice_alloc () ! surface forcing 282 ierr = ierr + thd_ice_alloc () ! thermodynamics 283 ierr = ierr + lim_itd_me_alloc () ! ice thickness distribution - mechanics 284 ! 285 IF( lk_mpp ) CALL mpp_sum( ierr ) 286 IF( ierr /= 0 ) CALL ctl_stop('STOP', 'sbc_lim_init : unable to allocate ice arrays') 287 ! 288 ! ! adequation jpk versus ice/snow layers/categories 289 IF( jpl > jpk .OR. (nlay_i+1) > jpk .OR. nlay_s > jpk ) & 290 & CALL ctl_stop( 'STOP', & 291 & 'sbc_lim_init: the 3rd dimension of workspace arrays is too small.', & 292 & 'use more ocean levels or less ice/snow layers/categories.' ) 293 ! 294 CALL lim_itd_init ! ice thickness distribution initialization 295 ! 296 CALL lim_hdf_init ! set ice horizontal diffusion computation parameters 297 ! 298 CALL lim_thd_init ! set ice thermodynics parameters 299 ! 300 CALL lim_thd_sal_init ! set ice salinity parameters 301 ! 302 CALL lim_msh ! ice mesh initialization 303 ! 304 CALL lim_itd_me_init ! ice thickness distribution initialization for mecanical deformation 305 ! ! Initial sea-ice state 306 IF( .NOT. ln_rstart ) THEN ! start from rest: sea-ice deduced from sst 307 numit = 0 308 numit = nit000 - 1 309 CALL lim_istate 310 ELSE ! start from a restart file 311 CALL lim_rst_read 312 numit = nit000 - 1 313 ENDIF 314 CALL lim_var_agg(1) 315 CALL lim_var_glo2eqv 316 ! 317 CALL lim_sbc_init ! ice surface boundary condition 318 ! 319 fr_i(:,:) = at_i(:,:) ! initialisation of sea-ice fraction 320 tn_ice(:,:,:) = t_su(:,:,:) ! initialisation of surface temp for coupled simu 321 ! 322 nstart = numit + nn_fsbc 323 nitrun = nitend - nit000 + 1 324 nlast = numit + nitrun 325 ! 326 IF( nstock == 0 ) nstock = nlast + 1 327 ! 328 END SUBROUTINE sbc_lim_init 329 330 331 SUBROUTINE ice_run 332 !!------------------------------------------------------------------- 333 !! *** ROUTINE ice_run *** 334 !! 335 !! ** Purpose : Definition some run parameter for ice model 336 !! 337 !! ** Method : Read the namicerun namelist and check the parameter 338 !! values called at the first timestep (nit000) 339 !! 340 !! ** input : Namelist namicerun 341 !!------------------------------------------------------------------- 342 INTEGER :: ios ! Local integer output status for namelist read 343 NAMELIST/namicerun/ jpl, nlay_i, nlay_s, cn_icerst_in, cn_icerst_indir, cn_icerst_out, cn_icerst_outdir, & 344 & ln_limdyn, rn_amax, ln_limdiahsb, ln_limdiaout, ln_icectl, iiceprt, jiceprt 345 !!------------------------------------------------------------------- 346 ! 347 REWIND( numnam_ice_ref ) ! Namelist namicerun in reference namelist : Parameters for ice 348 READ ( numnam_ice_ref, namicerun, IOSTAT = ios, ERR = 901) 349 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namicerun in reference namelist', lwp ) 350 351 REWIND( numnam_ice_cfg ) ! Namelist namicerun in configuration namelist : Parameters for ice 352 READ ( numnam_ice_cfg, namicerun, IOSTAT = ios, ERR = 902 ) 353 902 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namicerun in configuration namelist', lwp ) 354 IF(lwm) WRITE ( numoni, namicerun ) 355 ! 356 ! 357 IF(lwp) THEN ! control print 358 WRITE(numout,*) 359 WRITE(numout,*) 'ice_run : ice share parameters for dynamics/advection/thermo of sea-ice' 360 WRITE(numout,*) ' ~~~~~~' 361 WRITE(numout,*) ' number of ice categories = ', jpl 362 WRITE(numout,*) ' number of ice layers = ', nlay_i 363 WRITE(numout,*) ' number of snow layers = ', nlay_s 364 WRITE(numout,*) ' switch for ice dynamics (1) or not (0) ln_limdyn = ', ln_limdyn 365 WRITE(numout,*) ' maximum ice concentration = ', rn_amax 366 WRITE(numout,*) ' Diagnose heat/salt budget or not ln_limdiahsb = ', ln_limdiahsb 367 WRITE(numout,*) ' Output heat/salt budget or not ln_limdiaout = ', ln_limdiaout 368 WRITE(numout,*) ' control prints in ocean.out for (i,j)=(iiceprt,jiceprt) = ', ln_icectl 369 WRITE(numout,*) ' i-index for control prints (ln_icectl=true) = ', iiceprt 370 WRITE(numout,*) ' j-index for control prints (ln_icectl=true) = ', jiceprt 371 ENDIF 372 ! 373 ! sea-ice timestep and inverse 374 rdt_ice = nn_fsbc * rdttra(1) 375 r1_rdtice = 1._wp / rdt_ice 376 377 ! inverse of nlay_i and nlay_s 378 r1_nlay_i = 1._wp / REAL( nlay_i, wp ) 379 r1_nlay_s = 1._wp / REAL( nlay_s, wp ) 380 ! 381 #if defined key_bdy 382 IF( lwp .AND. ln_limdiahsb ) CALL ctl_warn('online conservation check activated but it does not work with BDY') 383 #endif 384 ! 385 END SUBROUTINE ice_run 386 387 388 SUBROUTINE lim_itd_init 389 !!------------------------------------------------------------------ 390 !! *** ROUTINE lim_itd_init *** 391 !! 392 !! ** Purpose : Initializes the ice thickness distribution 393 !! ** Method : ... 394 !! ** input : Namelist namiceitd 395 !!------------------------------------------------------------------- 396 INTEGER :: ios ! Local integer output status for namelist read 397 NAMELIST/namiceitd/ nn_catbnd, rn_himean 398 ! 399 INTEGER :: jl ! dummy loop index 400 REAL(wp) :: zc1, zc2, zc3, zx1 ! local scalars 401 REAL(wp) :: zhmax, znum, zden, zalpha ! 402 !!------------------------------------------------------------------ 403 ! 404 REWIND( numnam_ice_ref ) ! Namelist namiceitd in reference namelist : Parameters for ice 405 READ ( numnam_ice_ref, namiceitd, IOSTAT = ios, ERR = 903) 406 903 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namiceitd in reference namelist', lwp ) 407 408 REWIND( numnam_ice_cfg ) ! Namelist namiceitd in configuration namelist : Parameters for ice 409 READ ( numnam_ice_cfg, namiceitd, IOSTAT = ios, ERR = 904 ) 410 904 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namiceitd in configuration namelist', lwp ) 411 IF(lwm) WRITE ( numoni, namiceitd ) 412 ! 413 ! 414 IF(lwp) THEN ! control print 415 WRITE(numout,*) 416 WRITE(numout,*) 'ice_itd : ice cat distribution' 417 WRITE(numout,*) ' ~~~~~~' 418 WRITE(numout,*) ' shape of ice categories distribution nn_catbnd = ', nn_catbnd 419 WRITE(numout,*) ' mean ice thickness in the domain (only active if nn_catbnd=2) rn_himean = ', rn_himean 420 ENDIF 421 422 !---------------------------------- 423 !- Thickness categories boundaries 424 !---------------------------------- 425 IF(lwp) WRITE(numout,*) 426 IF(lwp) WRITE(numout,*) 'lim_itd_init : Initialization of ice cat distribution ' 427 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~' 428 429 hi_max(:) = 0._wp 430 431 SELECT CASE ( nn_catbnd ) 432 !---------------------- 433 CASE (1) ! tanh function (CICE) 434 !---------------------- 435 zc1 = 3._wp / REAL( jpl, wp ) 436 zc2 = 10._wp * zc1 437 zc3 = 3._wp 438 439 DO jl = 1, jpl 440 zx1 = REAL( jl-1, wp ) / REAL( jpl, wp ) 441 hi_max(jl) = hi_max(jl-1) + zc1 + zc2 * (1._wp + TANH( zc3 * (zx1 - 1._wp ) ) ) 442 END DO 443 444 !---------------------- 445 CASE (2) ! h^(-alpha) function 446 !---------------------- 447 zalpha = 0.05 ! exponent of the transform function 448 449 zhmax = 3.*rn_himean 450 451 DO jl = 1, jpl 452 znum = jpl * ( zhmax+1 )**zalpha 453 zden = ( jpl - jl ) * ( zhmax+1 )**zalpha + jl 454 hi_max(jl) = ( znum / zden )**(1./zalpha) - 1 455 END DO 456 457 END SELECT 458 459 DO jl = 1, jpl 460 hi_mean(jl) = ( hi_max(jl) + hi_max(jl-1) ) * 0.5_wp 461 END DO 462 463 ! Set hi_max(jpl) to a big value to ensure that all ice is thinner than hi_max(jpl) 464 hi_max(jpl) = 99._wp 465 466 IF(lwp) WRITE(numout,*) ' Thickness category boundaries ' 467 IF(lwp) WRITE(numout,*) ' hi_max ', hi_max(0:jpl) 468 ! 469 END SUBROUTINE lim_itd_init 470 471 472 SUBROUTINE ice_lim_flx( ptn_ice, palb_ice, pqns_ice, pqsr_ice, pdqn_ice, pevap_ice, pdevap_ice, k_limflx ) 473 !!--------------------------------------------------------------------- 474 !! *** ROUTINE ice_lim_flx *** 475 !! 476 !! ** Purpose : update the ice surface boundary condition by averaging and / or 477 !! redistributing fluxes on ice categories 478 !! 479 !! ** Method : average then redistribute 480 !! 481 !! ** Action : 482 !!--------------------------------------------------------------------- 483 INTEGER , INTENT(in ) :: k_limflx ! =-1 do nothing; =0 average ; 484 ! =1 average and redistribute ; =2 redistribute 485 REAL(wp), DIMENSION(:,:,:), INTENT(in ) :: ptn_ice ! ice surface temperature 486 REAL(wp), DIMENSION(:,:,:), INTENT(in ) :: palb_ice ! ice albedo 487 REAL(wp), DIMENSION(:,:,:), INTENT(inout) :: pqns_ice ! non solar flux 488 REAL(wp), DIMENSION(:,:,:), INTENT(inout) :: pqsr_ice ! net solar flux 489 REAL(wp), DIMENSION(:,:,:), INTENT(inout) :: pdqn_ice ! non solar flux sensitivity 490 REAL(wp), DIMENSION(:,:,:), INTENT(inout) :: pevap_ice ! sublimation 491 REAL(wp), DIMENSION(:,:,:), INTENT(inout) :: pdevap_ice ! sublimation sensitivity 492 ! 493 INTEGER :: jl ! dummy loop index 494 ! 495 REAL(wp), POINTER, DIMENSION(:,:) :: zalb_m ! Mean albedo over all categories 496 REAL(wp), POINTER, DIMENSION(:,:) :: ztem_m ! Mean temperature over all categories 497 ! 498 REAL(wp), POINTER, DIMENSION(:,:) :: z_qsr_m ! Mean solar heat flux over all categories 499 REAL(wp), POINTER, DIMENSION(:,:) :: z_qns_m ! Mean non solar heat flux over all categories 500 REAL(wp), POINTER, DIMENSION(:,:) :: z_evap_m ! Mean sublimation over all categories 501 REAL(wp), POINTER, DIMENSION(:,:) :: z_dqn_m ! Mean d(qns)/dT over all categories 502 REAL(wp), POINTER, DIMENSION(:,:) :: z_devap_m ! Mean d(evap)/dT over all categories 503 !!---------------------------------------------------------------------- 504 505 IF( nn_timing == 1 ) CALL timing_start('ice_lim_flx') 506 ! 507 ! 508 SELECT CASE( k_limflx ) !== averaged on all ice categories ==! 509 CASE( 0 , 1 ) 510 CALL wrk_alloc( jpi,jpj, z_qsr_m, z_qns_m, z_evap_m, z_dqn_m, z_devap_m) 511 ! 512 z_qns_m (:,:) = fice_ice_ave ( pqns_ice (:,:,:) ) 513 z_qsr_m (:,:) = fice_ice_ave ( pqsr_ice (:,:,:) ) 514 z_dqn_m (:,:) = fice_ice_ave ( pdqn_ice (:,:,:) ) 515 z_evap_m (:,:) = fice_ice_ave ( pevap_ice (:,:,:) ) 516 z_devap_m(:,:) = fice_ice_ave ( pdevap_ice (:,:,:) ) 517 DO jl = 1, jpl 518 pdqn_ice (:,:,jl) = z_dqn_m(:,:) 519 pdevap_ice(:,:,jl) = z_devap_m(:,:) 520 END DO 521 ! 522 DO jl = 1, jpl 523 pqns_ice (:,:,jl) = z_qns_m(:,:) 524 pqsr_ice (:,:,jl) = z_qsr_m(:,:) 525 pevap_ice(:,:,jl) = z_evap_m(:,:) 526 END DO 527 ! 528 CALL wrk_dealloc( jpi,jpj, z_qsr_m, z_qns_m, z_evap_m, z_dqn_m, z_devap_m) 529 END SELECT 530 531 SELECT CASE( k_limflx ) !== redistribution on all ice categories ==! 532 CASE( 1 , 2 ) 533 CALL wrk_alloc( jpi,jpj, zalb_m, ztem_m ) 534 ! 535 zalb_m(:,:) = fice_ice_ave ( palb_ice (:,:,:) ) 536 ztem_m(:,:) = fice_ice_ave ( ptn_ice (:,:,:) ) 537 DO jl = 1, jpl 538 pqns_ice (:,:,jl) = pqns_ice (:,:,jl) + pdqn_ice (:,:,jl) * ( ptn_ice(:,:,jl) - ztem_m(:,:) ) 539 pevap_ice(:,:,jl) = pevap_ice(:,:,jl) + pdevap_ice(:,:,jl) * ( ptn_ice(:,:,jl) - ztem_m(:,:) ) 540 pqsr_ice (:,:,jl) = pqsr_ice (:,:,jl) * ( 1._wp - palb_ice(:,:,jl) ) / ( 1._wp - zalb_m(:,:) ) 541 END DO 542 ! 543 CALL wrk_dealloc( jpi,jpj, zalb_m, ztem_m ) 544 END SELECT 545 ! 546 IF( nn_timing == 1 ) CALL timing_stop('ice_lim_flx') 547 ! 548 END SUBROUTINE ice_lim_flx 549 550 SUBROUTINE sbc_lim_bef 551 !!---------------------------------------------------------------------- 552 !! *** ROUTINE sbc_lim_bef *** 553 !! 554 !! ** purpose : store ice variables at "before" time step 555 !!---------------------------------------------------------------------- 556 a_i_b (:,:,:) = a_i (:,:,:) ! ice area 557 e_i_b (:,:,:,:) = e_i (:,:,:,:) ! ice thermal energy 558 v_i_b (:,:,:) = v_i (:,:,:) ! ice volume 559 v_s_b (:,:,:) = v_s (:,:,:) ! snow volume 560 e_s_b (:,:,:,:) = e_s (:,:,:,:) ! snow thermal energy 561 smv_i_b(:,:,:) = smv_i(:,:,:) ! salt content 562 oa_i_b (:,:,:) = oa_i (:,:,:) ! areal age content 563 u_ice_b(:,:) = u_ice(:,:) 564 v_ice_b(:,:) = v_ice(:,:) 565 566 END SUBROUTINE sbc_lim_bef 567 568 SUBROUTINE sbc_lim_diag0 569 !!---------------------------------------------------------------------- 570 !! *** ROUTINE sbc_lim_diag0 *** 571 !! 572 !! ** purpose : set ice-ocean and ice-atm. fluxes to zeros at the beggining 573 !! of the time step 574 !!---------------------------------------------------------------------- 575 sfx (:,:) = 0._wp ; 576 sfx_bri(:,:) = 0._wp ; 577 sfx_sni(:,:) = 0._wp ; sfx_opw(:,:) = 0._wp 578 sfx_bog(:,:) = 0._wp ; sfx_dyn(:,:) = 0._wp 579 sfx_bom(:,:) = 0._wp ; sfx_sum(:,:) = 0._wp 580 sfx_res(:,:) = 0._wp 581 582 wfx_snw(:,:) = 0._wp ; wfx_ice(:,:) = 0._wp 583 wfx_sni(:,:) = 0._wp ; wfx_opw(:,:) = 0._wp 584 wfx_bog(:,:) = 0._wp ; wfx_dyn(:,:) = 0._wp 585 wfx_bom(:,:) = 0._wp ; wfx_sum(:,:) = 0._wp 586 wfx_res(:,:) = 0._wp ; wfx_sub(:,:) = 0._wp 587 wfx_spr(:,:) = 0._wp ; 588 589 hfx_thd(:,:) = 0._wp ; 590 hfx_snw(:,:) = 0._wp ; hfx_opw(:,:) = 0._wp 591 hfx_bog(:,:) = 0._wp ; hfx_dyn(:,:) = 0._wp 592 hfx_bom(:,:) = 0._wp ; hfx_sum(:,:) = 0._wp 593 hfx_res(:,:) = 0._wp ; hfx_sub(:,:) = 0._wp 594 hfx_spr(:,:) = 0._wp ; hfx_dif(:,:) = 0._wp 595 hfx_err(:,:) = 0._wp ; hfx_err_rem(:,:) = 0._wp 596 hfx_err_dif(:,:) = 0._wp ; 597 598 afx_tot(:,:) = 0._wp ; 599 afx_dyn(:,:) = 0._wp ; afx_thd(:,:) = 0._wp 600 601 diag_heat(:,:) = 0._wp ; diag_smvi(:,:) = 0._wp ; 602 diag_vice(:,:) = 0._wp ; diag_vsnw(:,:) = 0._wp ; 603 604 END SUBROUTINE sbc_lim_diag0 605 606 607 FUNCTION fice_cell_ave ( ptab ) 82 608 !!-------------------------------------------------------------------------- 83 609 !! * Compute average over categories, for grid cell (ice covered and free ocean) … … 88 614 89 615 fice_cell_ave (:,:) = 0.0_wp 90 91 616 DO jl = 1, jpl 92 fice_cell_ave (:,:) = fice_cell_ave (:,:) & 93 & + a_i (:,:,jl) * ptab (:,:,jl) 617 fice_cell_ave (:,:) = fice_cell_ave (:,:) + a_i (:,:,jl) * ptab (:,:,jl) 94 618 END DO 95 619 96 620 END FUNCTION fice_cell_ave 97 621 98 FUNCTION fice_ice_ave ( ptab) 622 623 FUNCTION fice_ice_ave ( ptab ) 99 624 !!-------------------------------------------------------------------------- 100 625 !! * Compute average over categories, for ice covered part of grid cell … … 104 629 105 630 fice_ice_ave (:,:) = 0.0_wp 106 WHERE ( at_i (:,:) .GT.0.0_wp ) fice_ice_ave (:,:) = fice_cell_ave ( ptab (:,:,:)) / at_i (:,:)631 WHERE ( at_i (:,:) > 0.0_wp ) fice_ice_ave (:,:) = fice_cell_ave ( ptab (:,:,:)) / at_i (:,:) 107 632 108 633 END FUNCTION fice_ice_ave 109 634 110 !!======================================================================111 112 SUBROUTINE sbc_ice_lim( kt, kblk )113 !!---------------------------------------------------------------------114 !! *** ROUTINE sbc_ice_lim ***115 !!116 !! ** Purpose : update the ocean surface boundary condition via the117 !! Louvain la Neuve Sea Ice Model time stepping118 !!119 !! ** Method : ice model time stepping120 !! - call the ice dynamics routine121 !! - call the ice advection/diffusion routine122 !! - call the ice thermodynamics routine123 !! - call the routine that computes mass and124 !! heat fluxes at the ice/ocean interface125 !! - save the outputs126 !! - save the outputs for restart when necessary127 !!128 !! ** Action : - time evolution of the LIM sea-ice model129 !! - update all sbc variables below sea-ice:130 !! utau, vtau, taum, wndm, qns , qsr, emp , sfx131 !!---------------------------------------------------------------------132 INTEGER, INTENT(in) :: kt ! ocean time step133 INTEGER, INTENT(in) :: kblk ! type of bulk (=3 CLIO, =4 CORE)134 !!135 INTEGER :: jl ! dummy loop index136 REAL(wp) :: zcoef ! local scalar137 REAL(wp), POINTER, DIMENSION(:,:,:) :: zalb_ice_os, zalb_ice_cs ! albedo of the ice under overcast/clear sky138 REAL(wp), POINTER, DIMENSION(:,:,:) :: zalb_ice ! mean albedo of ice (for coupled)139 140 REAL(wp), POINTER, DIMENSION(:,:) :: zalb_ice_all ! Mean albedo over all categories141 REAL(wp), POINTER, DIMENSION(:,:) :: ztem_ice_all ! Mean temperature over all categories142 143 REAL(wp), POINTER, DIMENSION(:,:) :: z_qsr_ice_all ! Mean solar heat flux over all categories144 REAL(wp), POINTER, DIMENSION(:,:) :: z_qns_ice_all ! Mean non solar heat flux over all categories145 REAL(wp), POINTER, DIMENSION(:,:) :: z_qla_ice_all ! Mean latent heat flux over all categories146 REAL(wp), POINTER, DIMENSION(:,:) :: z_dqns_ice_all ! Mean d(qns)/dT over all categories147 REAL(wp), POINTER, DIMENSION(:,:) :: z_dqla_ice_all ! Mean d(qla)/dT over all categories148 !!----------------------------------------------------------------------149 150 !- O.M. : why do we allocate all these arrays even when MOD( kt-1, nn_fsbc ) /= 0 ?????151 152 IF( nn_timing == 1 ) CALL timing_start('sbc_ice_lim')153 154 CALL wrk_alloc( jpi,jpj,jpl, zalb_ice_os, zalb_ice_cs )155 156 #if defined key_coupled157 IF ( ln_cpl .OR. ln_iceflx_ave .OR. ln_iceflx_linear ) CALL wrk_alloc( jpi,jpj,jpl, zalb_ice)158 IF ( ln_iceflx_ave .OR. ln_iceflx_linear ) &159 & CALL wrk_alloc( jpi,jpj, ztem_ice_all, zalb_ice_all, z_qsr_ice_all, z_qns_ice_all, z_qla_ice_all, z_dqns_ice_all, z_dqla_ice_all)160 #endif161 162 IF( kt == nit000 ) THEN163 IF(lwp) WRITE(numout,*)164 IF(lwp) WRITE(numout,*) 'sbc_ice_lim : update ocean surface boudary condition'165 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ via Louvain la Neuve Ice Model (LIM-3) time stepping'166 !167 CALL ice_init168 !169 IF( ln_nicep ) THEN ! control print at a given point170 jiindx = 177 ; jjindx = 112171 IF(lwp) WRITE(numout,*) ' The debugging point is : jiindx : ',jiindx, ' jjindx : ',jjindx172 ENDIF173 ENDIF174 175 ! !----------------------!176 IF( MOD( kt-1, nn_fsbc ) == 0 ) THEN ! Ice time-step only !177 ! !----------------------!178 ! ! Bulk Formulea !179 ! !----------------!180 !181 u_oce(:,:) = ssu_m(:,:) ! mean surface ocean current at ice velocity point182 v_oce(:,:) = ssv_m(:,:) ! (C-grid dynamics : U- & V-points as the ocean)183 !184 t_bo(:,:) = tfreez( sss_m ) + rt0 ! masked sea surface freezing temperature [Kelvin]185 ! ! (set to rt0 over land)186 CALL albedo_ice( t_su, ht_i, ht_s, zalb_ice_cs, zalb_ice_os ) ! ... ice albedo187 188 DO jl = 1, jpl189 t_su(:,:,jl) = t_su(:,:,jl) + rt0 * ( 1. - tmask(:,:,1) )190 END DO191 192 IF ( ln_cpl ) zalb_ice (:,:,:) = 0.5 * ( zalb_ice_cs (:,:,:) + zalb_ice_os (:,:,:) )193 194 #if defined key_coupled195 IF ( ln_iceflx_ave .OR. ln_iceflx_linear ) THEN196 !197 ! Compute mean albedo and temperature198 zalb_ice_all (:,:) = fice_ice_ave ( zalb_ice (:,:,:) )199 ztem_ice_all (:,:) = fice_ice_ave ( tn_ice (:,:,:) )200 !201 ENDIF202 #endif203 ! Bulk formulea - provides the following fields:204 ! utau_ice, vtau_ice : surface ice stress (U- & V-points) [N/m2]205 ! qsr_ice , qns_ice : solar & non solar heat flux over ice (T-point) [W/m2]206 ! qla_ice : latent heat flux over ice (T-point) [W/m2]207 ! dqns_ice, dqla_ice : non solar & latent heat sensistivity (T-point) [W/m2]208 ! tprecip , sprecip : total & solid precipitation (T-point) [Kg/m2/s]209 ! fr1_i0 , fr2_i0 : 1sr & 2nd fraction of qsr penetration in ice [%]210 !211 SELECT CASE( kblk )212 CASE( 3 ) ! CLIO bulk formulation213 CALL blk_ice_clio( t_su , zalb_ice_cs, zalb_ice_os, &214 & utau_ice , vtau_ice , qns_ice , qsr_ice , &215 & qla_ice , dqns_ice , dqla_ice , &216 & tprecip , sprecip , &217 & fr1_i0 , fr2_i0 , cp_ice_msh, jpl )218 !219 CASE( 4 ) ! CORE bulk formulation220 CALL blk_ice_core( t_su , u_ice , v_ice , zalb_ice_cs, &221 & utau_ice , vtau_ice , qns_ice , qsr_ice , &222 & qla_ice , dqns_ice , dqla_ice , &223 & tprecip , sprecip , &224 & fr1_i0 , fr2_i0 , cp_ice_msh, jpl )225 !226 CASE ( 5 )227 zalb_ice (:,:,:) = 0.5 * ( zalb_ice_cs (:,:,:) + zalb_ice_os (:,:,:) )228 229 CALL sbc_cpl_ice_tau( utau_ice , vtau_ice )230 231 CALL sbc_cpl_ice_flx( p_frld=ato_i, palbi=zalb_ice, psst=sst_m, pist=tn_ice )232 233 ! Latent heat flux is forced to 0 in coupled :234 ! it is included in qns (non-solar heat flux)235 qla_ice (:,:,:) = 0.0e0_wp236 dqla_ice (:,:,:) = 0.0e0_wp237 !238 END SELECT239 240 ! Average over all categories241 #if defined key_coupled242 IF ( ln_iceflx_ave .OR. ln_iceflx_linear ) THEN243 244 z_qns_ice_all (:,:) = fice_ice_ave ( qns_ice (:,:,:) )245 z_qsr_ice_all (:,:) = fice_ice_ave ( qsr_ice (:,:,:) )246 z_dqns_ice_all (:,:) = fice_ice_ave ( dqns_ice (:,:,:) )247 z_qla_ice_all (:,:) = fice_ice_ave ( qla_ice (:,:,:) )248 z_dqla_ice_all (:,:) = fice_ice_ave ( dqla_ice (:,:,:) )249 250 DO jl = 1, jpl251 dqns_ice (:,:,jl) = z_dqns_ice_all (:,:)252 dqla_ice (:,:,jl) = z_dqla_ice_all (:,:)253 END DO254 !255 IF ( ln_iceflx_ave ) THEN256 DO jl = 1, jpl257 qns_ice (:,:,jl) = z_qns_ice_all (:,:)258 qsr_ice (:,:,jl) = z_qsr_ice_all (:,:)259 qla_ice (:,:,jl) = z_qla_ice_all (:,:)260 END DO261 END IF262 !263 IF ( ln_iceflx_linear ) THEN264 DO jl = 1, jpl265 qns_ice (:,:,jl) = z_qns_ice_all(:,:) + z_dqns_ice_all(:,:) * (tn_ice(:,:,jl) - ztem_ice_all(:,:))266 qla_ice (:,:,jl) = z_qla_ice_all(:,:) + z_dqla_ice_all(:,:) * (tn_ice(:,:,jl) - ztem_ice_all(:,:))267 qsr_ice (:,:,jl) = (1.0e0_wp-zalb_ice(:,:,jl)) / (1.0e0_wp-zalb_ice_all(:,:)) * z_qsr_ice_all(:,:)268 END DO269 END IF270 END IF271 #endif272 ! !----------------------!273 ! ! LIM-3 time-stepping !274 ! !----------------------!275 !276 numit = numit + nn_fsbc ! Ice model time step277 !278 ! ! Store previous ice values279 !!gm : remark old_... should becomes ...b as tn versus tb280 old_a_i (:,:,:) = a_i (:,:,:) ! ice area281 old_e_i (:,:,:,:) = e_i (:,:,:,:) ! ice thermal energy282 old_v_i (:,:,:) = v_i (:,:,:) ! ice volume283 old_v_s (:,:,:) = v_s (:,:,:) ! snow volume284 old_e_s (:,:,:,:) = e_s (:,:,:,:) ! snow thermal energy285 old_smv_i(:,:,:) = smv_i(:,:,:) ! salt content286 old_oa_i (:,:,:) = oa_i (:,:,:) ! areal age content287 !288 old_u_ice(:,:) = u_ice(:,:)289 old_v_ice(:,:) = v_ice(:,:)290 ! ! intialisation to zero !!gm is it truly necessary ???291 d_a_i_thd (:,:,:) = 0._wp ; d_a_i_trp (:,:,:) = 0._wp292 d_v_i_thd (:,:,:) = 0._wp ; d_v_i_trp (:,:,:) = 0._wp293 d_e_i_thd (:,:,:,:) = 0._wp ; d_e_i_trp (:,:,:,:) = 0._wp294 d_v_s_thd (:,:,:) = 0._wp ; d_v_s_trp (:,:,:) = 0._wp295 d_e_s_thd (:,:,:,:) = 0._wp ; d_e_s_trp (:,:,:,:) = 0._wp296 d_smv_i_thd(:,:,:) = 0._wp ; d_smv_i_trp(:,:,:) = 0._wp297 d_oa_i_thd (:,:,:) = 0._wp ; d_oa_i_trp (:,:,:) = 0._wp298 !299 d_u_ice_dyn(:,:) = 0._wp300 d_v_ice_dyn(:,:) = 0._wp301 !302 sfx (:,:) = 0._wp ; sfx_thd (:,:) = 0._wp303 sfx_bri(:,:) = 0._wp ; sfx_mec (:,:) = 0._wp ; sfx_res (:,:) = 0._wp304 fhbri (:,:) = 0._wp ; fheat_mec(:,:) = 0._wp ; fheat_res(:,:) = 0._wp305 fhmec (:,:) = 0._wp ;306 fmmec (:,:) = 0._wp307 fmmflx (:,:) = 0._wp308 focea2D(:,:) = 0._wp309 fsup2D (:,:) = 0._wp310 311 ! used in limthd.F90312 rdvosif(:,:) = 0._wp ! variation of ice volume at surface313 rdvobif(:,:) = 0._wp ! variation of ice volume at bottom314 fdvolif(:,:) = 0._wp ! total variation of ice volume315 rdvonif(:,:) = 0._wp ! lateral variation of ice volume316 fstric (:,:) = 0._wp ! part of solar radiation transmitted through the ice317 ffltbif(:,:) = 0._wp ! linked with fstric318 qfvbq (:,:) = 0._wp ! linked with fstric319 rdm_snw(:,:) = 0._wp ! variation of snow mass per unit area320 rdm_ice(:,:) = 0._wp ! variation of ice mass per unit area321 hicifp (:,:) = 0._wp ! daily thermodynamic ice production.322 !323 diag_sni_gr(:,:) = 0._wp ; diag_lat_gr(:,:) = 0._wp324 diag_bot_gr(:,:) = 0._wp ; diag_dyn_gr(:,:) = 0._wp325 diag_bot_me(:,:) = 0._wp ; diag_sur_me(:,:) = 0._wp326 diag_res_pr(:,:) = 0._wp ; diag_trp_vi(:,:) = 0._wp327 ! dynamical invariants328 delta_i(:,:) = 0._wp ; divu_i(:,:) = 0._wp ; shear_i(:,:) = 0._wp329 330 CALL lim_rst_opn( kt ) ! Open Ice restart file331 !332 IF( ln_nicep ) CALL lim_prt_state( kt, jiindx, jjindx, 1, ' - Beginning the time step - ' ) ! control print333 ! ----------------------------------------------334 ! ice dynamics and transport (except in 1D case)335 ! ----------------------------------------------336 IF( .NOT. lk_c1d ) THEN337 CALL lim_dyn( kt ) ! Ice dynamics ( rheology/dynamics )338 CALL lim_trp( kt ) ! Ice transport ( Advection/diffusion )339 CALL lim_var_glo2eqv ! equivalent variables, requested for rafting340 IF( ln_nicep ) CALL lim_prt_state( kt, jiindx, jjindx,-1, ' - ice dyn & trp - ' ) ! control print341 CALL lim_itd_me ! Mechanical redistribution ! (ridging/rafting)342 CALL lim_var_agg( 1 )343 #if defined key_bdy344 ! bdy ice thermo345 CALL lim_var_glo2eqv ! equivalent variables346 CALL bdy_ice_lim( kt )347 CALL lim_itd_me_zapsmall348 CALL lim_var_agg(1)349 IF( ln_nicep ) CALL lim_prt_state( kt, jiindx, jjindx, 1, ' - ice thermo bdy - ' ) ! control print350 #endif351 CALL lim_update1352 ENDIF353 ! !- Change old values for new values354 old_u_ice(:,:) = u_ice (:,:)355 old_v_ice(:,:) = v_ice (:,:)356 old_a_i(:,:,:) = a_i (:,:,:)357 old_v_s(:,:,:) = v_s (:,:,:)358 old_v_i(:,:,:) = v_i (:,:,:)359 old_e_s(:,:,:,:) = e_s (:,:,:,:)360 old_e_i(:,:,:,:) = e_i (:,:,:,:)361 old_oa_i(:,:,:) = oa_i(:,:,:)362 old_smv_i(:,:,:) = smv_i (:,:,:)363 364 ! ----------------------------------------------365 ! ice thermodynamic366 ! ----------------------------------------------367 CALL lim_var_glo2eqv ! equivalent variables368 CALL lim_var_agg(1) ! aggregate ice categories369 ! previous lead fraction and ice volume for flux calculations370 pfrld(:,:) = 1._wp - at_i(:,:)371 phicif(:,:) = vt_i(:,:)372 !373 CALL lim_var_bv ! bulk brine volume (diag)374 CALL lim_thd( kt ) ! Ice thermodynamics375 zcoef = rdt_ice /rday ! Ice natural aging376 oa_i(:,:,:) = oa_i(:,:,:) + a_i(:,:,:) * zcoef377 CALL lim_var_glo2eqv ! this CALL is maybe not necessary (Martin)378 IF( ln_nicep ) CALL lim_prt_state( kt, jiindx, jjindx, 1, ' - ice thermodyn. - ' ) ! control print379 CALL lim_itd_th( kt ) ! Remap ice categories, lateral accretion !380 CALL lim_var_agg( 1 ) ! requested by limupdate381 CALL lim_update2 ! Global variables update382 383 CALL lim_var_glo2eqv ! equivalent variables (outputs)384 CALL lim_var_agg(2) ! aggregate ice thickness categories385 IF( ln_nicep ) CALL lim_prt_state( kt, jiindx, jjindx, 2, ' - Final state - ' ) ! control print386 !387 CALL lim_sbc_flx( kt ) ! Update surface ocean mass, heat and salt fluxes388 !389 IF( ln_nicep ) CALL lim_prt_state( kt, jiindx, jjindx, 3, ' - Final state lim_sbc - ' ) ! control print390 !391 ! ! Diagnostics and outputs392 IF (ln_limdiaout) CALL lim_diahsb393 !clem # if ! defined key_iomput394 CALL lim_wri( 1 ) ! Ice outputs395 !clem # endif396 IF( kt == nit000 .AND. ln_rstart ) &397 & CALL iom_close( numrir ) ! clem: close input ice restart file398 !399 IF( lrst_ice ) CALL lim_rst_write( kt ) ! Ice restart file400 CALL lim_var_glo2eqv ! ???401 !402 IF( ln_nicep ) CALL lim_ctl( kt ) ! alerts in case of model crash403 !404 ENDIF ! End sea-ice time step only405 406 ! !--------------------------!407 ! ! at all ocean time step !408 ! !--------------------------!409 !410 ! ! Update surface ocean stresses (only in ice-dynamic case)411 ! ! otherwise the atm.-ocean stresses are used everywhere412 IF( ln_limdyn ) CALL lim_sbc_tau( kt, ub(:,:,1), vb(:,:,1) ) ! using before instantaneous surf. currents413 414 !!gm remark, the ocean-ice stress is not saved in ice diag call above ..... find a solution!!!415 !416 CALL wrk_dealloc( jpi,jpj,jpl, zalb_ice_os, zalb_ice_cs )417 418 #if defined key_coupled419 IF ( ln_cpl .OR. ln_iceflx_ave .OR. ln_iceflx_linear ) CALL wrk_dealloc( jpi,jpj,jpl, zalb_ice)420 IF ( ln_iceflx_ave .OR. ln_iceflx_linear ) &421 & CALL wrk_dealloc( jpi,jpj, ztem_ice_all, zalb_ice_all, z_qsr_ice_all, z_qns_ice_all, z_qla_ice_all, z_dqns_ice_all, z_dqla_ice_all)422 #endif423 !424 IF( nn_timing == 1 ) CALL timing_stop('sbc_ice_lim')425 !426 END SUBROUTINE sbc_ice_lim427 428 429 SUBROUTINE lim_ctl( kt )430 !!-----------------------------------------------------------------------431 !! *** ROUTINE lim_ctl ***432 !!433 !! ** Purpose : Alerts in case of model crash434 !!-------------------------------------------------------------------435 INTEGER, INTENT(in) :: kt ! ocean time step436 INTEGER :: ji, jj, jk, jl ! dummy loop indices437 INTEGER :: inb_altests ! number of alert tests (max 20)438 INTEGER :: ialert_id ! number of the current alert439 REAL(wp) :: ztmelts ! ice layer melting point440 CHARACTER (len=30), DIMENSION(20) :: cl_alname ! name of alert441 INTEGER , DIMENSION(20) :: inb_alp ! number of alerts positive442 !!-------------------------------------------------------------------443 444 inb_altests = 10445 inb_alp(:) = 0446 447 ! Alert if incompatible volume and concentration448 ialert_id = 2 ! reference number of this alert449 cl_alname(ialert_id) = ' Incompat vol and con ' ! name of the alert450 451 DO jl = 1, jpl452 DO jj = 1, jpj453 DO ji = 1, jpi454 IF( v_i(ji,jj,jl) /= 0._wp .AND. a_i(ji,jj,jl) == 0._wp ) THEN455 !WRITE(numout,*) ' ALERTE 2 : Incompatible volume and concentration '456 !WRITE(numout,*) ' at_i ', at_i(ji,jj)457 !WRITE(numout,*) ' Point - category', ji, jj, jl458 !WRITE(numout,*) ' a_i *** a_i_old ', a_i (ji,jj,jl), old_a_i (ji,jj,jl)459 !WRITE(numout,*) ' v_i *** v_i_old ', v_i (ji,jj,jl), old_v_i (ji,jj,jl)460 !WRITE(numout,*) ' d_a_i_thd/trp ', d_a_i_thd(ji,jj,jl), d_a_i_trp(ji,jj,jl)461 !WRITE(numout,*) ' d_v_i_thd/trp ', d_v_i_thd(ji,jj,jl), d_v_i_trp(ji,jj,jl)462 inb_alp(ialert_id) = inb_alp(ialert_id) + 1463 ENDIF464 END DO465 END DO466 END DO467 468 ! Alerte if very thick ice469 ialert_id = 3 ! reference number of this alert470 cl_alname(ialert_id) = ' Very thick ice ' ! name of the alert471 jl = jpl472 DO jj = 1, jpj473 DO ji = 1, jpi474 IF( ht_i(ji,jj,jl) > 50._wp ) THEN475 !CALL lim_prt_state( kt, ji, jj, 2, ' ALERTE 3 : Very thick ice ' )476 inb_alp(ialert_id) = inb_alp(ialert_id) + 1477 ENDIF478 END DO479 END DO480 481 ! Alert if very fast ice482 ialert_id = 4 ! reference number of this alert483 cl_alname(ialert_id) = ' Very fast ice ' ! name of the alert484 DO jj = 1, jpj485 DO ji = 1, jpi486 IF( MAX( ABS( u_ice(ji,jj) ), ABS( v_ice(ji,jj) ) ) > 1.5 .AND. &487 & at_i(ji,jj) > 0._wp ) THEN488 !CALL lim_prt_state( kt, ji, jj, 1, ' ALERTE 4 : Very fast ice ' )489 !WRITE(numout,*) ' ice strength : ', strength(ji,jj)490 !WRITE(numout,*) ' oceanic stress utau : ', utau(ji,jj)491 !WRITE(numout,*) ' oceanic stress vtau : ', vtau(ji,jj)492 !WRITE(numout,*) ' sea-ice stress utau_ice : ', utau_ice(ji,jj)493 !WRITE(numout,*) ' sea-ice stress vtau_ice : ', vtau_ice(ji,jj)494 !WRITE(numout,*) ' oceanic speed u : ', u_oce(ji,jj)495 !WRITE(numout,*) ' oceanic speed v : ', v_oce(ji,jj)496 !WRITE(numout,*) ' sst : ', sst_m(ji,jj)497 !WRITE(numout,*) ' sss : ', sss_m(ji,jj)498 !WRITE(numout,*)499 inb_alp(ialert_id) = inb_alp(ialert_id) + 1500 ENDIF501 END DO502 END DO503 504 ! Alert if there is ice on continents505 ialert_id = 6 ! reference number of this alert506 cl_alname(ialert_id) = ' Ice on continents ' ! name of the alert507 DO jj = 1, jpj508 DO ji = 1, jpi509 IF( tms(ji,jj) <= 0._wp .AND. at_i(ji,jj) > 0._wp ) THEN510 !CALL lim_prt_state( kt, ji, jj, 1, ' ALERTE 6 : Ice on continents ' )511 !WRITE(numout,*) ' masks s, u, v : ', tms(ji,jj), tmu(ji,jj), tmv(ji,jj)512 !WRITE(numout,*) ' sst : ', sst_m(ji,jj)513 !WRITE(numout,*) ' sss : ', sss_m(ji,jj)514 !WRITE(numout,*) ' at_i(ji,jj) : ', at_i(ji,jj)515 !WRITE(numout,*) ' v_ice(ji,jj) : ', v_ice(ji,jj)516 !WRITE(numout,*) ' v_ice(ji,jj-1) : ', v_ice(ji,jj-1)517 !WRITE(numout,*) ' u_ice(ji-1,jj) : ', u_ice(ji-1,jj)518 !WRITE(numout,*) ' u_ice(ji,jj) : ', v_ice(ji,jj)519 !520 inb_alp(ialert_id) = inb_alp(ialert_id) + 1521 ENDIF522 END DO523 END DO524 525 !526 ! ! Alert if very fresh ice527 ialert_id = 7 ! reference number of this alert528 cl_alname(ialert_id) = ' Very fresh ice ' ! name of the alert529 DO jl = 1, jpl530 DO jj = 1, jpj531 DO ji = 1, jpi532 IF( sm_i(ji,jj,jl) < 0.1 .AND. a_i(ji,jj,jl) > 0._wp ) THEN533 ! CALL lim_prt_state(kt,ji,jj,1, ' ALERTE 7 : Very fresh ice ' )534 ! WRITE(numout,*) ' sst : ', sst_m(ji,jj)535 ! WRITE(numout,*) ' sss : ', sss_m(ji,jj)536 ! WRITE(numout,*) ' s_i_newice : ', s_i_newice(ji,jj,1:jpl)537 ! WRITE(numout,*)538 inb_alp(ialert_id) = inb_alp(ialert_id) + 1539 ENDIF540 END DO541 END DO542 END DO543 !544 545 ! ! Alert if too old ice546 ialert_id = 9 ! reference number of this alert547 cl_alname(ialert_id) = ' Very old ice ' ! name of the alert548 DO jl = 1, jpl549 DO jj = 1, jpj550 DO ji = 1, jpi551 IF ( ( ( ABS( o_i(ji,jj,jl) ) > rdt_ice ) .OR. &552 ( ABS( o_i(ji,jj,jl) ) < 0._wp) ) .AND. &553 ( a_i(ji,jj,jl) > 0._wp ) ) THEN554 !CALL lim_prt_state( kt, ji, jj, 1, ' ALERTE 9 : Wrong ice age ')555 inb_alp(ialert_id) = inb_alp(ialert_id) + 1556 ENDIF557 END DO558 END DO559 END DO560 561 ! Alert on salt flux562 ialert_id = 5 ! reference number of this alert563 cl_alname(ialert_id) = ' High salt flux ' ! name of the alert564 DO jj = 1, jpj565 DO ji = 1, jpi566 IF( ABS( sfx (ji,jj) ) .GT. 1.0e-2 ) THEN ! = 1 psu/day for 1m ocean depth567 !CALL lim_prt_state( kt, ji, jj, 3, ' ALERTE 5 : High salt flux ' )568 !DO jl = 1, jpl569 !WRITE(numout,*) ' Category no: ', jl570 !WRITE(numout,*) ' a_i : ', a_i (ji,jj,jl) , ' old_a_i : ', old_a_i (ji,jj,jl)571 !WRITE(numout,*) ' d_a_i_trp : ', d_a_i_trp(ji,jj,jl) , ' d_a_i_thd : ', d_a_i_thd(ji,jj,jl)572 !WRITE(numout,*) ' v_i : ', v_i (ji,jj,jl) , ' old_v_i : ', old_v_i (ji,jj,jl)573 !WRITE(numout,*) ' d_v_i_trp : ', d_v_i_trp(ji,jj,jl) , ' d_v_i_thd : ', d_v_i_thd(ji,jj,jl)574 !WRITE(numout,*) ' '575 !END DO576 inb_alp(ialert_id) = inb_alp(ialert_id) + 1577 ENDIF578 END DO579 END DO580 581 ! Alert if qns very big582 ialert_id = 8 ! reference number of this alert583 cl_alname(ialert_id) = ' fnsolar very big ' ! name of the alert584 DO jj = 1, jpj585 DO ji = 1, jpi586 IF( ABS( qns(ji,jj) ) > 1500._wp .AND. at_i(ji,jj) > 0._wp ) THEN587 !588 !WRITE(numout,*) ' ALERTE 8 : Very high non-solar heat flux'589 !WRITE(numout,*) ' ji, jj : ', ji, jj590 !WRITE(numout,*) ' qns : ', qns(ji,jj)591 !WRITE(numout,*) ' sst : ', sst_m(ji,jj)592 !WRITE(numout,*) ' sss : ', sss_m(ji,jj)593 !WRITE(numout,*) ' qcmif : ', qcmif(ji,jj)594 !WRITE(numout,*) ' qldif : ', qldif(ji,jj)595 !WRITE(numout,*) ' qcmif : ', qcmif(ji,jj) / rdt_ice596 !WRITE(numout,*) ' qldif : ', qldif(ji,jj) / rdt_ice597 !WRITE(numout,*) ' qfvbq : ', qfvbq(ji,jj)598 !WRITE(numout,*) ' qdtcn : ', qdtcn(ji,jj)599 !WRITE(numout,*) ' qfvbq / dt: ', qfvbq(ji,jj) / rdt_ice600 !WRITE(numout,*) ' qdtcn / dt: ', qdtcn(ji,jj) / rdt_ice601 !WRITE(numout,*) ' fdtcn : ', fdtcn(ji,jj)602 !WRITE(numout,*) ' fhmec : ', fhmec(ji,jj)603 !WRITE(numout,*) ' fheat_mec : ', fheat_mec(ji,jj)604 !WRITE(numout,*) ' fheat_res : ', fheat_res(ji,jj)605 !WRITE(numout,*) ' fhbri : ', fhbri(ji,jj)606 !607 !CALL lim_prt_state( kt, ji, jj, 2, ' ')608 inb_alp(ialert_id) = inb_alp(ialert_id) + 1609 !610 ENDIF611 END DO612 END DO613 !+++++614 615 ! Alert if very warm ice616 ialert_id = 10 ! reference number of this alert617 cl_alname(ialert_id) = ' Very warm ice ' ! name of the alert618 inb_alp(ialert_id) = 0619 DO jl = 1, jpl620 DO jk = 1, nlay_i621 DO jj = 1, jpj622 DO ji = 1, jpi623 ztmelts = -tmut * s_i(ji,jj,jk,jl) + rtt624 IF( t_i(ji,jj,jk,jl) >= ztmelts .AND. v_i(ji,jj,jl) > 1.e-10 &625 & .AND. a_i(ji,jj,jl) > 0._wp ) THEN626 !WRITE(numout,*) ' ALERTE 10 : Very warm ice'627 !WRITE(numout,*) ' ji, jj, jk, jl : ', ji, jj, jk, jl628 !WRITE(numout,*) ' t_i : ', t_i(ji,jj,jk,jl)629 !WRITE(numout,*) ' e_i : ', e_i(ji,jj,jk,jl)630 !WRITE(numout,*) ' s_i : ', s_i(ji,jj,jk,jl)631 !WRITE(numout,*) ' ztmelts : ', ztmelts632 inb_alp(ialert_id) = inb_alp(ialert_id) + 1633 ENDIF634 END DO635 END DO636 END DO637 END DO638 639 ! sum of the alerts on all processors640 IF( lk_mpp ) THEN641 DO ialert_id = 1, inb_altests642 CALL mpp_sum(inb_alp(ialert_id))643 END DO644 ENDIF645 646 ! print alerts647 IF( lwp ) THEN648 ialert_id = 1 ! reference number of this alert649 cl_alname(ialert_id) = ' NO alerte 1 ' ! name of the alert650 WRITE(numout,*) ' time step ',kt651 WRITE(numout,*) ' All alerts at the end of ice model '652 DO ialert_id = 1, inb_altests653 WRITE(numout,*) ialert_id, cl_alname(ialert_id)//' : ', inb_alp(ialert_id), ' times ! '654 END DO655 ENDIF656 !657 END SUBROUTINE lim_ctl658 659 660 SUBROUTINE lim_prt_state( kt, ki, kj, kn, cd1 )661 !!-----------------------------------------------------------------------662 !! *** ROUTINE lim_prt_state ***663 !!664 !! ** Purpose : Writes global ice state on the (i,j) point665 !! in ocean.ouput666 !! 3 possibilities exist667 !! n = 1/-1 -> simple ice state (plus Mechanical Check if -1)668 !! n = 2 -> exhaustive state669 !! n = 3 -> ice/ocean salt fluxes670 !!671 !! ** input : point coordinates (i,j)672 !! n : number of the option673 !!-------------------------------------------------------------------674 INTEGER , INTENT(in) :: kt ! ocean time step675 INTEGER , INTENT(in) :: ki, kj, kn ! ocean gridpoint indices676 CHARACTER(len=*), INTENT(in) :: cd1 !677 !!678 INTEGER :: jl, ji, jj679 !!-------------------------------------------------------------------680 681 DO ji = mi0(ki), mi1(ki)682 DO jj = mj0(kj), mj1(kj)683 684 WRITE(numout,*) ' time step ',kt,' ',cd1 ! print title685 686 !----------------687 ! Simple state688 !----------------689 690 IF ( kn == 1 .OR. kn == -1 ) THEN691 WRITE(numout,*) ' lim_prt_state - Point : ',ji,jj692 WRITE(numout,*) ' ~~~~~~~~~~~~~~ '693 WRITE(numout,*) ' Simple state '694 WRITE(numout,*) ' masks s,u,v : ', tms(ji,jj), tmu(ji,jj), tmv(ji,jj)695 WRITE(numout,*) ' lat - long : ', gphit(ji,jj), glamt(ji,jj)696 WRITE(numout,*) ' Time step : ', numit697 WRITE(numout,*) ' - Ice drift '698 WRITE(numout,*) ' ~~~~~~~~~~~ '699 WRITE(numout,*) ' u_ice(i-1,j) : ', u_ice(ji-1,jj)700 WRITE(numout,*) ' u_ice(i ,j) : ', u_ice(ji,jj)701 WRITE(numout,*) ' v_ice(i ,j-1): ', v_ice(ji,jj-1)702 WRITE(numout,*) ' v_ice(i ,j) : ', v_ice(ji,jj)703 WRITE(numout,*) ' strength : ', strength(ji,jj)704 WRITE(numout,*)705 WRITE(numout,*) ' - Cell values '706 WRITE(numout,*) ' ~~~~~~~~~~~ '707 WRITE(numout,*) ' cell area : ', area(ji,jj)708 WRITE(numout,*) ' at_i : ', at_i(ji,jj)709 WRITE(numout,*) ' vt_i : ', vt_i(ji,jj)710 WRITE(numout,*) ' vt_s : ', vt_s(ji,jj)711 DO jl = 1, jpl712 WRITE(numout,*) ' - Category (', jl,')'713 WRITE(numout,*) ' a_i : ', a_i(ji,jj,jl)714 WRITE(numout,*) ' ht_i : ', ht_i(ji,jj,jl)715 WRITE(numout,*) ' ht_s : ', ht_s(ji,jj,jl)716 WRITE(numout,*) ' v_i : ', v_i(ji,jj,jl)717 WRITE(numout,*) ' v_s : ', v_s(ji,jj,jl)718 WRITE(numout,*) ' e_s : ', e_s(ji,jj,1,jl)/1.0e9719 WRITE(numout,*) ' e_i : ', e_i(ji,jj,1:nlay_i,jl)/1.0e9720 WRITE(numout,*) ' t_su : ', t_su(ji,jj,jl)721 WRITE(numout,*) ' t_snow : ', t_s(ji,jj,1,jl)722 WRITE(numout,*) ' t_i : ', t_i(ji,jj,1:nlay_i,jl)723 WRITE(numout,*) ' sm_i : ', sm_i(ji,jj,jl)724 WRITE(numout,*) ' smv_i : ', smv_i(ji,jj,jl)725 WRITE(numout,*)726 END DO727 ENDIF728 IF( kn == -1 ) THEN729 WRITE(numout,*) ' Mechanical Check ************** '730 WRITE(numout,*) ' Check what means ice divergence '731 WRITE(numout,*) ' Total ice concentration ', at_i (ji,jj)732 WRITE(numout,*) ' Total lead fraction ', ato_i(ji,jj)733 WRITE(numout,*) ' Sum of both ', ato_i(ji,jj) + at_i(ji,jj)734 WRITE(numout,*) ' Sum of both minus 1 ', ato_i(ji,jj) + at_i(ji,jj) - 1.00735 ENDIF736 737 738 !--------------------739 ! Exhaustive state740 !--------------------741 742 IF ( kn .EQ. 2 ) THEN743 WRITE(numout,*) ' lim_prt_state - Point : ',ji,jj744 WRITE(numout,*) ' ~~~~~~~~~~~~~~ '745 WRITE(numout,*) ' Exhaustive state '746 WRITE(numout,*) ' lat - long ', gphit(ji,jj), glamt(ji,jj)747 WRITE(numout,*) ' Time step ', numit748 WRITE(numout,*)749 WRITE(numout,*) ' - Cell values '750 WRITE(numout,*) ' ~~~~~~~~~~~ '751 WRITE(numout,*) ' cell area : ', area(ji,jj)752 WRITE(numout,*) ' at_i : ', at_i(ji,jj)753 WRITE(numout,*) ' vt_i : ', vt_i(ji,jj)754 WRITE(numout,*) ' vt_s : ', vt_s(ji,jj)755 WRITE(numout,*) ' u_ice(i-1,j) : ', u_ice(ji-1,jj)756 WRITE(numout,*) ' u_ice(i ,j) : ', u_ice(ji,jj)757 WRITE(numout,*) ' v_ice(i ,j-1): ', v_ice(ji,jj-1)758 WRITE(numout,*) ' v_ice(i ,j) : ', v_ice(ji,jj)759 WRITE(numout,*) ' strength : ', strength(ji,jj)760 WRITE(numout,*) ' d_u_ice_dyn : ', d_u_ice_dyn(ji,jj), ' d_v_ice_dyn : ', d_v_ice_dyn(ji,jj)761 WRITE(numout,*) ' old_u_ice : ', old_u_ice(ji,jj) , ' old_v_ice : ', old_v_ice(ji,jj)762 WRITE(numout,*)763 764 DO jl = 1, jpl765 WRITE(numout,*) ' - Category (',jl,')'766 WRITE(numout,*) ' ~~~~~~~~ '767 WRITE(numout,*) ' ht_i : ', ht_i(ji,jj,jl) , ' ht_s : ', ht_s(ji,jj,jl)768 WRITE(numout,*) ' t_i : ', t_i(ji,jj,1:nlay_i,jl)769 WRITE(numout,*) ' t_su : ', t_su(ji,jj,jl) , ' t_s : ', t_s(ji,jj,1,jl)770 WRITE(numout,*) ' sm_i : ', sm_i(ji,jj,jl) , ' o_i : ', o_i(ji,jj,jl)771 WRITE(numout,*) ' a_i : ', a_i(ji,jj,jl) , ' old_a_i : ', old_a_i(ji,jj,jl)772 WRITE(numout,*) ' d_a_i_trp : ', d_a_i_trp(ji,jj,jl) , ' d_a_i_thd : ', d_a_i_thd(ji,jj,jl)773 WRITE(numout,*) ' v_i : ', v_i(ji,jj,jl) , ' old_v_i : ', old_v_i(ji,jj,jl)774 WRITE(numout,*) ' d_v_i_trp : ', d_v_i_trp(ji,jj,jl) , ' d_v_i_thd : ', d_v_i_thd(ji,jj,jl)775 WRITE(numout,*) ' v_s : ', v_s(ji,jj,jl) , ' old_v_s : ', old_v_s(ji,jj,jl)776 WRITE(numout,*) ' d_v_s_trp : ', d_v_s_trp(ji,jj,jl) , ' d_v_s_thd : ', d_v_s_thd(ji,jj,jl)777 WRITE(numout,*) ' e_i1 : ', e_i(ji,jj,1,jl)/1.0e9 , ' old_ei1 : ', old_e_i(ji,jj,1,jl)/1.0e9778 WRITE(numout,*) ' de_i1_trp : ', d_e_i_trp(ji,jj,1,jl)/1.0e9, ' de_i1_thd : ', d_e_i_thd(ji,jj,1,jl)/1.0e9779 WRITE(numout,*) ' e_i2 : ', e_i(ji,jj,2,jl)/1.0e9 , ' old_ei2 : ', old_e_i(ji,jj,2,jl)/1.0e9780 WRITE(numout,*) ' de_i2_trp : ', d_e_i_trp(ji,jj,2,jl)/1.0e9, ' de_i2_thd : ', d_e_i_thd(ji,jj,2,jl)/1.0e9781 WRITE(numout,*) ' e_snow : ', e_s(ji,jj,1,jl) , ' old_e_snow : ', old_e_s(ji,jj,1,jl)782 WRITE(numout,*) ' d_e_s_trp : ', d_e_s_trp(ji,jj,1,jl) , ' d_e_s_thd : ', d_e_s_thd(ji,jj,1,jl)783 WRITE(numout,*) ' smv_i : ', smv_i(ji,jj,jl) , ' old_smv_i : ', old_smv_i(ji,jj,jl)784 WRITE(numout,*) ' d_smv_i_trp: ', d_smv_i_trp(ji,jj,jl) , ' d_smv_i_thd: ', d_smv_i_thd(ji,jj,jl)785 WRITE(numout,*) ' oa_i : ', oa_i(ji,jj,jl) , ' old_oa_i : ', old_oa_i(ji,jj,jl)786 WRITE(numout,*) ' d_oa_i_trp : ', d_oa_i_trp(ji,jj,jl) , ' d_oa_i_thd : ', d_oa_i_thd(ji,jj,jl)787 END DO !jl788 789 WRITE(numout,*)790 WRITE(numout,*) ' - Heat / FW fluxes '791 WRITE(numout,*) ' ~~~~~~~~~~~~~~~~ '792 WRITE(numout,*) ' emp : ', emp (ji,jj)793 WRITE(numout,*) ' sfx : ', sfx (ji,jj)794 WRITE(numout,*) ' sfx_thd : ', sfx_thd(ji,jj)795 WRITE(numout,*) ' sfx_bri : ', sfx_bri (ji,jj)796 WRITE(numout,*) ' sfx_mec : ', sfx_mec (ji,jj)797 WRITE(numout,*) ' sfx_res : ', sfx_res(ji,jj)798 WRITE(numout,*) ' fmmec : ', fmmec (ji,jj)799 WRITE(numout,*) ' fhmec : ', fhmec (ji,jj)800 WRITE(numout,*) ' fhbri : ', fhbri (ji,jj)801 WRITE(numout,*) ' fheat_mec : ', fheat_mec(ji,jj)802 WRITE(numout,*)803 WRITE(numout,*) ' sst : ', sst_m(ji,jj)804 WRITE(numout,*) ' sss : ', sss_m(ji,jj)805 WRITE(numout,*)806 WRITE(numout,*) ' - Stresses '807 WRITE(numout,*) ' ~~~~~~~~ '808 WRITE(numout,*) ' utau_ice : ', utau_ice(ji,jj)809 WRITE(numout,*) ' vtau_ice : ', vtau_ice(ji,jj)810 WRITE(numout,*) ' utau : ', utau (ji,jj)811 WRITE(numout,*) ' vtau : ', vtau (ji,jj)812 WRITE(numout,*) ' oc. vel. u : ', u_oce (ji,jj)813 WRITE(numout,*) ' oc. vel. v : ', v_oce (ji,jj)814 ENDIF815 816 !---------------------817 ! Salt / heat fluxes818 !---------------------819 820 IF ( kn .EQ. 3 ) THEN821 WRITE(numout,*) ' lim_prt_state - Point : ',ji,jj822 WRITE(numout,*) ' ~~~~~~~~~~~~~~ '823 WRITE(numout,*) ' - Salt / Heat Fluxes '824 WRITE(numout,*) ' ~~~~~~~~~~~~~~~~ '825 WRITE(numout,*) ' lat - long ', gphit(ji,jj), glamt(ji,jj)826 WRITE(numout,*) ' Time step ', numit827 WRITE(numout,*)828 WRITE(numout,*) ' - Heat fluxes at bottom interface ***'829 WRITE(numout,*) ' qsr : ', qsr(ji,jj)830 WRITE(numout,*) ' qns : ', qns(ji,jj)831 WRITE(numout,*) ' fdtcn : ', fdtcn(ji,jj)832 WRITE(numout,*) ' qcmif : ', qcmif(ji,jj) * r1_rdtice833 WRITE(numout,*) ' qldif : ', qldif(ji,jj) * r1_rdtice834 WRITE(numout,*)835 WRITE(numout,*) ' - Salt fluxes at bottom interface ***'836 WRITE(numout,*) ' emp : ', emp (ji,jj)837 WRITE(numout,*) ' sfx_bri : ', sfx_bri(ji,jj)838 WRITE(numout,*) ' sfx : ', sfx (ji,jj)839 WRITE(numout,*) ' sfx_res : ', sfx_res(ji,jj)840 WRITE(numout,*) ' sfx_mec : ', sfx_mec(ji,jj)841 WRITE(numout,*) ' - Heat fluxes at bottom interface ***'842 WRITE(numout,*) ' fheat_res : ', fheat_res(ji,jj)843 WRITE(numout,*)844 WRITE(numout,*) ' - Momentum fluxes '845 WRITE(numout,*) ' utau : ', utau(ji,jj)846 WRITE(numout,*) ' vtau : ', vtau(ji,jj)847 ENDIF848 WRITE(numout,*) ' '849 !850 END DO851 END DO852 853 END SUBROUTINE lim_prt_state854 635 855 636 #else … … 861 642 WRITE(*,*) 'sbc_ice_lim: You should not have seen this print! error?', kt, kblk 862 643 END SUBROUTINE sbc_ice_lim 644 SUBROUTINE sbc_lim_init ! Dummy routine 645 END SUBROUTINE sbc_lim_init 863 646 #endif 864 647 -
branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/sbcice_lim_2.F90
r4621 r5837 53 53 USE agrif_lim2_update 54 54 # endif 55 56 #if defined key_bdy 57 USE bdyice_lim ! unstructured open boundary data (bdy_ice_lim routine) 58 #endif 55 59 56 60 IMPLICIT NONE … … 93 97 !! 94 98 INTEGER :: ji, jj ! dummy loop indices 95 REAL(wp), DIMENSION(:,:,:), POINTER :: zalb_ice_os ! albedo of the ice under overcast sky 96 REAL(wp), DIMENSION(:,:,:), POINTER :: zalb_ice_cs ! albedo of ice under clear sky 97 REAL(wp), DIMENSION(:,:,:), POINTER :: zsist ! surface ice temperature (K) 99 REAL(wp), DIMENSION(:,:,:), POINTER :: zalb_os ! ice albedo under overcast sky 100 REAL(wp), DIMENSION(:,:,:), POINTER :: zalb_cs ! ice albedo under clear sky 101 REAL(wp), DIMENSION(:,:,:), POINTER :: zalb_ice ! mean ice albedo 102 REAL(wp), DIMENSION(:,:,:), POINTER :: zsist ! ice surface temperature (K) 103 REAL(wp), DIMENSION(:,: ), POINTER :: zutau_ice, zvtau_ice 98 104 !!---------------------------------------------------------------------- 99 100 CALL wrk_alloc( jpi,jpj,1, zalb_ice_os, zalb_ice_cs, zsist )101 105 102 106 IF( kt == nit000 ) THEN … … 119 123 &*Agrif_PArent(nn_fsbc)/REAL(nn_fsbc)) + 1 120 124 # endif 125 126 CALL wrk_alloc( jpi,jpj , zutau_ice, zvtau_ice) 127 CALL wrk_alloc( jpi,jpj,1, zalb_os, zalb_cs, zalb_ice, zsist ) 128 121 129 ! Bulk Formulea ! 122 130 !----------------! … … 126 134 DO jj = 2, jpj 127 135 DO ji = 2, jpi ! NO vector opt. possible 128 u_oce(ji,jj) = 0.5_wp * ( ssu_m(ji-1,jj ) + ssu_m(ji-1,jj-1) ) * tmu(ji,jj) 129 v_oce(ji,jj) = 0.5_wp * ( ssv_m(ji ,jj-1) + ssv_m(ji-1,jj-1) ) * tmu(ji,jj) 136 u_oce(ji,jj) = 0.5_wp * ( ssu_m(ji-1,jj ) * umask(ji-1,jj ,1) & 137 & + ssu_m(ji-1,jj-1) * umask(ji-1,jj-1,1) ) * tmu(ji,jj) 138 v_oce(ji,jj) = 0.5_wp * ( ssv_m(ji ,jj-1) * vmask(ji ,jj-1,1) & 139 & + ssv_m(ji-1,jj-1) * vmask(ji-1,jj-1,1) ) * tmu(ji,jj) 130 140 END DO 131 141 END DO … … 134 144 ! 135 145 CASE( 'C' ) !== C-grid ice dynamics : U & V-points (same as ocean) 136 u_oce(:,:) = ssu_m(:,:) ! mean surface ocean current at ice velocity point137 v_oce(:,:) = ssv_m(:,:) 146 u_oce(:,:) = ssu_m(:,:) * umask(:,:,1) ! mean surface ocean current at ice velocity point 147 v_oce(:,:) = ssv_m(:,:) * vmask(:,:,1) 138 148 ! 139 149 END SELECT 140 150 141 151 ! ... masked sea surface freezing temperature [Kelvin] (set to rt0 over land) 142 tfu(:,:) = tfreez( sss_m ) + rt0152 tfu(:,:) = eos_fzp( sss_m ) + rt0 143 153 144 154 zsist (:,:,1) = sist (:,:) + rt0 * ( 1. - tmask(:,:,1) ) 145 155 146 ! ... ice albedo (clear sky and overcast sky) 156 ! Ice albedo 157 147 158 CALL albedo_ice( zsist, reshape( hicif, (/jpi,jpj,1/) ), & 148 159 reshape( hsnif, (/jpi,jpj,1/) ), & 149 zalb_ice_cs, zalb_ice_os ) 160 zalb_cs, zalb_os ) 161 162 SELECT CASE( ksbc ) 163 CASE( jp_core , jp_purecpl ) ! CORE and COUPLED bulk formulations 164 165 ! albedo depends on cloud fraction because of non-linear spectral effects 166 zalb_ice(:,:,:) = ( 1. - cldf_ice ) * zalb_cs(:,:,:) + cldf_ice * zalb_os(:,:,:) 167 ! In CLIO the cloud fraction is read in the climatology and the all-sky albedo 168 ! (zalb_ice) is computed within the bulk routine 169 170 END SELECT 150 171 151 172 ! ... Sea-ice surface boundary conditions output from bulk formulae : … … 163 184 ! 164 185 SELECT CASE( ksbc ) 165 CASE( 3 ) ! CLIO bulk formulation 166 CALL blk_ice_clio( zsist, zalb_ice_cs, zalb_ice_os, & 167 & utau_ice , vtau_ice , qns_ice , qsr_ice, & 168 & qla_ice , dqns_ice , dqla_ice , & 169 & tprecip , sprecip , & 170 & fr1_i0 , fr2_i0 , cp_ice_msh , jpl ) 171 172 CASE( 4 ) ! CORE bulk formulation 173 CALL blk_ice_core( zsist, u_ice , v_ice , zalb_ice_cs, & 174 & utau_ice , vtau_ice , qns_ice , qsr_ice, & 175 & qla_ice , dqns_ice , dqla_ice , & 176 & tprecip , sprecip , & 177 & fr1_i0 , fr2_i0 , cp_ice_msh , jpl ) 178 IF( ltrcdm2dc_ice ) CALL blk_ice_meanqsr( zalb_ice_cs, qsr_ice_mean, jpl ) 179 180 CASE( 5 ) ! Coupled formulation : atmosphere-ice stress only (fluxes provided after ice dynamics) 186 CASE( jp_clio ) ! CLIO bulk formulation 187 ! CALL blk_ice_clio( zsist, zalb_cs , zalb_os , zalb_ice , & 188 ! & utau_ice , vtau_ice , qns_ice , qsr_ice, & 189 ! & qla_ice , dqns_ice , dqla_ice , & 190 ! & tprecip , sprecip , & 191 ! & fr1_i0 , fr2_i0 , cp_ice_msh , jpl ) 192 CALL blk_ice_clio_tau 193 CALL blk_ice_clio_flx( zsist, zalb_cs, zalb_os, zalb_ice ) 194 195 CASE( jp_core ) ! CORE bulk formulation 196 CALL blk_ice_core_tau 197 CALL blk_ice_core_flx( zsist, zalb_ice ) 198 199 CASE( jp_purecpl ) ! Coupled formulation : atmosphere-ice stress only (fluxes provided after ice dynamics) 181 200 CALL sbc_cpl_ice_tau( utau_ice , vtau_ice ) 182 201 END SELECT 202 203 IF( ln_mixcpl) THEN 204 CALL sbc_cpl_ice_tau( zutau_ice , zvtau_ice ) 205 utau_ice(:,:) = utau_ice(:,:) * xcplmask(:,:,0) + zutau_ice(:,:) * ( 1. - xcplmask(:,:,0) ) 206 vtau_ice(:,:) = vtau_ice(:,:) * xcplmask(:,:,0) + zvtau_ice(:,:) * ( 1. - xcplmask(:,:,0) ) 207 ENDIF 183 208 184 209 CALL iom_put( 'utau_ice', utau_ice ) ! Wind stress over ice along i-axis at I-point … … 205 230 CALL lim_trp_2 ( kt ) ! Ice transport ( Advection/diffusion ) 206 231 IF( ln_limdmp ) CALL lim_dmp_2 ( kt ) ! Ice damping 232 #if defined key_bdy 233 CALL bdy_ice_lim( kt ) ! bdy ice thermo 234 #endif 207 235 END IF 208 #if defined key_coupled209 236 ! ! Ice surface fluxes in coupled mode 210 IF( ksbc == 5 ) THEN237 IF( ln_cpl ) THEN ! pure coupled and mixed forced-coupled configurations 211 238 a_i(:,:,1)=fr_i 212 239 CALL sbc_cpl_ice_flx( frld, & 213 240 ! optional arguments, used only in 'mixed oce-ice' case 214 & palbi = zalb_ice_cs, psst = sst_m, pist =zsist )241 & palbi=zalb_ice, psst=sst_m, pist=zsist ) 215 242 sprecip(:,:) = - emp_ice(:,:) ! Ugly patch, WARNING, in coupled mode, sublimation included in snow (parsub = 0.) 216 243 ENDIF 217 #endif218 244 CALL lim_thd_2 ( kt ) ! Ice thermodynamics 219 245 CALL lim_sbc_flx_2 ( kt ) ! update surface ocean mass, heat & salt fluxes 220 #if defined key_top221 IF( ltrcdm2dc_ice )CALL lim_bio_meanqsr_2222 #endif223 246 224 247 IF( .NOT. lk_mpp )THEN … … 234 257 IF( .NOT. Agrif_Root() ) CALL agrif_update_lim2( kt ) 235 258 # endif 259 ! 260 CALL wrk_dealloc( jpi,jpj , zutau_ice, zvtau_ice) 261 CALL wrk_dealloc( jpi,jpj,1, zalb_os, zalb_cs, zalb_ice, zsist ) 236 262 ! 237 263 ENDIF ! End sea-ice time step only … … 245 271 IF( ln_limdyn ) CALL lim_sbc_tau_2( kt, ub(:,:,1), vb(:,:,1) ) ! using before instantaneous surf. currents 246 272 ! 247 CALL wrk_dealloc( jpi,jpj,1, zalb_ice_os, zalb_ice_cs, zsist )248 !249 273 END SUBROUTINE sbc_ice_lim_2 250 274 -
branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/sbcmod.F90
r4624 r5837 13 13 !! 3.4 ! 2011-11 (C. Harris) CICE added as an option 14 14 !! 3.5 ! 2012-11 (A. Coward, G. Madec) Rethink of heat, mass and salt surface fluxes 15 !! 3.6 ! 2014-11 (P. Mathiot, C. Harris) add ice shelves melting 15 16 !!---------------------------------------------------------------------- 16 17 … … 23 24 USE phycst ! physical constants 24 25 USE sbc_oce ! Surface boundary condition: ocean fields 26 USE trc_oce ! shared ocean-passive tracers variables 25 27 USE sbc_ice ! Surface boundary condition: ice fields 26 28 USE sbcdcy ! surface boundary condition: diurnal cycle … … 37 39 USE sbcice_cice ! surface boundary condition: CICE sea-ice model 38 40 USE sbccpl ! surface boundary condition: coupled florulation 39 USE cpl_oasis3 , ONLY:lk_cpl ! are we in coupled mode?41 USE cpl_oasis3 ! OASIS routines for coupling 40 42 USE sbcssr ! surface boundary condition: sea surface restoring 41 43 USE sbcrnf ! surface boundary condition: runoffs 44 USE sbcisf ! surface boundary condition: ice shelf 42 45 USE sbcfwb ! surface boundary condition: freshwater budget 43 46 USE closea ! closed sea … … 50 53 USE timing ! Timing 51 54 USE sbcwave ! Wave module 55 USE bdy_par ! Require lk_bdy 52 56 53 57 IMPLICIT NONE … … 82 86 INTEGER :: icpt ! local integer 83 87 !! 84 NAMELIST/namsbc/ nn_fsbc , ln_ana , ln_flx, ln_blk_clio, ln_blk_core, ln_cpl, & 85 & ln_blk_mfs, ln_apr_dyn, nn_ice, nn_ice_embd, ln_dm2dc , ln_rnf, & 86 & ln_ssr , nn_fwb , ln_cdgw , ln_wave , ln_sdw, nn_lsm, cn_iceflx 88 NAMELIST/namsbc/ nn_fsbc , ln_ana , ln_flx, ln_blk_clio, ln_blk_core, ln_mixcpl, & 89 & ln_blk_mfs, ln_apr_dyn, nn_ice, nn_ice_embd, ln_dm2dc , ln_rnf , & 90 & ln_ssr , nn_isf , nn_fwb, ln_cdgw , ln_wave , ln_sdw , & 91 & nn_lsm , nn_limflx , nn_components, ln_cpl 87 92 INTEGER :: ios 93 INTEGER :: ierr, ierr0, ierr1, ierr2, ierr3, jpm 94 LOGICAL :: ll_purecpl 88 95 !!---------------------------------------------------------------------- 89 96 … … 113 120 nn_ice = 0 114 121 ENDIF 115 122 116 123 IF(lwp) THEN ! Control print 117 124 WRITE(numout,*) ' Namelist namsbc (partly overwritten with CPP key setting)' … … 123 130 WRITE(numout,*) ' CORE bulk formulation ln_blk_core = ', ln_blk_core 124 131 WRITE(numout,*) ' MFS bulk formulation ln_blk_mfs = ', ln_blk_mfs 125 WRITE(numout,*) ' coupled formulation (T if key_sbc_cpl) ln_cpl = ', ln_cpl 126 WRITE(numout,*) ' Flux handling over ice categories cn_iceflx = ', TRIM (cn_iceflx) 132 WRITE(numout,*) ' ocean-atmosphere coupled formulation ln_cpl = ', ln_cpl 133 WRITE(numout,*) ' forced-coupled mixed formulation ln_mixcpl = ', ln_mixcpl 134 WRITE(numout,*) ' OASIS coupling (with atm or sas) lk_oasis = ', lk_oasis 135 WRITE(numout,*) ' components of your executable nn_components = ', nn_components 136 WRITE(numout,*) ' Multicategory heat flux formulation (LIM3) nn_limflx = ', nn_limflx 127 137 WRITE(numout,*) ' Misc. options of sbc : ' 128 138 WRITE(numout,*) ' Patm gradient added in ocean & ice Eqs. ln_apr_dyn = ', ln_apr_dyn … … 131 141 WRITE(numout,*) ' daily mean to diurnal cycle qsr ln_dm2dc = ', ln_dm2dc 132 142 WRITE(numout,*) ' runoff / runoff mouths ln_rnf = ', ln_rnf 143 WRITE(numout,*) ' iceshelf formulation nn_isf = ', nn_isf 133 144 WRITE(numout,*) ' Sea Surface Restoring on SST and/or SSS ln_ssr = ', ln_ssr 134 145 WRITE(numout,*) ' FreshWater Budget control (=0/1/2) nn_fwb = ', nn_fwb … … 137 148 ENDIF 138 149 139 ! Flux handling over ice categories 140 #if defined key_coupled 141 SELECT CASE ( TRIM (cn_iceflx)) 142 CASE ('ave') 143 ln_iceflx_ave = .TRUE. 144 ln_iceflx_linear = .FALSE. 145 CASE ('linear') 146 ln_iceflx_ave = .FALSE. 147 ln_iceflx_linear = .TRUE. 148 CASE default 149 ln_iceflx_ave = .FALSE. 150 ln_iceflx_linear = .FALSE. 150 ! LIM3 Multi-category heat flux formulation 151 SELECT CASE ( nn_limflx) 152 CASE ( -1 ) 153 IF(lwp) WRITE(numout,*) ' Use of per-category fluxes (nn_limflx = -1) ' 154 CASE ( 0 ) 155 IF(lwp) WRITE(numout,*) ' Average per-category fluxes (nn_limflx = 0) ' 156 CASE ( 1 ) 157 IF(lwp) WRITE(numout,*) ' Average then redistribute per-category fluxes (nn_limflx = 1) ' 158 CASE ( 2 ) 159 IF(lwp) WRITE(numout,*) ' Redistribute a single flux over categories (nn_limflx = 2) ' 151 160 END SELECT 152 IF(lwp) WRITE(numout,*) ' Fluxes averaged over all ice categories ln_iceflx_ave = ', ln_iceflx_ave 153 IF(lwp) WRITE(numout,*) ' Fluxes distributed linearly over ice categories ln_iceflx_linear = ', ln_iceflx_linear 154 #endif 155 ! 156 #if defined key_top && ! defined key_offline 157 ltrcdm2dc = (ln_dm2dc .AND. ln_blk_core .AND. nn_ice==2) 158 IF( ltrcdm2dc )THEN 159 IF(lwp)THEN 160 WRITE(numout,*)"analytical diurnal cycle, core bulk formulation and LIM2 use: " 161 WRITE(numout,*)"Diurnal cycle on physics but not in passive tracers" 162 ENDIF 163 ENDIF 164 #else 165 ltrcdm2dc = .FALSE. 166 #endif 167 168 ! 161 ! 162 IF ( nn_components /= jp_iam_nemo .AND. .NOT. lk_oasis ) & 163 & CALL ctl_stop( 'STOP', 'sbc_init : OPA-SAS coupled via OASIS, but key_oasis3 disabled' ) 164 IF ( nn_components == jp_iam_opa .AND. ln_cpl ) & 165 & CALL ctl_stop( 'STOP', 'sbc_init : OPA-SAS coupled via OASIS, but ln_cpl = T in OPA' ) 166 IF ( nn_components == jp_iam_opa .AND. ln_mixcpl ) & 167 & CALL ctl_stop( 'STOP', 'sbc_init : OPA-SAS coupled via OASIS, but ln_mixcpl = T in OPA' ) 168 IF ( ln_cpl .AND. .NOT. lk_oasis ) & 169 & CALL ctl_stop( 'STOP', 'sbc_init : OASIS-coupled atmosphere model, but key_oasis3 disabled' ) 170 IF( ln_mixcpl .AND. .NOT. lk_oasis ) & 171 & CALL ctl_stop( 'the forced-coupled mixed mode (ln_mixcpl) requires the cpp key key_oasis3' ) 172 IF( ln_mixcpl .AND. .NOT. ln_cpl ) & 173 & CALL ctl_stop( 'the forced-coupled mixed mode (ln_mixcpl) requires ln_cpl = T' ) 174 IF( ln_mixcpl .AND. nn_components /= jp_iam_nemo ) & 175 & CALL ctl_stop( 'the forced-coupled mixed mode (ln_mixcpl) is not yet working with sas-opa coupling via oasis' ) 176 169 177 ! ! allocate sbc arrays 170 178 IF( sbc_oce_alloc() /= 0 ) CALL ctl_stop( 'STOP', 'sbc_init : unable to allocate sbc_oce arrays' ) 171 179 172 180 ! ! Checks: 173 IF( .NOT. ln_rnf ) THEN ! no specific treatment in vicinity of river mouths 174 ln_rnf_mouth = .false. 175 IF( sbc_rnf_alloc() /= 0 ) CALL ctl_stop( 'STOP', 'sbc_init : unable to allocate sbc_rnf arrays' ) 176 nkrnf = 0 177 rnf (:,:) = 0.0_wp 178 rnf_b (:,:) = 0.0_wp 179 rnfmsk (:,:) = 0.0_wp 180 rnfmsk_z(:) = 0.0_wp 181 ENDIF 182 IF( nn_ice == 0 ) fr_i(:,:) = 0.e0 ! no ice in the domain, ice fraction is always zero 181 IF( nn_isf .EQ. 0 ) THEN ! no specific treatment in vicinity of ice shelf 182 IF( sbc_isf_alloc() /= 0 ) CALL ctl_stop( 'STOP', 'sbc_init : unable to allocate sbc_isf arrays' ) 183 fwfisf (:,:) = 0.0_wp 184 fwfisf_b(:,:) = 0.0_wp 185 END IF 186 IF( nn_ice == 0 .AND. nn_components /= jp_iam_opa ) fr_i(:,:) = 0.e0 ! no ice in the domain, ice fraction is always zero 183 187 184 188 sfx(:,:) = 0.0_wp ! the salt flux due to freezing/melting will be computed (i.e. will be non-zero) … … 186 190 187 191 fmmflx(:,:) = 0.0_wp ! freezing-melting array initialisation 192 193 taum(:,:) = 0.0_wp ! Initialise taum for use in gls in case of reduced restart 188 194 189 195 ! ! restartability 190 IF( MOD( nitend - nit000 + 1, nn_fsbc) /= 0 .OR. & 191 MOD( nstock , nn_fsbc) /= 0 ) THEN 192 WRITE(ctmp1,*) 'experiment length (', nitend - nit000 + 1, ') or nstock (', nstock, & 193 & ' is NOT a multiple of nn_fsbc (', nn_fsbc, ')' 194 CALL ctl_stop( ctmp1, 'Impossible to properly do model restart' ) 195 ENDIF 196 ! 197 IF( MOD( rday, REAL(nn_fsbc, wp) * rdt ) /= 0 ) & 198 & CALL ctl_warn( 'nn_fsbc is NOT a multiple of the number of time steps in a day' ) 199 ! 200 IF( ( nn_ice == 2 .OR. nn_ice ==3 ) .AND. .NOT.( ln_blk_clio .OR. ln_blk_core .OR. lk_cpl ) ) & 196 IF( ( nn_ice == 2 .OR. nn_ice ==3 ) .AND. .NOT.( ln_blk_clio .OR. ln_blk_core .OR. ln_cpl ) ) & 201 197 & CALL ctl_stop( 'LIM sea-ice model requires a bulk formulation or coupled configuration' ) 202 IF( nn_ice == 4 .AND. .NOT.( ln_blk_core .OR. l k_cpl ) ) &203 & CALL ctl_stop( 'CICE sea-ice model requires ln_blk_core or l k_cpl' )198 IF( nn_ice == 4 .AND. .NOT.( ln_blk_core .OR. ln_cpl ) ) & 199 & CALL ctl_stop( 'CICE sea-ice model requires ln_blk_core or ln_cpl' ) 204 200 IF( nn_ice == 4 .AND. lk_agrif ) & 205 201 & CALL ctl_stop( 'CICE sea-ice model not currently available with AGRIF' ) 206 202 IF( ( nn_ice == 3 .OR. nn_ice == 4 ) .AND. nn_ice_embd == 0 ) & 207 203 & CALL ctl_stop( 'LIM3 and CICE sea-ice models require nn_ice_embd = 1 or 2' ) 208 #if defined key_coupled 209 IF( ln_iceflx_ave .AND. ln_iceflx_linear ) & 210 & CALL ctl_stop( ' ln_iceflx_ave and ln_iceflx_linear options are not compatible' ) 211 IF( ( nn_ice ==3 .AND. lk_cpl) .AND. .NOT. ( ln_iceflx_ave .OR. ln_iceflx_linear ) ) & 212 & CALL ctl_stop( ' With lim3 coupled, either ln_iceflx_ave or ln_iceflx_linear must be set to .TRUE.' ) 213 #endif 204 IF( ( nn_ice /= 3 ) .AND. ( nn_limflx >= 0 ) ) & 205 & WRITE(numout,*) 'The nn_limflx>=0 option has no effect if sea ice model is not LIM3' 206 IF( ( nn_ice == 3 ) .AND. ( ln_cpl ) .AND. ( ( nn_limflx == -1 ) .OR. ( nn_limflx == 1 ) ) ) & 207 & CALL ctl_stop( 'The chosen nn_limflx for LIM3 in coupled mode must be 0 or 2' ) 208 IF( ( nn_ice == 3 ) .AND. ( .NOT. ln_cpl ) .AND. ( nn_limflx == 2 ) ) & 209 & CALL ctl_stop( 'The chosen nn_limflx for LIM3 in forced mode cannot be 2' ) 210 214 211 IF( ln_dm2dc ) nday_qsr = -1 ! initialisation flag 215 212 216 IF( ln_dm2dc .AND. .NOT.( ln_flx .OR. ln_blk_core ) ) &213 IF( ln_dm2dc .AND. .NOT.( ln_flx .OR. ln_blk_core ) .AND. nn_components /= jp_iam_opa ) & 217 214 & CALL ctl_stop( 'diurnal cycle into qsr field from daily values requires a flux or core-bulk formulation' ) 218 215 219 IF( ln_dm2dc .AND. ( ( NINT(rday) / ( nn_fsbc * NINT(rdt) ) ) < 8 ) ) &220 & CALL ctl_warn( 'diurnal cycle for qsr: the sampling of the diurnal cycle is too small...' )221 222 216 IF ( ln_wave ) THEN 223 217 !Activated wave module but neither drag nor stokes drift activated … … 233 227 & asked coupling with drag coefficient (ln_cdgw =T) or Stokes drift (ln_sdw=T) ') 234 228 ENDIF 235 236 229 ! ! Choice of the Surface Boudary Condition (set nsbc) 230 ll_purecpl = ln_cpl .AND. .NOT. ln_mixcpl 231 ! 237 232 icpt = 0 238 IF( ln_ana ) THEN ; nsbc = 1 ; icpt = icpt + 1 ; ENDIF ! analytical formulation 239 IF( ln_flx ) THEN ; nsbc = 2 ; icpt = icpt + 1 ; ENDIF ! flux formulation 240 IF( ln_blk_clio ) THEN ; nsbc = 3 ; icpt = icpt + 1 ; ENDIF ! CLIO bulk formulation 241 IF( ln_blk_core ) THEN ; nsbc = 4 ; icpt = icpt + 1 ; ENDIF ! CORE bulk formulation 242 IF( ln_blk_mfs ) THEN ; nsbc = 6 ; icpt = icpt + 1 ; ENDIF ! MFS bulk formulation 243 IF( ln_cpl ) THEN ; nsbc = 5 ; icpt = icpt + 1 ; ENDIF ! Coupled formulation 244 IF( cp_cfg == 'gyre') THEN ; nsbc = 0 ; ENDIF ! GYRE analytical formulation 245 IF( lk_esopa ) nsbc = -1 ! esopa test, ALL formulations 233 IF( ln_ana ) THEN ; nsbc = jp_ana ; icpt = icpt + 1 ; ENDIF ! analytical formulation 234 IF( ln_flx ) THEN ; nsbc = jp_flx ; icpt = icpt + 1 ; ENDIF ! flux formulation 235 IF( ln_blk_clio ) THEN ; nsbc = jp_clio ; icpt = icpt + 1 ; ENDIF ! CLIO bulk formulation 236 IF( ln_blk_core ) THEN ; nsbc = jp_core ; icpt = icpt + 1 ; ENDIF ! CORE bulk formulation 237 IF( ln_blk_mfs ) THEN ; nsbc = jp_mfs ; icpt = icpt + 1 ; ENDIF ! MFS bulk formulation 238 IF( ll_purecpl ) THEN ; nsbc = jp_purecpl ; icpt = icpt + 1 ; ENDIF ! Pure Coupled formulation 239 IF( cp_cfg == 'gyre') THEN ; nsbc = jp_gyre ; ENDIF ! GYRE analytical formulation 240 IF( nn_components == jp_iam_opa ) & 241 & THEN ; nsbc = jp_none ; icpt = icpt + 1 ; ENDIF ! opa coupling via SAS module 242 IF( lk_esopa ) nsbc = jp_esopa ! esopa test, ALL formulations 246 243 ! 247 244 IF( icpt /= 1 .AND. .NOT.lk_esopa ) THEN … … 254 251 IF(lwp) THEN 255 252 WRITE(numout,*) 256 IF( nsbc == -1 ) WRITE(numout,*) ' ESOPA test All surface boundary conditions' 257 IF( nsbc == 0 ) WRITE(numout,*) ' GYRE analytical formulation' 258 IF( nsbc == 1 ) WRITE(numout,*) ' analytical formulation' 259 IF( nsbc == 2 ) WRITE(numout,*) ' flux formulation' 260 IF( nsbc == 3 ) WRITE(numout,*) ' CLIO bulk formulation' 261 IF( nsbc == 4 ) WRITE(numout,*) ' CORE bulk formulation' 262 IF( nsbc == 5 ) WRITE(numout,*) ' coupled formulation' 263 IF( nsbc == 6 ) WRITE(numout,*) ' MFS Bulk formulation' 264 ENDIF 265 ! 266 CALL sbc_ssm_init ! Sea-surface mean fields initialisation 267 ! 268 IF( ln_ssr ) CALL sbc_ssr_init ! Sea-Surface Restoring initialisation 269 ! 270 IF( nn_ice == 4 ) CALL cice_sbc_init( nsbc ) ! CICE initialisation 271 ! 253 IF( nsbc == jp_esopa ) WRITE(numout,*) ' ESOPA test All surface boundary conditions' 254 IF( nsbc == jp_gyre ) WRITE(numout,*) ' GYRE analytical formulation' 255 IF( nsbc == jp_ana ) WRITE(numout,*) ' analytical formulation' 256 IF( nsbc == jp_flx ) WRITE(numout,*) ' flux formulation' 257 IF( nsbc == jp_clio ) WRITE(numout,*) ' CLIO bulk formulation' 258 IF( nsbc == jp_core ) WRITE(numout,*) ' CORE bulk formulation' 259 IF( nsbc == jp_purecpl ) WRITE(numout,*) ' pure coupled formulation' 260 IF( nsbc == jp_mfs ) WRITE(numout,*) ' MFS Bulk formulation' 261 IF( nsbc == jp_none ) WRITE(numout,*) ' OPA coupled to SAS via oasis' 262 IF( ln_mixcpl ) WRITE(numout,*) ' + forced-coupled mixed formulation' 263 IF( nn_components/= jp_iam_nemo ) & 264 & WRITE(numout,*) ' + OASIS coupled SAS' 265 ENDIF 266 ! 267 IF( lk_oasis ) CALL sbc_cpl_init (nn_ice) ! OASIS initialisation. must be done before: (1) first time step 268 ! ! (2) the use of nn_fsbc 269 270 ! nn_fsbc initialization if OPA-SAS coupling via OASIS 271 ! sas model time step has to be declared in OASIS (mandatory) -> nn_fsbc has to be modified accordingly 272 IF ( nn_components /= jp_iam_nemo ) THEN 273 274 IF ( nn_components == jp_iam_opa ) nn_fsbc = cpl_freq('O_SFLX') / NINT(rdt) 275 IF ( nn_components == jp_iam_sas ) nn_fsbc = cpl_freq('I_SFLX') / NINT(rdt) 276 ! 277 IF(lwp)THEN 278 WRITE(numout,*) 279 WRITE(numout,*)" OPA-SAS coupled via OASIS : nn_fsbc re-defined from OASIS namcouple ", nn_fsbc 280 WRITE(numout,*) 281 ENDIF 282 ENDIF 283 284 IF( MOD( nitend - nit000 + 1, nn_fsbc) /= 0 .OR. & 285 MOD( nstock , nn_fsbc) /= 0 ) THEN 286 WRITE(ctmp1,*) 'experiment length (', nitend - nit000 + 1, ') or nstock (', nstock, & 287 & ' is NOT a multiple of nn_fsbc (', nn_fsbc, ')' 288 CALL ctl_stop( ctmp1, 'Impossible to properly do model restart' ) 289 ENDIF 290 ! 291 IF( MOD( rday, REAL(nn_fsbc, wp) * rdt ) /= 0 ) & 292 & CALL ctl_warn( 'nn_fsbc is NOT a multiple of the number of time steps in a day' ) 293 ! 294 IF( ln_dm2dc .AND. ( ( NINT(rday) / ( nn_fsbc * NINT(rdt) ) ) < 8 ) ) & 295 & CALL ctl_warn( 'diurnal cycle for qsr: the sampling of the diurnal cycle is too small...' ) 296 297 CALL sbc_ssm_init ! Sea-surface mean fields initialisation 298 ! 299 IF( ln_ssr ) CALL sbc_ssr_init ! Sea-Surface Restoring initialisation 300 ! 301 CALL sbc_rnf_init ! Runof initialisation 302 ! 303 IF( nn_ice == 3 ) CALL sbc_lim_init ! LIM3 initialisation 304 305 IF( nn_ice == 4 ) CALL cice_sbc_init( nsbc ) ! CICE initialisation 306 272 307 END SUBROUTINE sbc_init 273 308 … … 309 344 ! ! ---------------------------------------- ! 310 345 ! 311 IF( ln_apr_dyn ) CALL sbc_apr( kt ) ! atmospheric pressure provided at kt+0.5*nn_fsbc 346 IF ( .NOT. lk_bdy ) then 347 IF( ln_apr_dyn ) CALL sbc_apr( kt ) ! atmospheric pressure provided at kt+0.5*nn_fsbc 348 ENDIF 312 349 ! (caution called before sbc_ssm) 313 350 ! 314 CALL sbc_ssm( kt )! ocean sea surface variables (sst_m, sss_m, ssu_m, ssv_m)315 ! ! averaged over nf_sbc time-step351 IF( nn_components /= jp_iam_sas ) CALL sbc_ssm( kt ) ! ocean sea surface variables (sst_m, sss_m, ssu_m, ssv_m) 352 ! ! averaged over nf_sbc time-step 316 353 317 354 IF (ln_wave) CALL sbc_wave( kt ) … … 320 357 SELECT CASE( nsbc ) ! Compute ocean surface boundary condition 321 358 ! ! (i.e. utau,vtau, qns, qsr, emp, sfx) 322 CASE( 0 ) ; CALL sbc_gyre ( kt ) ! analytical formulation : GYRE configuration 323 CASE( 1 ) ; CALL sbc_ana ( kt ) ! analytical formulation : uniform sbc 324 CASE( 2 ) ; CALL sbc_flx ( kt ) ! flux formulation 325 CASE( 3 ) ; CALL sbc_blk_clio( kt ) ! bulk formulation : CLIO for the ocean 326 CASE( 4 ) ; CALL sbc_blk_core( kt ) ! bulk formulation : CORE for the ocean 327 CASE( 5 ) ; CALL sbc_cpl_rcv ( kt, nn_fsbc, nn_ice ) ! coupled formulation 328 CASE( 6 ) ; CALL sbc_blk_mfs ( kt ) ! bulk formulation : MFS for the ocean 329 CASE( -1 ) 330 CALL sbc_ana ( kt ) ! ESOPA, test ALL the formulations 331 CALL sbc_gyre ( kt ) ! 332 CALL sbc_flx ( kt ) ! 333 CALL sbc_blk_clio( kt ) ! 334 CALL sbc_blk_core( kt ) ! 335 CALL sbc_cpl_rcv ( kt, nn_fsbc, nn_ice ) ! 359 CASE( jp_gyre ) ; CALL sbc_gyre ( kt ) ! analytical formulation : GYRE configuration 360 CASE( jp_ana ) ; CALL sbc_ana ( kt ) ! analytical formulation : uniform sbc 361 CASE( jp_flx ) ; CALL sbc_flx ( kt ) ! flux formulation 362 CASE( jp_clio ) ; CALL sbc_blk_clio( kt ) ! bulk formulation : CLIO for the ocean 363 CASE( jp_core ) 364 IF( nn_components == jp_iam_sas ) & 365 & CALL sbc_cpl_rcv ( kt, nn_fsbc, nn_ice ) ! OPA-SAS coupling: SAS receiving fields from OPA 366 CALL sbc_blk_core( kt ) ! bulk formulation : CORE for the ocean 367 ! from oce: sea surface variables (sst_m, sss_m, ssu_m, ssv_m) 368 CASE( jp_purecpl ) ; CALL sbc_cpl_rcv ( kt, nn_fsbc, nn_ice ) ! pure coupled formulation 369 ! 370 CASE( jp_mfs ) ; CALL sbc_blk_mfs ( kt ) ! bulk formulation : MFS for the ocean 371 CASE( jp_none ) 372 IF( nn_components == jp_iam_opa ) & 373 CALL sbc_cpl_rcv ( kt, nn_fsbc, nn_ice ) ! OPA-SAS coupling: OPA receiving fields from SAS 374 CASE( jp_esopa ) 375 CALL sbc_ana ( kt ) ! ESOPA, test ALL the formulations 376 CALL sbc_gyre ( kt ) ! 377 CALL sbc_flx ( kt ) ! 378 CALL sbc_blk_clio( kt ) ! 379 CALL sbc_blk_core( kt ) ! 380 CALL sbc_cpl_rcv ( kt, nn_fsbc, nn_ice ) ! 336 381 END SELECT 382 383 IF( ln_mixcpl ) CALL sbc_cpl_rcv ( kt, nn_fsbc, nn_ice ) ! forced-coupled mixed formulation after forcing 384 337 385 338 386 ! !== Misc. Options ==! … … 342 390 CASE( 2 ) ; CALL sbc_ice_lim_2( kt, nsbc ) ! LIM-2 ice model 343 391 CASE( 3 ) ; CALL sbc_ice_lim ( kt, nsbc ) ! LIM-3 ice model 344 !is it useful?345 392 CASE( 4 ) ; CALL sbc_ice_cice ( kt, nsbc ) ! CICE ice model 346 393 END SELECT 347 394 348 395 IF( ln_icebergs ) CALL icb_stp( kt ) ! compute icebergs 396 397 IF( nn_isf /= 0 ) CALL sbc_isf( kt ) ! compute iceshelves 349 398 350 399 IF( ln_rnf ) CALL sbc_rnf( kt ) ! add runoffs to fresh water fluxes … … 357 406 ! ! (update freshwater fluxes) 358 407 !RBbug do not understand why see ticket 667 359 !clem-bugsal CALL lbc_lnk( emp, 'T', 1. ) 408 !clem: it looks like it is necessary for the north fold (in certain circumstances). Don't know why. 409 CALL lbc_lnk( emp, 'T', 1. ) 360 410 ! 361 411 IF( kt == nit000 ) THEN ! set the forcing field at nit000 - 1 ! … … 398 448 ! CALL iom_rstput( kt, nitrst, numrow, 'qsr_b' , qsr ) 399 449 CALL iom_rstput( kt, nitrst, numrow, 'emp_b' , emp ) 400 CALL iom_rstput( kt, nitrst, numrow, 'sfx_b' , sfx)450 CALL iom_rstput( kt, nitrst, numrow, 'sfx_b' , sfx ) 401 451 ENDIF 402 452 … … 413 463 CALL iom_put( "qns" , qns ) ! solar heat flux 414 464 CALL iom_put( "qsr" , qsr ) ! solar heat flux 415 IF( nn_ice > 0 ) CALL iom_put( "ice_cover", fr_i ) ! ice fraction 465 IF( nn_ice > 0 .OR. nn_components == jp_iam_opa ) CALL iom_put( "ice_cover", fr_i ) ! ice fraction 466 CALL iom_put( "taum" , taum ) ! wind stress module 467 CALL iom_put( "wspd" , wndm ) ! wind speed module over free ocean or leads in presence of sea-ice 416 468 ENDIF 417 469 ! 418 470 CALL iom_put( "utau", utau ) ! i-wind stress (stress can be updated at 419 471 CALL iom_put( "vtau", vtau ) ! j-wind stress each time step in sea-ice) 420 CALL iom_put( "taum", taum ) ! wind stress module421 CALL iom_put( "wspd", wndm ) ! wind speed module422 472 ! 423 473 IF(ln_ctl) THEN ! print mean trends (used for debugging) 424 CALL prt_ctl(tab2d_1=fr_i , clinfo1=' fr_i - : ', mask1=tmask, ovlap=1 )425 CALL prt_ctl(tab2d_1=(emp-rnf ), clinfo1=' emp-rnf - : ', mask1=tmask, ovlap=1 )426 CALL prt_ctl(tab2d_1=(sfx-rnf ), clinfo1=' sfx-rnf - : ', mask1=tmask, ovlap=1 )474 CALL prt_ctl(tab2d_1=fr_i , clinfo1=' fr_i - : ', mask1=tmask, ovlap=1 ) 475 CALL prt_ctl(tab2d_1=(emp-rnf + fwfisf), clinfo1=' emp-rnf - : ', mask1=tmask, ovlap=1 ) 476 CALL prt_ctl(tab2d_1=(sfx-rnf + fwfisf), clinfo1=' sfx-rnf - : ', mask1=tmask, ovlap=1 ) 427 477 CALL prt_ctl(tab2d_1=qns , clinfo1=' qns - : ', mask1=tmask, ovlap=1 ) 428 478 CALL prt_ctl(tab2d_1=qsr , clinfo1=' qsr - : ', mask1=tmask, ovlap=1 ) -
branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/sbcrnf.F90
r4624 r5837 19 19 USE phycst ! physical constants 20 20 USE sbc_oce ! surface boundary condition variables 21 USE sbcisf ! PM we could remove it I think 21 22 USE closea ! closed seas 22 23 USE fldread ! read input field at current time step … … 24 25 USE iom ! I/O module 25 26 USE lib_mpp ! MPP library 27 USE eosbn2 28 USE wrk_nemo ! Memory allocation 26 29 27 30 IMPLICIT NONE … … 29 32 30 33 PUBLIC sbc_rnf ! routine call in sbcmod module 31 PUBLIC sbc_rnf_div ! routine called in sshwzvmodule34 PUBLIC sbc_rnf_div ! routine called in divcurl module 32 35 PUBLIC sbc_rnf_alloc ! routine call in sbcmod module 33 36 PUBLIC sbc_rnf_init ! (PUBLIC for TAM) 34 37 ! !!* namsbc_rnf namelist * 35 CHARACTER(len=100), PUBLIC :: cn_dir !: Root directory for location of ssr files 36 LOGICAL , PUBLIC :: ln_rnf_depth !: depth river runoffs attribute specified in a file 37 LOGICAL , PUBLIC :: ln_rnf_tem !: temperature river runoffs attribute specified in a file 38 CHARACTER(len=100) :: cn_dir !: Root directory for location of rnf files 39 LOGICAL :: ln_rnf_depth !: depth river runoffs attribute specified in a file 40 LOGICAL :: ln_rnf_depth_ini !: depth river runoffs computed at the initialisation 41 REAL(wp) :: rn_rnf_max !: maximum value of the runoff climatologie ( ln_rnf_depth_ini = .true ) 42 REAL(wp) :: rn_dep_max !: depth over which runoffs is spread ( ln_rnf_depth_ini = .true ) 43 INTEGER :: nn_rnf_depth_file !: create (=1) a runoff depth file or not (=0) 44 LOGICAL :: ln_rnf_tem !: temperature river runoffs attribute specified in a file 38 45 LOGICAL , PUBLIC :: ln_rnf_sal !: salinity river runoffs attribute specified in a file 39 LOGICAL , PUBLIC :: ln_rnf_emp !: runoffs into a file to be read or already into precipitation40 46 TYPE(FLD_N) , PUBLIC :: sn_rnf !: information about the runoff file to be read 41 TYPE(FLD_N) , PUBLIC:: sn_cnf !: information about the runoff mouth file to be read47 TYPE(FLD_N) :: sn_cnf !: information about the runoff mouth file to be read 42 48 TYPE(FLD_N) :: sn_s_rnf !: information about the salinities of runoff file to be read 43 49 TYPE(FLD_N) :: sn_t_rnf !: information about the temperatures of runoff file to be read 44 50 TYPE(FLD_N) :: sn_dep_rnf !: information about the depth which river inflow affects 45 51 LOGICAL , PUBLIC :: ln_rnf_mouth !: specific treatment in mouths vicinity 46 REAL(wp) , PUBLIC:: rn_hrnf !: runoffs, depth over which enhanced vertical mixing is used52 REAL(wp) :: rn_hrnf !: runoffs, depth over which enhanced vertical mixing is used 47 53 REAL(wp) , PUBLIC :: rn_avt_rnf !: runoffs, value of the additional vertical mixing coef. [m2/s] 48 REAL(wp) , PUBLIC :: rn_rfact !: multiplicative factor for runoff 54 REAL(wp) :: rn_rfact !: multiplicative factor for runoff 55 56 LOGICAL , PUBLIC :: l_rnfcpl = .false. ! runoffs recieved from oasis 49 57 50 58 INTEGER , PUBLIC :: nkrnf = 0 !: nb of levels over which Kz is increased at river mouths … … 55 63 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: rnf_tsc_b, rnf_tsc !: before and now T & S runoff contents [K.m/s & PSU.m/s] 56 64 57 TYPE(FLD), PUBLIC,ALLOCATABLE, DIMENSION(:) :: sf_rnf ! structure: river runoff (file information, fields read)58 TYPE(FLD), PUBLIC,ALLOCATABLE, DIMENSION(:) :: sf_s_rnf ! structure: river runoff salinity (file information, fields read)59 TYPE(FLD), PUBLIC,ALLOCATABLE, DIMENSION(:) :: sf_t_rnf ! structure: river runoff temperature (file information, fields read)65 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_rnf ! structure: river runoff (file information, fields read) 66 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_s_rnf ! structure: river runoff salinity (file information, fields read) 67 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_t_rnf ! structure: river runoff temperature (file information, fields read) 60 68 61 69 !! * Substitutions … … 98 106 INTEGER :: z_err = 0 ! dummy integer for error handling 99 107 !!---------------------------------------------------------------------- 100 ! 101 IF( kt == nit000 ) CALL sbc_rnf_init ! Read namelist and allocate structures 108 REAL(wp), DIMENSION(:,:), POINTER :: ztfrz ! freezing point used for temperature correction 109 ! 110 CALL wrk_alloc( jpi,jpj, ztfrz) 102 111 103 112 ! ! ---------------------------------------- ! … … 109 118 ENDIF 110 119 111 ! !-------------------! 112 IF( .NOT. ln_rnf_emp ) THEN ! Update runoff ! 113 ! !-------------------! 114 ! 115 CALL fld_read ( kt, nn_fsbc, sf_rnf ) ! Read Runoffs data and provide it at kt 116 IF( ln_rnf_tem ) CALL fld_read ( kt, nn_fsbc, sf_t_rnf ) ! idem for runoffs temperature if required 117 IF( ln_rnf_sal ) CALL fld_read ( kt, nn_fsbc, sf_s_rnf ) ! idem for runoffs salinity if required 118 ! 119 ! Runoff reduction only associated to the ORCA2_LIM configuration 120 ! when reading the NetCDF file runoff_1m_nomask.nc 121 IF( cp_cfg == 'orca' .AND. jp_cfg == 2 ) THEN 122 WHERE( 40._wp < gphit(:,:) .AND. gphit(:,:) < 65._wp ) 123 sf_rnf(1)%fnow(:,:,1) = 0.85 * sf_rnf(1)%fnow(:,:,1) 120 ! !-------------------! 121 ! ! Update runoff ! 122 ! !-------------------! 123 ! 124 IF( .NOT. l_rnfcpl ) CALL fld_read ( kt, nn_fsbc, sf_rnf ) ! Read Runoffs data and provide it at kt 125 IF( ln_rnf_tem ) CALL fld_read ( kt, nn_fsbc, sf_t_rnf ) ! idem for runoffs temperature if required 126 IF( ln_rnf_sal ) CALL fld_read ( kt, nn_fsbc, sf_s_rnf ) ! idem for runoffs salinity if required 127 ! 128 ! Runoff reduction only associated to the ORCA2_LIM configuration 129 ! when reading the NetCDF file runoff_1m_nomask.nc 130 IF( cp_cfg == 'orca' .AND. jp_cfg == 2 .AND. .NOT. l_rnfcpl ) THEN 131 WHERE( 40._wp < gphit(:,:) .AND. gphit(:,:) < 65._wp ) 132 sf_rnf(1)%fnow(:,:,1) = 0.85 * sf_rnf(1)%fnow(:,:,1) 133 END WHERE 134 ENDIF 135 ! 136 IF( MOD( kt - 1, nn_fsbc ) == 0 ) THEN 137 ! 138 IF( .NOT. l_rnfcpl ) rnf(:,:) = rn_rfact * ( sf_rnf(1)%fnow(:,:,1) ) ! updated runoff value at time step kt 139 ! 140 ! ! set temperature & salinity content of runoffs 141 IF( ln_rnf_tem ) THEN ! use runoffs temperature data 142 rnf_tsc(:,:,jp_tem) = ( sf_t_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * r1_rau0 143 WHERE( sf_t_rnf(1)%fnow(:,:,1) == -999._wp ) ! if missing data value use SST as runoffs temperature 144 rnf_tsc(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * r1_rau0 124 145 END WHERE 125 ENDIF 126 ! 127 IF( MOD( kt - 1, nn_fsbc ) == 0 ) THEN 128 ! 129 rnf(:,:) = rn_rfact * ( sf_rnf(1)%fnow(:,:,1) ) ! updated runoff value at time step kt 130 ! 131 ! ! set temperature & salinity content of runoffs 132 IF( ln_rnf_tem ) THEN ! use runoffs temperature data 133 rnf_tsc(:,:,jp_tem) = ( sf_t_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * r1_rau0 134 WHERE( sf_t_rnf(1)%fnow(:,:,1) == -999._wp ) ! if missing data value use SST as runoffs temperature 135 rnf_tsc(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * r1_rau0 136 END WHERE 137 ELSE ! use SST as runoffs temperature 138 rnf_tsc(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * r1_rau0 139 ENDIF 140 ! ! use runoffs salinity data 141 IF( ln_rnf_sal ) rnf_tsc(:,:,jp_sal) = ( sf_s_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * r1_rau0 142 ! ! else use S=0 for runoffs (done one for all in the init) 143 IF ( ANY( rnf(:,:) < 0._wp ) ) z_err=1 144 IF(lk_mpp) CALL mpp_sum(z_err) 145 IF( z_err > 0 ) CALL ctl_stop( 'sbc_rnf : negative runnoff values exist' ) 146 ! 147 CALL iom_put( "runoffs", rnf ) ! output runoffs arrays 148 ENDIF 149 ! 150 ENDIF 151 ! 146 WHERE( sf_t_rnf(1)%fnow(:,:,1) == -222._wp ) ! where fwf comes from melting of ice shelves or iceberg 147 ztfrz(:,:) = -1.9 !tfreez( sss_m(:,:) ) !PM to be discuss (trouble if sensitivity study) 148 rnf_tsc(:,:,jp_tem) = ztfrz(:,:) * rnf(:,:) * r1_rau0 - rnf(:,:) * lfusisf * r1_rau0_rcp 149 END WHERE 150 ELSE ! use SST as runoffs temperature 151 rnf_tsc(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * r1_rau0 152 ENDIF 153 ! ! use runoffs salinity data 154 IF( ln_rnf_sal ) rnf_tsc(:,:,jp_sal) = ( sf_s_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * r1_rau0 155 ! ! else use S=0 for runoffs (done one for all in the init) 156 CALL iom_put( "runoffs", rnf ) ! output runoffs arrays 157 ENDIF 158 ! 159 ! ! ---------------------------------------- ! 152 160 IF( kt == nit000 ) THEN ! set the forcing field at nit000 - 1 ! 153 161 ! ! ---------------------------------------- ! … … 160 168 ELSE !* no restart: set from nit000 values 161 169 IF(lwp) WRITE(numout,*) ' nit000-1 runoff forcing fields set to nit000' 162 163 170 rnf_b (:,: ) = rnf (:,: ) 171 rnf_tsc_b(:,:,:) = rnf_tsc(:,:,:) 164 172 ENDIF 165 173 ENDIF … … 176 184 ENDIF 177 185 ! 186 CALL wrk_dealloc( jpi,jpj, ztfrz) 187 ! 178 188 END SUBROUTINE sbc_rnf 179 189 … … 199 209 zfact = 0.5_wp 200 210 ! 201 IF( ln_rnf_depth ) THEN !== runoff distributed over several levels ==!211 IF( ln_rnf_depth .OR. ln_rnf_depth_ini ) THEN !== runoff distributed over several levels ==! 202 212 IF( lk_vvl ) THEN ! variable volume case 203 213 DO jj = 1, jpj ! update the depth over which runoffs are distributed … … 243 253 !!---------------------------------------------------------------------- 244 254 CHARACTER(len=32) :: rn_dep_file ! runoff file name 245 INTEGER :: ji, jj, jk ! dummy loop indices255 INTEGER :: ji, jj, jk, jm ! dummy loop indices 246 256 INTEGER :: ierror, inum ! temporary integer 247 257 INTEGER :: ios ! Local integer output status for namelist read 248 ! 249 NAMELIST/namsbc_rnf/ cn_dir, ln_rnf_emp, ln_rnf_depth, ln_rnf_tem, ln_rnf_sal, & 258 INTEGER :: nbrec ! temporary integer 259 REAL(wp) :: zacoef 260 REAL(wp), DIMENSION(12) :: zrec ! times records 261 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: zrnfcl 262 REAL(wp), DIMENSION(:,: ), ALLOCATABLE :: zrnf 263 ! 264 NAMELIST/namsbc_rnf/ cn_dir , ln_rnf_depth, ln_rnf_tem, ln_rnf_sal, & 250 265 & sn_rnf, sn_cnf , sn_s_rnf , sn_t_rnf , sn_dep_rnf, & 251 & ln_rnf_mouth , rn_hrnf , rn_avt_rnf, rn_rfact 252 !!---------------------------------------------------------------------- 266 & ln_rnf_mouth , rn_hrnf , rn_avt_rnf, rn_rfact, & 267 & ln_rnf_depth_ini , rn_dep_max , rn_rnf_max, nn_rnf_depth_file 268 !!---------------------------------------------------------------------- 269 ! 270 ! !== allocate runoff arrays 271 IF( sbc_rnf_alloc() /= 0 ) CALL ctl_stop( 'STOP', 'sbc_rnf_alloc : unable to allocate arrays' ) 272 ! 273 IF( .NOT. ln_rnf ) THEN ! no specific treatment in vicinity of river mouths 274 ln_rnf_mouth = .FALSE. ! default definition needed for example by sbc_ssr or by tra_adv_muscl 275 nkrnf = 0 276 rnf (:,:) = 0.0_wp 277 rnf_b (:,:) = 0.0_wp 278 rnfmsk (:,:) = 0.0_wp 279 rnfmsk_z(:) = 0.0_wp 280 RETURN 281 ENDIF 253 282 ! 254 283 ! ! ============ … … 271 300 WRITE(numout,*) '~~~~~~~ ' 272 301 WRITE(numout,*) ' Namelist namsbc_rnf' 273 WRITE(numout,*) ' runoff in a file to be read ln_rnf_emp = ', ln_rnf_emp274 302 WRITE(numout,*) ' specific river mouths treatment ln_rnf_mouth = ', ln_rnf_mouth 275 303 WRITE(numout,*) ' river mouth additional Kz rn_avt_rnf = ', rn_avt_rnf … … 277 305 WRITE(numout,*) ' multiplicative factor for runoff rn_rfact = ', rn_rfact 278 306 ENDIF 279 !280 307 ! ! ================== 281 308 ! ! Type of runoff 282 309 ! ! ================== 283 ! !== allocate runoff arrays 284 IF( sbc_rnf_alloc() /= 0 ) CALL ctl_stop( 'STOP', 'sbc_rnf_alloc : unable to allocate arrays' ) 285 ! 286 IF( ln_rnf_emp ) THEN !== runoffs directly provided in the precipitations ==! 287 IF(lwp) WRITE(numout,*) 288 IF(lwp) WRITE(numout,*) ' runoffs directly provided in the precipitations' 289 IF( ln_rnf_depth .OR. ln_rnf_tem .OR. ln_rnf_sal ) THEN 290 CALL ctl_warn( 'runoffs already included in precipitations, so runoff (T,S, depth) attributes will not be used' ) 291 ln_rnf_depth = .FALSE. ; ln_rnf_tem = .FALSE. ; ln_rnf_sal = .FALSE. 292 ENDIF 293 ! 294 ELSE !== runoffs read in a file : set sf_rnf structure ==! 295 ! 310 ! 311 IF( .NOT. l_rnfcpl ) THEN 296 312 ALLOCATE( sf_rnf(1), STAT=ierror ) ! Create sf_rnf structure (runoff inflow) 297 313 IF(lwp) WRITE(numout,*) … … 302 318 ALLOCATE( sf_rnf(1)%fnow(jpi,jpj,1) ) 303 319 IF( sn_rnf%ln_tint ) ALLOCATE( sf_rnf(1)%fdta(jpi,jpj,1,2) ) 304 ! ! fill sf_rnf with the namelist (sn_rnf) and control print305 320 CALL fld_fill( sf_rnf, (/ sn_rnf /), cn_dir, 'sbc_rnf_init', 'read runoffs data', 'namsbc_rnf' ) 306 ! 307 IF( ln_rnf_tem ) THEN ! Create (if required) sf_t_rnf structure 308 IF(lwp) WRITE(numout,*) 309 IF(lwp) WRITE(numout,*) ' runoffs temperatures read in a file' 310 ALLOCATE( sf_t_rnf(1), STAT=ierror ) 311 IF( ierror > 0 ) THEN 312 CALL ctl_stop( 'sbc_rnf_init: unable to allocate sf_t_rnf structure' ) ; RETURN 313 ENDIF 314 ALLOCATE( sf_t_rnf(1)%fnow(jpi,jpj,1) ) 315 IF( sn_t_rnf%ln_tint ) ALLOCATE( sf_t_rnf(1)%fdta(jpi,jpj,1,2) ) 316 CALL fld_fill (sf_t_rnf, (/ sn_t_rnf /), cn_dir, 'sbc_rnf_init', 'read runoff temperature data', 'namsbc_rnf' ) 317 ENDIF 318 ! 319 IF( ln_rnf_sal ) THEN ! Create (if required) sf_s_rnf and sf_t_rnf structures 320 IF(lwp) WRITE(numout,*) 321 IF(lwp) WRITE(numout,*) ' runoffs salinities read in a file' 322 ALLOCATE( sf_s_rnf(1), STAT=ierror ) 323 IF( ierror > 0 ) THEN 324 CALL ctl_stop( 'sbc_rnf_init: unable to allocate sf_s_rnf structure' ) ; RETURN 325 ENDIF 326 ALLOCATE( sf_s_rnf(1)%fnow(jpi,jpj,1) ) 327 IF( sn_s_rnf%ln_tint ) ALLOCATE( sf_s_rnf(1)%fdta(jpi,jpj,1,2) ) 328 CALL fld_fill (sf_s_rnf, (/ sn_s_rnf /), cn_dir, 'sbc_rnf_init', 'read runoff salinity data', 'namsbc_rnf' ) 329 ENDIF 330 ! 331 IF( ln_rnf_depth ) THEN ! depth of runoffs set from a file 332 IF(lwp) WRITE(numout,*) 333 IF(lwp) WRITE(numout,*) ' runoffs depth read in a file' 334 rn_dep_file = TRIM( cn_dir )//TRIM( sn_dep_rnf%clname ) 335 IF( .NOT. sn_dep_rnf%ln_clim ) THEN ; WRITE(rn_dep_file, '(a,"_y",i4)' ) TRIM( rn_dep_file ), nyear ! add year 336 IF( sn_dep_rnf%cltype == 'monthly' ) WRITE(rn_dep_file, '(a,"m",i2)' ) TRIM( rn_dep_file ), nmonth ! add month 337 ENDIF 338 CALL iom_open ( rn_dep_file, inum ) ! open file 339 CALL iom_get ( inum, jpdom_data, sn_dep_rnf%clvar, h_rnf ) ! read the river mouth array 340 CALL iom_close( inum ) ! close file 341 ! 342 nk_rnf(:,:) = 0 ! set the number of level over which river runoffs are applied 343 DO jj = 1, jpj 344 DO ji = 1, jpi 345 IF( h_rnf(ji,jj) > 0._wp ) THEN 346 jk = 2 347 DO WHILE ( jk /= mbkt(ji,jj) .AND. gdept_0(ji,jj,jk) < h_rnf(ji,jj) ) ; jk = jk + 1 ; END DO 348 nk_rnf(ji,jj) = jk 349 ELSEIF( h_rnf(ji,jj) == -1._wp ) THEN ; nk_rnf(ji,jj) = 1 350 ELSEIF( h_rnf(ji,jj) == -999._wp ) THEN ; nk_rnf(ji,jj) = mbkt(ji,jj) 351 ELSE 352 CALL ctl_stop( 'sbc_rnf_init: runoff depth not positive, and not -999 or -1, rnf value in file fort.999' ) 353 WRITE(999,*) 'ji, jj, h_rnf(ji,jj) :', ji, jj, h_rnf(ji,jj) 354 ENDIF 321 ENDIF 322 ! 323 IF( ln_rnf_tem ) THEN ! Create (if required) sf_t_rnf structure 324 IF(lwp) WRITE(numout,*) 325 IF(lwp) WRITE(numout,*) ' runoffs temperatures read in a file' 326 ALLOCATE( sf_t_rnf(1), STAT=ierror ) 327 IF( ierror > 0 ) THEN 328 CALL ctl_stop( 'sbc_rnf_init: unable to allocate sf_t_rnf structure' ) ; RETURN 329 ENDIF 330 ALLOCATE( sf_t_rnf(1)%fnow(jpi,jpj,1) ) 331 IF( sn_t_rnf%ln_tint ) ALLOCATE( sf_t_rnf(1)%fdta(jpi,jpj,1,2) ) 332 CALL fld_fill (sf_t_rnf, (/ sn_t_rnf /), cn_dir, 'sbc_rnf_init', 'read runoff temperature data', 'namsbc_rnf' ) 333 ENDIF 334 ! 335 IF( ln_rnf_sal ) THEN ! Create (if required) sf_s_rnf and sf_t_rnf structures 336 IF(lwp) WRITE(numout,*) 337 IF(lwp) WRITE(numout,*) ' runoffs salinities read in a file' 338 ALLOCATE( sf_s_rnf(1), STAT=ierror ) 339 IF( ierror > 0 ) THEN 340 CALL ctl_stop( 'sbc_rnf_init: unable to allocate sf_s_rnf structure' ) ; RETURN 341 ENDIF 342 ALLOCATE( sf_s_rnf(1)%fnow(jpi,jpj,1) ) 343 IF( sn_s_rnf%ln_tint ) ALLOCATE( sf_s_rnf(1)%fdta(jpi,jpj,1,2) ) 344 CALL fld_fill (sf_s_rnf, (/ sn_s_rnf /), cn_dir, 'sbc_rnf_init', 'read runoff salinity data', 'namsbc_rnf' ) 345 ENDIF 346 ! 347 IF( ln_rnf_depth ) THEN ! depth of runoffs set from a file 348 IF(lwp) WRITE(numout,*) 349 IF(lwp) WRITE(numout,*) ' runoffs depth read in a file' 350 rn_dep_file = TRIM( cn_dir )//TRIM( sn_dep_rnf%clname ) 351 IF( .NOT. sn_dep_rnf%ln_clim ) THEN ; WRITE(rn_dep_file, '(a,"_y",i4)' ) TRIM( rn_dep_file ), nyear ! add year 352 IF( sn_dep_rnf%cltype == 'monthly' ) WRITE(rn_dep_file, '(a,"m",i2)' ) TRIM( rn_dep_file ), nmonth ! add month 353 ENDIF 354 CALL iom_open ( rn_dep_file, inum ) ! open file 355 CALL iom_get ( inum, jpdom_data, sn_dep_rnf%clvar, h_rnf ) ! read the river mouth array 356 CALL iom_close( inum ) ! close file 357 ! 358 nk_rnf(:,:) = 0 ! set the number of level over which river runoffs are applied 359 DO jj = 1, jpj 360 DO ji = 1, jpi 361 IF( h_rnf(ji,jj) > 0._wp ) THEN 362 jk = 2 363 DO WHILE ( jk /= mbkt(ji,jj) .AND. gdept_0(ji,jj,jk) < h_rnf(ji,jj) ) ; jk = jk + 1 364 END DO 365 nk_rnf(ji,jj) = jk 366 ELSEIF( h_rnf(ji,jj) == -1._wp ) THEN ; nk_rnf(ji,jj) = 1 367 ELSEIF( h_rnf(ji,jj) == -999._wp ) THEN ; nk_rnf(ji,jj) = mbkt(ji,jj) 368 ELSE 369 CALL ctl_stop( 'sbc_rnf_init: runoff depth not positive, and not -999 or -1, rnf value in file fort.999' ) 370 WRITE(999,*) 'ji, jj, h_rnf(ji,jj) :', ji, jj, h_rnf(ji,jj) 371 ENDIF 372 END DO 373 END DO 374 DO jj = 1, jpj ! set the associated depth 375 DO ji = 1, jpi 376 h_rnf(ji,jj) = 0._wp 377 DO jk = 1, nk_rnf(ji,jj) 378 h_rnf(ji,jj) = h_rnf(ji,jj) + fse3t(ji,jj,jk) 355 379 END DO 356 380 END DO 357 DO jj = 1, jpj ! set the associated depth 358 DO ji = 1, jpi 359 h_rnf(ji,jj) = 0._wp 360 DO jk = 1, nk_rnf(ji,jj) 361 h_rnf(ji,jj) = h_rnf(ji,jj) + fse3t(ji,jj,jk) 381 END DO 382 ! 383 ELSE IF( ln_rnf_depth_ini ) THEN ! runoffs applied at the surface 384 ! 385 IF(lwp) WRITE(numout,*) 386 IF(lwp) WRITE(numout,*) ' depth of runoff computed once from max value of runoff' 387 IF(lwp) WRITE(numout,*) ' max value of the runoff climatologie (over global domain) rn_rnf_max = ', rn_rnf_max 388 IF(lwp) WRITE(numout,*) ' depth over which runoffs is spread rn_dep_max = ', rn_dep_max 389 IF(lwp) WRITE(numout,*) ' create (=1) a runoff depth file or not (=0) nn_rnf_depth_file = ', nn_rnf_depth_file 390 391 CALL iom_open( TRIM( sn_rnf%clname ), inum ) ! open runoff file 392 CALL iom_gettime( inum, zrec, kntime=nbrec) 393 ALLOCATE( zrnfcl(jpi,jpj,nbrec) ) ; ALLOCATE( zrnf(jpi,jpj) ) 394 DO jm = 1, nbrec 395 CALL iom_get( inum, jpdom_data, TRIM( sn_rnf%clvar ), zrnfcl(:,:,jm), jm ) 396 END DO 397 CALL iom_close( inum ) 398 zrnf(:,:) = MAXVAL( zrnfcl(:,:,:), DIM=3 ) ! maximum value in time 399 DEALLOCATE( zrnfcl ) 400 ! 401 h_rnf(:,:) = 1. 402 ! 403 zacoef = rn_dep_max / rn_rnf_max ! coef of linear relation between runoff and its depth (150m for max of runoff) 404 ! 405 WHERE( zrnf(:,:) > 0._wp ) h_rnf(:,:) = zacoef * zrnf(:,:) ! compute depth for all runoffs 406 ! 407 DO jj = 1, jpj ! take in account min depth of ocean rn_hmin 408 DO ji = 1, jpi 409 IF( zrnf(ji,jj) > 0._wp ) THEN 410 jk = mbkt(ji,jj) 411 h_rnf(ji,jj) = MIN( h_rnf(ji,jj), gdept_0(ji,jj,jk ) ) 412 ENDIF 413 END DO 414 END DO 415 ! 416 nk_rnf(:,:) = 0 ! number of levels on which runoffs are distributed 417 DO jj = 1, jpj 418 DO ji = 1, jpi 419 IF( zrnf(ji,jj) > 0._wp ) THEN 420 jk = 2 421 DO WHILE ( jk /= mbkt(ji,jj) .AND. gdept_0(ji,jj,jk) < h_rnf(ji,jj) ) ; jk = jk + 1 362 422 END DO 423 nk_rnf(ji,jj) = jk 424 ELSE 425 nk_rnf(ji,jj) = 1 426 ENDIF 427 END DO 428 END DO 429 ! 430 DEALLOCATE( zrnf ) 431 ! 432 DO jj = 1, jpj ! set the associated depth 433 DO ji = 1, jpi 434 h_rnf(ji,jj) = 0._wp 435 DO jk = 1, nk_rnf(ji,jj) 436 h_rnf(ji,jj) = h_rnf(ji,jj) + fse3t(ji,jj,jk) 363 437 END DO 364 438 END DO 365 ELSE ! runoffs applied at the surface 366 nk_rnf(:,:) = 1 367 h_rnf (:,:) = fse3t(:,:,1) 368 ENDIF 369 ! 439 END DO 440 ! 441 IF( nn_rnf_depth_file == 1 ) THEN ! save output nb levels for runoff 442 IF(lwp) WRITE(numout,*) ' create runoff depht file' 443 CALL iom_open ( TRIM( sn_dep_rnf%clname ), inum, ldwrt = .TRUE., kiolib = jprstlib ) 444 CALL iom_rstput( 0, 0, inum, 'rodepth', h_rnf ) 445 CALL iom_close ( inum ) 446 ENDIF 447 ELSE ! runoffs applied at the surface 448 nk_rnf(:,:) = 1 449 h_rnf (:,:) = fse3t(:,:,1) 370 450 ENDIF 371 451 ! … … 388 468 IF( rn_hrnf > 0._wp ) THEN 389 469 nkrnf = 2 390 DO WHILE( nkrnf /= jpkm1 .AND. gdepw_1d(nkrnf+1) < rn_hrnf ) ; nkrnf = nkrnf + 1 ; END DO 470 DO WHILE( nkrnf /= jpkm1 .AND. gdepw_1d(nkrnf+1) < rn_hrnf ) ; nkrnf = nkrnf + 1 471 END DO 391 472 IF( ln_sco ) CALL ctl_warn( 'sbc_rnf: number of levels over which Kz is increased is computed for zco...' ) 392 473 ENDIF -
branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/sbcssm.F90
r4292 r5837 14 14 USE oce ! ocean dynamics and tracers 15 15 USE dom_oce ! ocean space and time domain 16 USE sbc_oce ! Surface boundary condition: ocean fields17 16 USE sbc_oce ! surface boundary condition: ocean fields 18 17 USE sbcapr ! surface boundary condition: atmospheric pressure 19 USE prtctl ! Print control (prt_ctl routine)20 USE iom18 USE eosbn2 ! equation of state and related derivatives 19 ! 21 20 USE in_out_manager ! I/O manager 21 USE prtctl ! Print control 22 USE iom ! IOM library 22 23 23 24 IMPLICIT NONE … … 54 55 INTEGER, INTENT(in) :: kt ! ocean time step 55 56 ! 57 INTEGER :: ji, jj ! loop index 56 58 REAL(wp) :: zcoef, zf_sbc ! local scalar 59 REAL(wp), DIMENSION(jpi,jpj,jpts) :: zts 57 60 !!--------------------------------------------------------------------- 58 ! ! ---------------------------------------- ! 61 62 ! !* surface T-, U-, V- ocean level variables (T, S, depth, velocity) 63 DO jj = 1, jpj 64 DO ji = 1, jpi 65 zts(ji,jj,jp_tem) = tsn(ji,jj,mikt(ji,jj),jp_tem) 66 zts(ji,jj,jp_sal) = tsn(ji,jj,mikt(ji,jj),jp_sal) 67 END DO 68 END DO 69 ! 59 70 IF( nn_fsbc == 1 ) THEN ! Instantaneous surface fields ! 60 71 ! ! ---------------------------------------- ! 61 72 ssu_m(:,:) = ub(:,:,1) 62 73 ssv_m(:,:) = vb(:,:,1) 63 sst_m(:,:) = tsn(:,:,1,jp_tem) 64 sss_m(:,:) = tsn(:,:,1,jp_sal) 74 IF( ln_useCT ) THEN ; sst_m(:,:) = eos_pt_from_ct( zts(:,:,jp_tem), zts(:,:,jp_sal) ) 75 ELSE ; sst_m(:,:) = zts(:,:,jp_tem) 76 ENDIF 77 sss_m(:,:) = zts(:,:,jp_sal) 65 78 ! ! removed inverse barometer ssh when Patm forcing is used (for sea-ice dynamics) 66 79 IF( ln_apr_dyn ) THEN ; ssh_m(:,:) = sshn(:,:) - 0.5 * ( ssh_ib(:,:) + ssh_ibb(:,:) ) … … 68 81 ENDIF 69 82 ! 70 IF( lk_vvl ) fse3t_m(:,:) = fse3t_n(:,:,1) 83 IF( lk_vvl ) e3t_m(:,:) = fse3t_n(:,:,1) 84 ! 85 frq_m(:,:) = fraqsr_1lev(:,:) 71 86 ! 72 87 ELSE … … 79 94 ssu_m(:,:) = zcoef * ub(:,:,1) 80 95 ssv_m(:,:) = zcoef * vb(:,:,1) 81 sst_m(:,:) = zcoef * tsn(:,:,1,jp_tem) 82 sss_m(:,:) = zcoef * tsn(:,:,1,jp_sal) 83 ! ! removed inverse barometer ssh when Patm forcing is used 96 IF( ln_useCT ) THEN ; sst_m(:,:) = zcoef * eos_pt_from_ct( zts(:,:,jp_tem), zts(:,:,jp_sal) ) 97 ELSE ; sst_m(:,:) = zcoef * zts(:,:,jp_tem) 98 ENDIF 99 sss_m(:,:) = zcoef * zts(:,:,jp_sal) 100 ! ! removed inverse barometer ssh when Patm forcing is used (for sea-ice dynamics) 84 101 IF( ln_apr_dyn ) THEN ; ssh_m(:,:) = zcoef * ( sshn(:,:) - 0.5 * ( ssh_ib(:,:) + ssh_ibb(:,:) ) ) 85 ELSE ; ssh_m(:,:) = zcoef * sshn(:,:) 86 ENDIF 87 IF( lk_vvl ) fse3t_m(:,:) = zcoef * fse3t_n(:,:,1) 102 ELSE ; ssh_m(:,:) = zcoef * sshn(:,:) 103 ENDIF 104 ! 105 IF( lk_vvl ) e3t_m(:,:) = zcoef * fse3t_n(:,:,1) 106 ! 107 frq_m(:,:) = zcoef * fraqsr_1lev(:,:) 88 108 ! ! ---------------------------------------- ! 89 109 ELSEIF( MOD( kt - 2 , nn_fsbc ) == 0 ) THEN ! Initialisation: New mean computation ! … … 94 114 sss_m(:,:) = 0.e0 95 115 ssh_m(:,:) = 0.e0 96 IF( lk_vvl ) fse3t_m(:,:) = 0.e0 116 IF( lk_vvl ) e3t_m(:,:) = 0.e0 117 frq_m(:,:) = 0.e0 97 118 ENDIF 98 119 ! ! ---------------------------------------- ! … … 101 122 ssu_m(:,:) = ssu_m(:,:) + ub(:,:,1) 102 123 ssv_m(:,:) = ssv_m(:,:) + vb(:,:,1) 103 sst_m(:,:) = sst_m(:,:) + tsn(:,:,1,jp_tem) 104 sss_m(:,:) = sss_m(:,:) + tsn(:,:,1,jp_sal) 124 IF( ln_useCT ) THEN ; sst_m(:,:) = sst_m(:,:) + eos_pt_from_ct( zts(:,:,jp_tem), zts(:,:,jp_sal) ) 125 ELSE ; sst_m(:,:) = sst_m(:,:) + zts(:,:,jp_tem) 126 ENDIF 127 sss_m(:,:) = sss_m(:,:) + zts(:,:,jp_sal) 105 128 ! ! removed inverse barometer ssh when Patm forcing is used (for sea-ice dynamics) 106 IF( ln_apr_dyn ) THEN ; ssh_m(:,:) = ssh_m(:,:) + sshn(:,:) - 0.5 * 129 IF( ln_apr_dyn ) THEN ; ssh_m(:,:) = ssh_m(:,:) + sshn(:,:) - 0.5 * ( ssh_ib(:,:) + ssh_ibb(:,:) ) 107 130 ELSE ; ssh_m(:,:) = ssh_m(:,:) + sshn(:,:) 108 131 ENDIF 109 IF( lk_vvl ) fse3t_m(:,:) = fse3t_m(:,:) + fse3t_n(:,:,1) 132 ! 133 IF( lk_vvl ) e3t_m(:,:) = fse3t_m(:,:) + fse3t_n(:,:,1) 134 ! 135 frq_m(:,:) = frq_m(:,:) + fraqsr_1lev(:,:) 110 136 111 137 ! ! ---------------------------------------- ! … … 118 144 ssv_m(:,:) = ssv_m(:,:) * zcoef ! 119 145 ssh_m(:,:) = ssh_m(:,:) * zcoef ! mean SSH [m] 120 IF( lk_vvl ) fse3t_m(:,:) = fse3t_m(:,:) * zcoef ! mean vertical scale factor [m] 146 IF( lk_vvl ) e3t_m(:,:) = fse3t_m(:,:) * zcoef ! mean vertical scale factor [m] 147 frq_m(:,:) = frq_m(:,:) * zcoef ! mean fraction of solar net radiation absorbed in the 1st T level [-] 121 148 ! 122 149 ENDIF … … 135 162 CALL iom_rstput( kt, nitrst, numrow, 'sss_m' , sss_m ) 136 163 CALL iom_rstput( kt, nitrst, numrow, 'ssh_m' , ssh_m ) 137 IF( lk_vvl ) THEN 138 CALL iom_rstput( kt, nitrst, numrow, 'fse3t_m' , fse3t_m(:,:) ) 139 END IF 140 ! 141 ENDIF 142 ! 164 IF( lk_vvl ) CALL iom_rstput( kt, nitrst, numrow, 'e3t_m' , e3t_m ) 165 CALL iom_rstput( kt, nitrst, numrow, 'frq_m' , frq_m ) 166 ! 167 ENDIF 168 ! 169 ENDIF 170 ! 171 IF( MOD( kt - 1 , nn_fsbc ) == 0 ) THEN ! Mean value at each nn_fsbc time-step ! 172 CALL iom_put( 'ssu_m', ssu_m ) 173 CALL iom_put( 'ssv_m', ssv_m ) 174 CALL iom_put( 'sst_m', sst_m ) 175 CALL iom_put( 'sss_m', sss_m ) 176 CALL iom_put( 'ssh_m', ssh_m ) 177 IF( lk_vvl ) CALL iom_put( 'e3t_m', e3t_m ) 178 CALL iom_put( 'frq_m', frq_m ) 143 179 ENDIF 144 180 ! … … 176 212 CALL iom_get( numror, jpdom_autoglo, 'sss_m' , sss_m ) ! " " salinity (T-point) 177 213 CALL iom_get( numror, jpdom_autoglo, 'ssh_m' , ssh_m ) ! " " height (T-point) 178 IF( lk_vvl ) CALL iom_get( numror, jpdom_autoglo, 'fse3t_m', fse3t_m(:,:) ) 214 IF( lk_vvl ) CALL iom_get( numror, jpdom_autoglo, 'e3t_m', e3t_m ) 215 ! fraction of solar net radiation absorbed in 1st T level 216 IF( iom_varid( numror, 'frq_m', ldstop = .FALSE. ) > 0 ) THEN 217 CALL iom_get( numror, jpdom_autoglo, 'frq_m' , frq_m ) 218 ELSE 219 frq_m(:,:) = 1._wp ! default definition 220 ENDIF 179 221 ! 180 222 IF( zf_sbc /= REAL( nn_fsbc, wp ) ) THEN ! nn_fsbc has changed between 2 runs … … 187 229 sss_m(:,:) = zcoef * sss_m(:,:) 188 230 ssh_m(:,:) = zcoef * ssh_m(:,:) 189 IF( lk_vvl ) fse3t_m(:,:) = zcoef * fse3t_m(:,:) 231 IF( lk_vvl ) e3t_m(:,:) = zcoef * fse3t_m(:,:) 232 frq_m(:,:) = zcoef * frq_m(:,:) 190 233 ELSE 191 234 IF(lwp) WRITE(numout,*) '~~~~~~~ mean fields read in the ocean restart file' … … 194 237 ENDIF 195 238 ! 239 IF( .NOT. l_ssm_mean ) THEN ! default initialisation. needed by lim_istate 240 ! 241 IF(lwp) WRITE(numout,*) ' default initialisation of ss?_m arrays' 242 ssu_m(:,:) = ub(:,:,1) 243 ssv_m(:,:) = vb(:,:,1) 244 IF( ln_useCT ) THEN ; sst_m(:,:) = eos_pt_from_ct( tsn(:,:,1,jp_tem), tsn(:,:,1,jp_sal) ) 245 ELSE ; sst_m(:,:) = tsn(:,:,1,jp_tem) 246 ENDIF 247 sss_m(:,:) = tsn(:,:,1,jp_sal) 248 ssh_m(:,:) = sshn(:,:) 249 IF( lk_vvl ) e3t_m(:,:) = fse3t_n(:,:,1) 250 frq_m(:,:) = 1._wp 251 ! 252 ENDIF 253 ! 196 254 END SUBROUTINE sbc_ssm_init 197 255 -
branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/sbcssr.F90
r4624 r5837 10 10 !!---------------------------------------------------------------------- 11 11 !! sbc_ssr : add to sbc a restoring term toward SST/SSS climatology 12 !! sbc_ssr_init : initialisation of surface restoring 12 13 !!---------------------------------------------------------------------- 13 14 USE oce ! ocean dynamics and tracers … … 16 17 USE phycst ! physical constants 17 18 USE sbcrnf ! surface boundary condition : runoffs 19 ! 18 20 USE fldread ! read input fields 19 21 USE iom ! I/O manager … … 93 95 ! 94 96 IF( nn_sstr == 1 ) THEN !* Temperature restoring term 95 !CDIR COLLAPSE96 97 DO jj = 1, jpj 97 98 DO ji = 1, jpi -
branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/sbctide.F90
- Property svn:keywords set to Id
r4292 r5837 36 36 !!---------------------------------------------------------------------- 37 37 !! NEMO/OPA 3.5 , NEMO Consortium (2013) 38 !! $Id :$38 !! $Id$ 39 39 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 40 40 !!---------------------------------------------------------------------- -
branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/sbcwave.F90
- Property svn:keywords set to Id
r4624 r5837 39 39 !!---------------------------------------------------------------------- 40 40 !! NEMO/OPA 4.0 , NEMO Consortium (2011) 41 !! $Id :$41 !! $Id$ 42 42 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 43 43 !!---------------------------------------------------------------------- -
branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/tide_mod.F90
- Property svn:keywords set to Id
r4292 r5837 35 35 !!---------------------------------------------------------------------- 36 36 !! NEMO/OPA 3.3 , LOCEAN-IPSL (2010) 37 !! $Id :$37 !! $Id$ 38 38 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 39 39 !!---------------------------------------------------------------------- -
branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/tideini.F90
- Property svn:keywords set to Id
r4624 r5837 36 36 !!---------------------------------------------------------------------- 37 37 !! NEMO/OPA 3.5 , NEMO Consortium (2013) 38 !! $Id :$38 !! $Id$ 39 39 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 40 40 !!---------------------------------------------------------------------- … … 80 80 END DO 81 81 END DO 82 ! 83 ! Ensure that tidal components have been set in namelist_cfg 84 IF( nb_harmo .EQ. 0 ) CALL ctl_stop( 'tide_init : No tidal components set in nam_tide' ) 82 85 ! 83 86 IF(lwp) THEN -
branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/updtide.F90
- Property svn:keywords set to Id
r4292 r5837 26 26 !!---------------------------------------------------------------------- 27 27 !! NEMO/OPA 3.3 , NEMO Consortium (2010) 28 !! $Id : sbcfwb.F90 3625 2012-11-21 13:19:18Z acc$28 !! $Id$ 29 29 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 30 30 !!----------------------------------------------------------------------
Note: See TracChangeset
for help on using the changeset viewer.