- Timestamp:
- 2018-10-29T13:03:40+01:00 (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/UKMO/dev_r5518_AMM15_package/NEMOGCM/NEMO/OPA_SRC/SBC/sbcflx.F90
r10246 r10249 22 22 USE lib_mpp ! distribued memory computing library 23 23 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 24 USE wrk_nemo ! work arrays 24 25 25 26 IMPLICIT NONE … … 28 29 PUBLIC sbc_flx ! routine called by step.F90 29 30 30 INTEGER , PARAMETER :: jpfld = 5! maximum number of files to read31 INTEGER , PARAMETER :: jpfld = 6 ! maximum number of files to read 31 32 INTEGER , PARAMETER :: jp_utau = 1 ! index of wind stress (i-component) file 32 33 INTEGER , PARAMETER :: jp_vtau = 2 ! index of wind stress (j-component) file … … 34 35 INTEGER , PARAMETER :: jp_qsr = 4 ! index of solar heat file 35 36 INTEGER , PARAMETER :: jp_emp = 5 ! index of evaporation-precipation file 37 INTEGER , PARAMETER :: jp_press = 6 ! index of pressure for UKMO shelf fluxes 36 38 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf ! structure of input fields (file informations, fields read) 39 LOGICAL , PUBLIC :: ln_shelf_flx = .FALSE. ! UKMO SHELF specific flux flag 40 LOGICAL , PUBLIC :: ln_rel_wind = .FALSE. ! UKMO SHELF specific flux flag - relative winds 41 REAL(wp) :: rn_wfac ! multiplication factor for ice/ocean velocity in the calculation of wind stress (clem) 42 INTEGER :: jpfld_local ! maximum number of files to read (locally modified depending on ln_shelf_flx) 37 43 38 44 !! * Substitutions … … 82 88 REAL(wp) :: zcdrag = 1.5e-3 ! drag coefficient 83 89 REAL(wp) :: ztx, zty, zmod, zcoef ! temporary variables 90 REAL :: cs ! UKMO SHELF: Friction co-efficient at surface 91 REAL :: totwindspd ! UKMO SHELF: Magnitude of wind speed vector 92 REAL(wp), DIMENSION(:,:), POINTER :: zwnd_i, zwnd_j ! wind speed components at T-point 93 94 REAL(wp) :: rhoa = 1.22 ! Air density kg/m3 95 REAL(wp) :: cdrag = 1.5e-3 ! drag coefficient 84 96 !! 85 97 CHARACTER(len=100) :: cn_dir ! Root directory for location of flx files 86 98 TYPE(FLD_N), DIMENSION(jpfld) :: slf_i ! array of namelist information structures 87 TYPE(FLD_N) :: sn_utau, sn_vtau, sn_qtot, sn_qsr, sn_emp ! informations about the fields to be read 88 NAMELIST/namsbc_flx/ cn_dir, sn_utau, sn_vtau, sn_qtot, sn_qsr, sn_emp 99 TYPE(FLD_N) :: sn_utau, sn_vtau, sn_qtot, sn_qsr, sn_emp, sn_press ! informations about the fields to be read 100 LOGICAL :: ln_foam_flx = .FALSE. ! UKMO FOAM specific flux flag 101 NAMELIST/namsbc_flx/ cn_dir, sn_utau, sn_vtau, sn_qtot, sn_qsr, sn_emp, & 102 & ln_foam_flx, sn_press, ln_shelf_flx, ln_rel_wind, & 103 & rn_wfac 89 104 !!--------------------------------------------------------------------- 90 105 ! … … 109 124 slf_i(jp_emp ) = sn_emp 110 125 ! 111 ALLOCATE( sf(jpfld), STAT=ierror ) ! set sf structure 126 ALLOCATE( sf(jpfld), STAT=ierror ) ! set sf structure 127 IF( ln_shelf_flx ) slf_i(jp_press) = sn_press 128 129 ! define local jpfld depending on shelf_flx logical 130 IF( ln_shelf_flx ) THEN 131 jpfld_local = jpfld 132 ELSE 133 jpfld_local = jpfld-1 134 ENDIF 135 ! 112 136 IF( ierror > 0 ) THEN 113 137 CALL ctl_stop( 'sbc_flx: unable to allocate sf structure' ) ; RETURN 114 138 ENDIF 115 DO ji= 1, jpfld 139 DO ji= 1, jpfld_local 116 140 ALLOCATE( sf(ji)%fnow(jpi,jpj,1) ) 117 141 IF( slf_i(ji)%ln_tint ) ALLOCATE( sf(ji)%fdta(jpi,jpj,1,2) ) … … 128 152 IF( MOD( kt-1, nn_fsbc ) == 0 ) THEN ! update ocean fluxes at each SBC frequency 129 153 154 !!UKMO SHELF wind speed relative to surface currents - put here to allow merging with coupling branch 155 IF( ln_shelf_flx ) THEN 156 CALL wrk_alloc( jpi,jpj, zwnd_i, zwnd_j ) 157 158 IF( ln_rel_wind ) THEN 159 DO jj = 1, jpj 160 DO ji = 1, jpi 161 zwnd_i(ji,jj) = sf(jp_utau)%fnow(ji,jj,1) - rn_wfac * ssu_m(ji,jj) 162 zwnd_j(ji,jj) = sf(jp_vtau)%fnow(ji,jj,1) - rn_wfac * ssv_m(ji,jj) 163 END DO 164 END DO 165 ELSE 166 zwnd_i(:,:) = sf(jp_utau)%fnow(:,:,1) 167 zwnd_j(:,:) = sf(jp_vtau)%fnow(:,:,1) 168 ENDIF 169 ENDIF 170 130 171 IF( ln_dm2dc ) THEN ; qsr(:,:) = sbc_dcy( sf(jp_qsr)%fnow(:,:,1) ) ! modify now Qsr to include the diurnal cycle 131 172 ELSE ; qsr(:,:) = sf(jp_qsr)%fnow(:,:,1) 132 173 ENDIF 133 174 !CDIR COLLAPSE 175 !!UKMO SHELF effect of atmospheric pressure on SSH 176 ! If using ln_apr_dyn, this is done there so don't repeat here. 177 IF( ln_shelf_flx .AND. .NOT. ln_apr_dyn) THEN 178 DO jj = 1, jpjm1 179 DO ji = 1, jpim1 180 apgu(ji,jj) = (-1.0/rau0)*(sf(jp_press)%fnow(ji+1,jj,1)-sf(jp_press)%fnow(ji,jj,1))/e1u(ji,jj) 181 apgv(ji,jj) = (-1.0/rau0)*(sf(jp_press)%fnow(ji,jj+1,1)-sf(jp_press)%fnow(ji,jj,1))/e2v(ji,jj) 182 END DO 183 END DO 184 ENDIF ! ln_shelf_flx 185 134 186 DO jj = 1, jpj ! set the ocean fluxes from read fields 135 187 DO ji = 1, jpi 136 utau(ji,jj) = sf(jp_utau)%fnow(ji,jj,1) 137 vtau(ji,jj) = sf(jp_vtau)%fnow(ji,jj,1) 138 qns (ji,jj) = sf(jp_qtot)%fnow(ji,jj,1) - sf(jp_qsr)%fnow(ji,jj,1) 139 emp (ji,jj) = sf(jp_emp )%fnow(ji,jj,1) 188 IF( ln_shelf_flx ) THEN 189 !! UKMO SHELF - need atmospheric pressure to calculate Haney forcing 190 pressnow(ji,jj) = sf(jp_press)%fnow(ji,jj,1) 191 !! UKMO SHELF flux files contain wind speed not wind stress 192 totwindspd = sqrt(zwnd_i(ji,jj)*zwnd_i(ji,jj) + zwnd_j(ji,jj)*zwnd_j(ji,jj)) 193 cs = 0.63 + (0.066 * totwindspd) 194 utau(ji,jj) = cs * (rhoa/rau0) * zwnd_i(ji,jj) * totwindspd 195 vtau(ji,jj) = cs * (rhoa/rau0) * zwnd_j(ji,jj) * totwindspd 196 ELSE 197 utau(ji,jj) = sf(jp_utau)%fnow(ji,jj,1) 198 vtau(ji,jj) = sf(jp_vtau)%fnow(ji,jj,1) 199 ENDIF 200 qsr (ji,jj) = sf(jp_qsr )%fnow(ji,jj,1) 201 IF( ln_foam_flx .OR. ln_shelf_flx ) THEN 202 !! UKMO FOAM flux files contain non-solar heat flux (qns) rather than total heat flux (qtot) 203 qns (ji,jj) = sf(jp_qtot)%fnow(ji,jj,1) 204 !! UKMO FOAM flux files contain the net DOWNWARD freshwater flux P-E rather then E-P 205 emp (ji,jj) = -1. * sf(jp_emp )%fnow(ji,jj,1) 206 ELSE 207 qns (ji,jj) = sf(jp_qtot)%fnow(ji,jj,1) - sf(jp_qsr)%fnow(ji,jj,1) 208 emp (ji,jj) = sf(jp_emp )%fnow(ji,jj,1) 209 ENDIF 140 210 END DO 141 211 END DO … … 143 213 qns(:,:) = qns(:,:) - emp(:,:) * sst_m(:,:) * rcp ! mass flux is at SST 144 214 ! 215 216 !! UKMO FOAM wind fluxes need lbc_lnk calls owing to a bug in interp.exe 217 IF( ln_foam_flx ) THEN 218 CALL lbc_lnk( utau(:,:), 'U', -1. ) 219 CALL lbc_lnk( vtau(:,:), 'V', -1. ) 220 ENDIF 221 145 222 ! ! module of wind stress and wind speed at T-point 146 223 zcoef = 1. / ( zrhoa * zcdrag ) … … 162 239 WRITE(numout,*) 163 240 WRITE(numout,*) ' read daily momentum, heat and freshwater fluxes OK' 164 DO jf = 1, jpfld 241 DO jf = 1, jpfld_local 165 242 IF( jf == jp_utau .OR. jf == jp_vtau ) zfact = 1. 166 243 IF( jf == jp_qtot .OR. jf == jp_qsr ) zfact = 0.1 … … 173 250 ENDIF 174 251 ! 252 IF( ln_shelf_flx ) THEN 253 CALL wrk_dealloc( jpi,jpj, zwnd_i, zwnd_j ) 254 ENDIF 255 ! 175 256 ENDIF 176 257 !
Note: See TracChangeset
for help on using the changeset viewer.