- Timestamp:
- 2019-11-20T17:32:11+01:00 (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/UKMO/dev_r5518_GO6_package_FOAMv14_sit/NEMOGCM/NEMO/OPA_SRC/ASM/asminc.F90
r10302 r11939 21 21 !! dyn_asm_inc : Apply the dynamic (u and v) increments 22 22 !! ssh_asm_inc : Apply the SSH increment 23 !! seaice_asm_inc : Apply the seaice increment 23 !! seaice_asm_inc : Apply the sea ice concentration increment 24 !! sit_asm_inc : Apply the sea ice thickness increment 24 25 !!---------------------------------------------------------------------- 25 26 USE wrk_nemo ! Memory Allocation … … 41 42 #if defined key_cice && defined key_asminc 42 43 USE sbc_ice, ONLY : & ! CICE Ice model variables 43 & ndaice_da, n fresh_da, nfsalt_da44 & ndaice_da, ndsit_da, nfresh_da, nfsalt_da 44 45 #endif 45 46 USE sbc_oce ! Surface boundary condition variables. … … 54 55 PUBLIC dyn_asm_inc !: Apply the dynamic (u and v) increments 55 56 PUBLIC ssh_asm_inc !: Apply the SSH increment 56 PUBLIC seaice_asm_inc !: Apply the seaice increment 57 PUBLIC seaice_asm_inc !: Apply the seaice concentration increment 58 PUBLIC sit_asm_inc !: Apply the seaice thickness increment 57 59 PUBLIC bgc_asm_inc !: Apply the biogeochemistry increments 58 60 … … 68 70 LOGICAL, PUBLIC :: ln_dyninc = .FALSE. !: No dynamics (u and v) assimilation increments 69 71 LOGICAL, PUBLIC :: ln_sshinc = .FALSE. !: No sea surface height assimilation increment 70 LOGICAL, PUBLIC :: ln_seaiceinc !: No sea ice concentration increment 72 LOGICAL, PUBLIC :: ln_seaiceinc = .FALSE. !: No sea ice concentration increment 73 LOGICAL, PUBLIC :: ln_sitinc = .FALSE. !: No sea ice thickness increment 71 74 LOGICAL, PUBLIC :: lk_bgcinc = .FALSE. !: No biogeochemistry increments 72 75 LOGICAL, PUBLIC :: ln_salfix = .FALSE. !: Apply minimum salinity check … … 94 97 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: ssh_bkg, ssh_bkginc ! Background sea surface height and its increment 95 98 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: seaice_bkginc ! Increment to the background sea ice conc 99 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: sit_bkginc ! Increment to the background sea ice thickness 96 100 97 101 !! * Substitutions … … 147 151 & nitbkg, nitdin, nitiaustr, nitiaufin, niaufn, & 148 152 & ln_salfix, salfixmin, nn_divdmp, & 149 & ln_seaiceinc, ln_ temnofreeze,&153 & ln_seaiceinc, ln_sitinc, ln_temnofreeze, & 150 154 & mld_choice_bgc, rn_maxchlinc 151 155 !!---------------------------------------------------------------------- … … 155 159 !----------------------------------------------------------------------- 156 160 ln_seaiceinc = .FALSE. 161 ln_sitinc = .FALSE. 157 162 ln_temnofreeze = .FALSE. 158 163 … … 178 183 WRITE(numout,*) ' Logical switch for applying SSH increments ln_sshinc = ', ln_sshinc 179 184 WRITE(numout,*) ' Logical switch for Direct Initialization (DI) ln_asmdin = ', ln_asmdin 180 WRITE(numout,*) ' Logical switch for applying sea ice increments ln_seaiceinc = ', ln_seaiceinc 185 WRITE(numout,*) ' Logical switch for applying SIC increments ln_seaiceinc = ', ln_seaiceinc 186 WRITE(numout,*) ' Logical switch for applying SIT increments ln_sitinc = ', ln_sitinc 181 187 WRITE(numout,*) ' Logical switch for phytoplankton balancing ln_phytobal = ', ln_phytobal 182 188 WRITE(numout,*) ' Logical switch for applying slchltot increments ln_slchltotinc = ', ln_slchltotinc … … 264 270 IF ( ( ( .NOT. ln_asmdin ).AND.( .NOT. ln_asmiau ) ) & 265 271 & .AND.( ( ln_trainc ).OR.( ln_dyninc ).OR.( ln_sshinc ).OR.( ln_seaiceinc ).OR. & 266 & ( l k_bgcinc ) )) &272 & ( ln_sitinc ).OR.( lk_bgcinc ) )) & 267 273 & CALL ctl_stop( ' One or more of ln_trainc, ln_dyninc, ln_sshinc, ln_seaiceinc,', & 268 & ' ln_ (bgc-variable)inc is set to .true.', &274 & ' ln_sitinc and ln_(bgc-variable)inc is set to .true.', & 269 275 & ' but ln_asmdin and ln_asmiau are both set to .false. :', & 270 276 & ' Inconsistent options') … … 275 281 276 282 IF ( ( .NOT. ln_trainc ).AND.( .NOT. ln_dyninc ).AND.( .NOT. ln_sshinc ).AND.( .NOT. ln_seaiceinc ) & 277 & .AND.( .NOT. l k_bgcinc ) ) &283 & .AND.( .NOT. ln_sitinc ).AND.( .NOT. lk_bgcinc ) ) & 278 284 & CALL ctl_warn( ' ln_trainc, ln_dyninc, ln_sshinc, ln_seaiceinc,', & 279 & ' ln_ (bgc-variable)inc are set to .false. :', &285 & ' ln_sitinc and ln_(bgc-variable)inc are set to .false. :', & 280 286 & ' The assimilation increments are not applied') 281 287 … … 383 389 ALLOCATE( ssh_bkginc(jpi,jpj) ) 384 390 ALLOCATE( seaice_bkginc(jpi,jpj)) 391 ALLOCATE( sit_bkginc(jpi,jpj) ) 385 392 #if defined key_asminc 386 393 ALLOCATE( ssh_iau(jpi,jpj) ) … … 392 399 ssh_bkginc(:,:) = 0.0 393 400 seaice_bkginc(:,:) = 0.0 401 sit_bkginc(:,:) = 0.0 394 402 #if defined key_asminc 395 403 ssh_iau(:,:) = 0.0 396 404 #endif 397 405 IF ( ( ln_trainc ).OR.( ln_dyninc ).OR.( ln_sshinc ).OR.( ln_seaiceinc ) & 398 & .OR.( l k_bgcinc ) ) THEN406 & .OR.( ln_sitinc ).OR.( lk_bgcinc ) ) THEN 399 407 400 408 !-------------------------------------------------------------------- … … 459 467 ! to allow for differences in masks 460 468 WHERE( ABS( ssh_bkginc(:,:) ) > 1.0e+10 ) ssh_bkginc(:,:) = 0.0 469 ENDIF 470 471 IF ( ln_sitinc ) THEN 472 CALL iom_get( inum, jpdom_autoglo, 'bckinsit', sit_bkginc, 1 ) 473 ! Apply the masks 474 sit_bkginc(:,:) = sit_bkginc(:,:) * tmask(:,:,1) 475 ! Set missing increments to 0.0 rather than 1e+20 476 ! to allow for differences in masks 477 WHERE( ABS( sit_bkginc(:,:) ) > 1.0e+10 ) sit_bkginc(:,:) = 0.0 461 478 ENDIF 462 479 … … 827 844 ! Perhaps the following call should be in step 828 845 IF ( ln_seaiceinc ) CALL seaice_asm_inc ( kt ) ! apply sea ice concentration increment 846 IF ( ln_sitinc ) CALL sit_asm_inc ( kt ) ! apply sea ice thickness increment 829 847 ! 830 848 END SUBROUTINE tra_asm_inc … … 988 1006 END SUBROUTINE ssh_asm_inc 989 1007 1008 SUBROUTINE sit_asm_inc( kt, kindic ) 1009 !!---------------------------------------------------------------------- 1010 !! *** ROUTINE sit_asm_inc *** 1011 !! 1012 !! ** Purpose : Apply the sea ice thickness assimilation increment. 1013 !! 1014 !! ** Method : Direct initialization or Incremental Analysis Updating. 1015 !! 1016 !! ** Action : 1017 !! 1018 !!---------------------------------------------------------------------- 1019 IMPLICIT NONE 1020 ! 1021 INTEGER, INTENT(in) :: kt ! Current time step 1022 INTEGER, INTENT(in), OPTIONAL :: kindic ! flag for disabling the deallocation 1023 ! 1024 INTEGER :: it 1025 REAL(wp) :: zincwgt ! IAU weight for current time step 1026 ! #if defined key_lim2 1027 ! REAL(wp), DIMENSION(jpi,jpj) :: zofrld, zohicif, zseaicendg, zhicifinc ! LIM 1028 ! REAL(wp) :: zhicifmin = 0.5_wp ! ice minimum depth in metres 1029 ! !!THICKNESS INCS NOT SET UP FOR LIM 1030 ! #endif 1031 !!---------------------------------------------------------------------- 1032 1033 IF ( ln_asmiau ) THEN 1034 1035 !-------------------------------------------------------------------- 1036 ! Incremental Analysis Updating 1037 !-------------------------------------------------------------------- 1038 1039 IF ( ( kt >= nitiaustr_r ).AND.( kt <= nitiaufin_r ) ) THEN 1040 1041 it = kt - nit000 + 1 1042 zincwgt = wgtiau(it) ! IAU weight for the current time step 1043 ! note this is not a tendency so should not be divided by rdt (as with the tracer and other increments) 1044 ! EF: Actually CICE is expecting a tendency so is divided by rdt below 1045 1046 IF(lwp) THEN 1047 WRITE(numout,*) 1048 WRITE(numout,*) 'sit_asm_inc : sea ice thick IAU at time step = ', & 1049 & kt,' with IAU weight = ', wgtiau(it) 1050 WRITE(numout,*) '~~~~~~~~~~~~' 1051 ENDIF 1052 1053 ! Sea-ice : LIM-3 case (to add) 1054 1055 ! #if defined key_lim2 1056 ! ! Sea-ice : LIM-2 case (to add if needed) 1057 ! zofrld (:,:) = frld(:,:) 1058 ! zohicif(:,:) = hicif(:,:) 1059 ! ! 1060 ! frld = MIN( MAX( frld (:,:) - seaice_bkginc(:,:) * zincwgt, 0.0_wp), 1.0_wp) 1061 ! pfrld = MIN( MAX( pfrld(:,:) - seaice_bkginc(:,:) * zincwgt, 0.0_wp), 1.0_wp) 1062 ! fr_i(:,:) = 1.0_wp - frld(:,:) ! adjust ice fraction 1063 ! ! 1064 ! zseaicendg(:,:) = zofrld(:,:) - frld(:,:) ! find out actual sea ice nudge applied 1065 ! ! 1066 ! ! Nudge sea ice depth to bring it up to a required minimum depth 1067 ! WHERE( zseaicendg(:,:) > 0.0_wp .AND. hicif(:,:) < zhicifmin ) 1068 ! zhicifinc(:,:) = (zhicifmin - hicif(:,:)) * zincwgt 1069 ! ELSEWHERE 1070 ! zhicifinc(:,:) = 0.0_wp 1071 ! END WHERE 1072 ! ! 1073 ! ! nudge ice depth 1074 ! hicif (:,:) = hicif (:,:) + zhicifinc(:,:) 1075 ! phicif(:,:) = phicif(:,:) + zhicifinc(:,:) 1076 ! ! 1077 ! ! seaice salinity balancing (to add) 1078 ! #endif 1079 1080 #if defined key_cice && defined key_asminc 1081 ! Sea-ice thickness : CICE case. Pass ice thickness increment tendency into CICE 1082 ndsit_da(:,:) = sit_bkginc(:,:) * zincwgt / rdt 1083 #endif 1084 1085 IF ( kt == nitiaufin_r ) THEN 1086 DEALLOCATE( sit_bkginc ) 1087 ENDIF 1088 1089 ELSE 1090 1091 #if defined key_cice && defined key_asminc 1092 ! Sea-ice thickness : CICE case. Zero ice increment tendency into CICE 1093 ndsit_da(:,:) = 0.0_wp 1094 #endif 1095 1096 ENDIF 1097 1098 ELSEIF ( ln_asmdin ) THEN 1099 1100 !-------------------------------------------------------------------- 1101 ! Direct Initialization 1102 !-------------------------------------------------------------------- 1103 1104 IF ( kt == nitdin_r ) THEN 1105 1106 neuler = 0 ! Force Euler forward step 1107 1108 ! Sea-ice : LIM-3 case (to add) 1109 1110 ! #if defined key_lim2 1111 ! ! Sea-ice : LIM-2 case (add if needed) 1112 ! zofrld(:,:)=frld(:,:) 1113 ! zohicif(:,:)=hicif(:,:) 1114 ! ! 1115 ! ! Initialize the now fields the background + increment 1116 ! frld (:,:) = MIN( MAX( frld(:,:) - seaice_bkginc(:,:), 0.0_wp), 1.0_wp) 1117 ! pfrld(:,:) = frld(:,:) 1118 ! fr_i (:,:) = 1.0_wp - frld(:,:) ! adjust ice fraction 1119 ! zseaicendg(:,:) = zofrld(:,:) - frld(:,:) ! find out actual sea ice nudge applied 1120 ! ! 1121 ! ! Nudge sea ice depth to bring it up to a required minimum depth 1122 ! WHERE( zseaicendg(:,:) > 0.0_wp .AND. hicif(:,:) < zhicifmin ) 1123 ! zhicifinc(:,:) = (zhicifmin - hicif(:,:)) * zincwgt 1124 ! ELSEWHERE 1125 ! zhicifinc(:,:) = 0.0_wp 1126 ! END WHERE 1127 ! ! 1128 ! ! nudge ice depth 1129 ! hicif (:,:) = hicif (:,:) + zhicifinc(:,:) 1130 ! phicif(:,:) = phicif(:,:) 1131 ! ! 1132 ! ! seaice salinity balancing (to add) 1133 ! #endif 1134 1135 #if defined key_cice && defined key_asminc 1136 ! Sea-ice thickness : CICE case. Pass ice thickness increment tendency into CICE 1137 ndsit_da(:,:) = sit_bkginc(:,:) / rdt 1138 #endif 1139 IF ( .NOT. PRESENT(kindic) ) THEN 1140 DEALLOCATE( sit_bkginc ) 1141 END IF 1142 1143 ELSE 1144 1145 #if defined key_cice && defined key_asminc 1146 ! Sea-ice thicnkness : CICE case. Zero ice thickness increment tendency into CICE 1147 ndsit_da(:,:) = 0.0_wp 1148 #endif 1149 1150 ENDIF 1151 1152 !#if defined defined key_lim2 || defined key_cice 1153 ! 1154 ! IF (ln_seaicebal ) THEN 1155 ! !! balancing salinity increments 1156 ! !! simple case from limflx.F90 (doesn't include a mass flux) 1157 ! !! assumption is that as ice concentration is reduced or increased 1158 ! !! the snow and ice depths remain constant 1159 ! !! note that snow is being created where ice concentration is being increased 1160 ! !! - could be more sophisticated and 1161 ! !! not do this (but would need to alter h_snow) 1162 ! 1163 ! usave(:,:,:)=sb(:,:,:) ! use array as a temporary store 1164 ! 1165 ! DO jj = 1, jpj 1166 ! DO ji = 1, jpi 1167 ! ! calculate change in ice and snow mass per unit area 1168 ! ! positive values imply adding salt to the ocean (results from ice formation) 1169 ! ! fwf : ice formation and melting 1170 ! 1171 ! zfons = ( -nfresh_da(ji,jj)*soce + nfsalt_da(ji,jj) )*rdt 1172 ! 1173 ! ! change salinity down to mixed layer depth 1174 ! mld=hmld_kara(ji,jj) 1175 ! 1176 ! ! prevent small mld 1177 ! ! less than 10m can cause salinity instability 1178 ! IF (mld < 10) mld=10 1179 ! 1180 ! ! set to bottom of a level 1181 ! DO jk = jpk-1, 2, -1 1182 ! IF ((mld > gdepw(ji,jj,jk)) .and. (mld < gdepw(ji,jj,jk+1))) THEN 1183 ! mld=gdepw(ji,jj,jk+1) 1184 ! jkmax=jk 1185 ! ENDIF 1186 ! ENDDO 1187 ! 1188 ! ! avoid applying salinity balancing in shallow water or on land 1189 ! ! 1190 ! 1191 ! ! dsal_ocn (psu kg m^-2) / (kg m^-3 * m) 1192 ! 1193 ! dsal_ocn=0.0_wp 1194 ! sal_thresh=5.0_wp ! minimum salinity threshold for salinity balancing 1195 ! 1196 ! if (tmask(ji,jj,1) > 0 .AND. tmask(ji,jj,jkmax) > 0 ) & 1197 ! dsal_ocn = zfons / (rhop(ji,jj,1) * mld) 1198 ! 1199 ! ! put increments in for levels in the mixed layer 1200 ! ! but prevent salinity below a threshold value 1201 ! 1202 ! DO jk = 1, jkmax 1203 ! 1204 ! IF (dsal_ocn > 0.0_wp .or. sb(ji,jj,jk)+dsal_ocn > sal_thresh) THEN 1205 ! sb(ji,jj,jk) = sb(ji,jj,jk) + dsal_ocn 1206 ! sn(ji,jj,jk) = sn(ji,jj,jk) + dsal_ocn 1207 ! ENDIF 1208 ! 1209 ! ENDDO 1210 ! 1211 ! ! ! salt exchanges at the ice/ocean interface 1212 ! ! zpmess = zfons / rdt_ice ! rdt_ice is ice timestep 1213 ! ! 1214 ! !! Adjust fsalt. A +ve fsalt means adding salt to ocean 1215 ! !! fsalt(ji,jj) = fsalt(ji,jj) + zpmess ! adjust fsalt 1216 ! !! 1217 ! !! emps(ji,jj) = emps(ji,jj) + zpmess ! or adjust emps (see icestp1d) 1218 ! !! ! E-P (kg m-2 s-2) 1219 ! ! emp(ji,jj) = emp(ji,jj) + zpmess ! E-P (kg m-2 s-2) 1220 ! ENDDO !ji 1221 ! ENDDO !jj! 1222 ! 1223 ! ENDIF !ln_seaicebal 1224 ! 1225 !#endif 1226 1227 1228 END SUBROUTINE sit_asm_inc 990 1229 991 1230 SUBROUTINE seaice_asm_inc( kt, kindic ) … … 993 1232 !! *** ROUTINE seaice_asm_inc *** 994 1233 !! 995 !! ** Purpose : Apply the sea ice assimilation increment.1234 !! ** Purpose : Apply the sea ice concentration assimilation increment. 996 1235 !! 997 1236 !! ** Method : Direct initialization or Incremental Analysis Updating.
Note: See TracChangeset
for help on using the changeset viewer.