Changeset 14995 for NEMO/trunk/tests/ISOMIP+/MY_SRC/sbcfwb.F90
- Timestamp:
- 2021-06-15T19:15:26+02:00 (3 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/trunk/tests/ISOMIP+/MY_SRC/sbcfwb.F90
r13583 r14995 24 24 ! 25 25 USE in_out_manager ! I/O manager 26 USE iom ! IOM 26 27 USE lib_mpp ! distribued memory computing library 27 28 USE timing ! Timing … … 34 35 PUBLIC sbc_fwb ! routine called by step 35 36 36 REAL(wp) :: a_fwb_b ! annual domain averaged freshwater budget37 REAL(wp) :: a_fwb ! for 2 year before (_b) and before year.38 REAL(wp) :: fwfold ! fwfold to be suppressed37 REAL(wp) :: rn_fwb0 ! initial freshwater adjustment flux [kg/m2/s] (nn_fwb = 2 only) 38 REAL(wp) :: a_fwb ! annual domain averaged freshwater budget from the 39 ! previous year 39 40 REAL(wp) :: area ! global mean ocean surface (interior domain) 40 41 … … 65 66 INTEGER, INTENT( in ) :: Kmm ! ocean time level index 66 67 ! 67 INTEGER :: i num, ikty, iyear! local integers68 INTEGER :: ios, inum, ikty ! local integers 68 69 REAL(wp) :: z_fwf, z_fwf_nsrf, zsum_fwf, zsum_erp ! local scalars 69 70 REAL(wp) :: zsurf_neg, zsurf_pos, zsurf_tospread, zcoef ! - - … … 72 73 REAL(wp) ,DIMENSION(1) :: z_fwfprv 73 74 COMPLEX(dp),DIMENSION(1) :: y_fwfnow 75 ! 76 NAMELIST/namsbc_fwb/rn_fwb0 74 77 !!---------------------------------------------------------------------- 75 78 ! 76 79 IF( kt == nit000 ) THEN 80 READ( numnam_ref, namsbc_fwb, IOSTAT = ios, ERR = 901 ) 81 901 IF( ios /= 0 ) CALL ctl_nam( ios, 'namsbc_fwb in reference namelist' ) 82 READ( numnam_cfg, namsbc_fwb, IOSTAT = ios, ERR = 902 ) 83 902 IF( ios > 0 ) CALL ctl_nam( ios, 'namsbc_fwb in configuration namelist' ) 84 IF(lwm) WRITE( numond, namsbc_fwb ) 77 85 IF(lwp) THEN 78 86 WRITE(numout,*) … … 80 88 WRITE(numout,*) '~~~~~~~' 81 89 IF( kn_fwb == 1 ) WRITE(numout,*) ' instantaneously set to zero' 82 IF( kn_fwb == 2 ) WRITE(numout,*) ' adjusted from previous year budget'90 IF( kn_fwb == 4 ) WRITE(numout,*) ' instantaneously set to zero with heat and salt flux correction (ISOMIP+)' 83 91 IF( kn_fwb == 3 ) WRITE(numout,*) ' fwf set to zero and spread out over erp area' 84 IF( kn_fwb == 4 ) WRITE(numout,*) ' instantaneously set to zero with heat and salt flux correction (ISOMIP+)' 92 IF( kn_fwb == 2 ) THEN 93 WRITE(numout,*) ' adjusted from previous year budget' 94 WRITE(numout,*) 95 WRITE(numout,*) ' Namelist namsbc_fwb' 96 WRITE(numout,*) ' Initial freshwater adjustment flux [kg/m2/s] = ', rn_fwb0 97 END IF 85 98 ENDIF 86 99 ! … … 111 124 emp(:,:) = emp(:,:) - z_fwfprv(1) * tmask(:,:,1) 112 125 qns(:,:) = qns(:,:) + zcoef * sst_m(:,:) * tmask(:,:,1) ! account for change to the heat budget due to fw correction 126 ! outputs 127 IF( iom_use('hflx_fwb_cea') ) CALL iom_put( 'hflx_fwb_cea', zcoef * sst_m(:,:) * tmask(:,:,1) ) 128 IF( iom_use('vflx_fwb_cea') ) CALL iom_put( 'vflx_fwb_cea', z_fwfprv(1) * tmask(:,:,1) ) 113 129 ENDIF 114 130 ! … … 131 147 qns(:,:) = qns(:,:) + zcoef * sst_m(:,:) * tmask(:,:,1) ! (Eq. 35 AD2015) ! use sst_m to avoid generation of any bouyancy fluxes 132 148 sfx(:,:) = sfx(:,:) + z_fwf * sss_m(:,:) * tmask(:,:,1) ! (Eq. 36 AD2015) ! use sss_m to avoid generation of any bouyancy fluxes 133 !qns(:,:) = qns(:,:) + zcoef * ( -1.9 ) * tmask(:,:,1) ! (Eq. 35 AD2015) ! could be sst_m if we don't want any bouyancy fluxes 134 !sfx(:,:) = sfx(:,:) + z_fwf * ( 33.8 ) * tmask(:,:,1) ! (Eq. 36 AD2015) ! could be sss_m if we don't want any bouyancy fluxes 135 !qns(:,:) = qns(:,:) + zcoef * ( -1.0 ) * tmask(:,:,1) ! use for ISOMIP+ coupling sanity check (keep ssh cst while playing with cpl conservation option) 136 !sfx(:,:) = sfx(:,:) + z_fwf * ( 34.2 ) * tmask(:,:,1) ! use for ISOMIP+ coupling sanity check (keep ssh cst while playing with cpl conservation option) 137 ENDIF 138 ! 139 CASE ( 2 ) !== fwf budget adjusted from the previous year ==! 140 ! 141 IF( kt == nit000 ) THEN ! initialisation 142 ! ! Read the corrective factor on precipitations (fwfold) 143 CALL ctl_opn( inum, 'EMPave_old.dat', 'OLD', 'FORMATTED', 'SEQUENTIAL', -1, numout, .FALSE. ) 144 READ ( inum, "(24X,I8,2ES24.16)" ) iyear, a_fwb_b, a_fwb 145 CLOSE( inum ) 146 fwfold = a_fwb ! current year freshwater budget correction 147 ! ! estimate from the previous year budget 149 ENDIF 150 ! 151 CASE ( 2 ) !== fw adjustment based on fw budget at the end of the previous year ==! 152 ! 153 IF( kt == nit000 ) THEN ! initialisation 154 ! ! set the fw adjustment (a_fwb) 155 IF ( ln_rstart .AND. iom_varid( numror, 'a_fwb', ldstop = .FALSE. ) > 0 ) THEN ! as read from restart file 156 IF(lwp) WRITE(numout,*) 'sbc_fwb : reading FW-budget adjustment from restart file' 157 CALL iom_get( numror, 'a_fwb', a_fwb ) 158 ELSE ! as specified in namelist 159 a_fwb = rn_fwb0 160 END IF 161 ! 148 162 IF(lwp)WRITE(numout,*) 149 IF(lwp)WRITE(numout,*)'sbc_fwb : year = ',iyear , ' freshwater budget correction = ', fwfold 150 IF(lwp)WRITE(numout,*)' year = ',iyear-1, ' freshwater budget read = ', a_fwb 151 IF(lwp)WRITE(numout,*)' year = ',iyear-2, ' freshwater budget read = ', a_fwb_b 163 IF(lwp)WRITE(numout,*)'sbc_fwb : initial freshwater-budget adjustment = ', a_fwb, 'kg/m2/s' 164 ! 152 165 ENDIF 153 ! ! Update fwfoldif new year start166 ! ! Update a_fwb if new year start 154 167 ikty = 365 * 86400 / rn_Dt !!bug use of 365 days leap year or 360d year !!!!!!! 155 168 IF( MOD( kt, ikty ) == 0 ) THEN 156 a_fwb_b = a_fwb! mean sea level taking into account the ice+snow169 ! mean sea level taking into account the ice+snow 157 170 ! sum over the global domain 158 171 a_fwb = glob_sum( 'sbcfwb', e1e2t(:,:) * ( ssh(:,:,Kmm) + snwice_mass(:,:) * r1_rho0 ) ) 159 172 a_fwb = a_fwb * 1.e+3 / ( area * rday * 365. ) ! convert in Kg/m3/s = mm/s 160 173 !!gm ! !!bug 365d year 161 fwfold = a_fwb ! current year freshwater budget correction162 ! ! estimate from the previous year budget163 174 ENDIF 164 175 ! 165 176 IF( MOD( kt-1, kn_fsbc ) == 0 ) THEN ! correct the freshwater fluxes 166 zcoef = fwfold* rcp167 emp(:,:) = emp(:,:) + fwfold* tmask(:,:,1)177 zcoef = a_fwb * rcp 178 emp(:,:) = emp(:,:) + a_fwb * tmask(:,:,1) 168 179 qns(:,:) = qns(:,:) - zcoef * sst_m(:,:) * tmask(:,:,1) ! account for change to the heat budget due to fw correction 169 ENDIF 170 ! 171 IF( kt == nitend .AND. lwm ) THEN ! save fwfold value in a file (only one required) 172 CALL ctl_opn( inum, 'EMPave.dat', 'REPLACE', 'FORMATTED', 'SEQUENTIAL', -1, numout, .FALSE., narea ) 173 WRITE( inum, "(24X,I8,2ES24.16)" ) nyear, a_fwb_b, a_fwb 174 CLOSE( inum ) 175 ENDIF 180 ! outputs 181 IF( iom_use('hflx_fwb_cea') ) CALL iom_put( 'hflx_fwb_cea', -zcoef * sst_m(:,:) * tmask(:,:,1) ) 182 IF( iom_use('vflx_fwb_cea') ) CALL iom_put( 'vflx_fwb_cea', -a_fwb * tmask(:,:,1) ) 183 ENDIF 184 ! Output restart information 185 IF( lrst_oce ) THEN 186 IF(lwp) WRITE(numout,*) 187 IF(lwp) WRITE(numout,*) 'sbc_fwb : writing FW-budget adjustment to ocean restart file at it = ', kt 188 IF(lwp) WRITE(numout,*) '~~~~' 189 CALL iom_rstput( kt, nitrst, numrow, 'a_fwb', a_fwb ) 190 END IF 191 ! 192 IF( kt == nitend .AND. lwp ) WRITE(numout,*) 'sbc_fwb : final freshwater-budget adjustment = ', a_fwb, 'kg/m2/s' 176 193 ! 177 194 CASE ( 3 ) !== global fwf set to zero and spread out over erp area ==! … … 211 228 qns(:,:) = qns(:,:) - zerp_cor(:,:) * rcp * sst_m(:,:) ! account for change to the heat budget due to fw correction 212 229 erp(:,:) = erp(:,:) + zerp_cor(:,:) 230 ! outputs 231 IF( iom_use('hflx_fwb_cea') ) CALL iom_put( 'hflx_fwb_cea', -zerp_cor(:,:) * rcp * sst_m(:,:) ) 232 IF( iom_use('vflx_fwb_cea') ) CALL iom_put( 'vflx_fwb_cea', -zerp_cor(:,:) ) 213 233 ! 214 234 IF( lwp ) THEN ! control print
Note: See TracChangeset
for help on using the changeset viewer.