New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 12613 for branches/UKMO/dev_r5518_GO6_package_FOAMv14/NEMOGCM/NEMO/OPA_SRC/ASM – NEMO

Ignore:
Timestamp:
2020-03-26T12:30:42+01:00 (4 years ago)
Author:
dcarneir
Message:

Including sea ice thickness in GO6 branch

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/UKMO/dev_r5518_GO6_package_FOAMv14/NEMOGCM/NEMO/OPA_SRC/ASM/asminc.F90

    r10302 r12613  
    2121   !!   dyn_asm_inc    : Apply the dynamic (u and v) increments 
    2222   !!   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 
    2425   !!---------------------------------------------------------------------- 
    2526   USE wrk_nemo         ! Memory Allocation 
     
    4142#if defined key_cice && defined key_asminc 
    4243   USE sbc_ice, ONLY : & ! CICE Ice model variables 
    43    & ndaice_da, nfresh_da, nfsalt_da 
     44   & ndaice_da, ndsit_da, nfresh_da, nfsalt_da 
    4445#endif 
    4546   USE sbc_oce          ! Surface boundary condition variables. 
     
    5455   PUBLIC   dyn_asm_inc    !: Apply the dynamic (u and v) increments 
    5556   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 
    5759   PUBLIC   bgc_asm_inc    !: Apply the biogeochemistry increments 
    5860 
     
    6365#endif 
    6466   LOGICAL, PUBLIC :: ln_bkgwri = .FALSE.      !: No output of the background state fields 
     67   LOGICAL, PUBLIC :: ln_avgbkg = .FALSE.      !: No output of the mean background state fields 
    6568   LOGICAL, PUBLIC :: ln_asmiau = .FALSE.      !: No applying forcing with an assimilation increment 
    6669   LOGICAL, PUBLIC :: ln_asmdin = .FALSE.      !: No direct initialization 
     
    6871   LOGICAL, PUBLIC :: ln_dyninc = .FALSE.      !: No dynamics (u and v) assimilation increments 
    6972   LOGICAL, PUBLIC :: ln_sshinc = .FALSE.      !: No sea surface height assimilation increment 
    70    LOGICAL, PUBLIC :: ln_seaiceinc             !: No sea ice concentration increment 
     73   LOGICAL, PUBLIC :: ln_seaiceinc = .FALSE.   !: No sea ice concentration increment 
     74   LOGICAL, PUBLIC :: ln_sitinc = .FALSE.      !: No sea ice thickness increment 
    7175   LOGICAL, PUBLIC :: lk_bgcinc = .FALSE.      !: No biogeochemistry increments 
    7276   LOGICAL, PUBLIC :: ln_salfix = .FALSE.      !: Apply minimum salinity check 
     
    9498   REAL(wp), DIMENSION(:,:), ALLOCATABLE ::   ssh_bkg, ssh_bkginc   ! Background sea surface height and its increment 
    9599   REAL(wp), DIMENSION(:,:), ALLOCATABLE ::   seaice_bkginc         ! Increment to the background sea ice conc 
     100   REAL(wp), DIMENSION(:,:), ALLOCATABLE ::   sit_bkginc            ! Increment to the background sea ice thickness 
    96101 
    97102   !! * Substitutions 
     
    136141      REAL(wp), POINTER, DIMENSION(:,:) ::   hdiv   ! 2D workspace 
    137142      !! 
    138       NAMELIST/nam_asminc/ ln_bkgwri, ln_balwri,                           & 
     143      NAMELIST/nam_asminc/ ln_bkgwri, ln_avgbkg, ln_balwri,                & 
    139144         &                 ln_trainc, ln_dyninc, ln_sshinc,                & 
    140145         &                 ln_phytobal, ln_slchltotinc, ln_slchldiainc,    & 
     
    147152         &                 nitbkg, nitdin, nitiaustr, nitiaufin, niaufn,   & 
    148153         &                 ln_salfix, salfixmin, nn_divdmp,                & 
    149          &                 ln_seaiceinc, ln_temnofreeze,                   & 
     154         &                 ln_seaiceinc, ln_sitinc, ln_temnofreeze,        & 
    150155         &                 mld_choice_bgc, rn_maxchlinc 
    151156      !!---------------------------------------------------------------------- 
     
    155160      !----------------------------------------------------------------------- 
    156161      ln_seaiceinc = .FALSE. 
     162      ln_sitinc = .FALSE. 
    157163      ln_temnofreeze = .FALSE. 
    158164 
     
    173179         WRITE(numout,*) '   Namelist nam_asminc : set assimilation increment parameters' 
    174180         WRITE(numout,*) '      Logical switch for writing out background state          ln_bkgwri = ', ln_bkgwri 
     181         WRITE(numout,*) '      Logical switch for writing mean background state         ln_avgbkg = ', ln_avgbkg 
    175182         WRITE(numout,*) '      Logical switch for writing out balancing increments      ln_balwri = ', ln_balwri 
    176183         WRITE(numout,*) '      Logical switch for applying tracer increments            ln_trainc = ', ln_trainc 
    177184         WRITE(numout,*) '      Logical switch for applying velocity increments          ln_dyninc = ', ln_dyninc 
    178185         WRITE(numout,*) '      Logical switch for applying SSH increments               ln_sshinc = ', ln_sshinc 
     186         WRITE(numout,*) '      Logical switch for applying SIC increments               ln_seaiceinc = ', ln_seaiceinc 
     187         WRITE(numout,*) '      Logical switch for applying SIT increments               ln_sitinc = ', ln_sitinc 
    179188         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 
     189         WRITE(numout,*) '      Logical switch for Incremental Analysis Updating (IAU)   ln_asmiau = ', ln_asmiau 
     190         WRITE(numout,*) '      Timestep of background in [0,nitend-nit000-1]            nitbkg    = ', nitbkg 
     191         WRITE(numout,*) '      Timestep of background for DI in [0,nitend-nit000-1]     nitdin    = ', nitdin 
     192         WRITE(numout,*) '      Timestep of start of IAU interval in [0,nitend-nit000-1] nitiaustr = ', nitiaustr 
     193         WRITE(numout,*) '      Timestep of end of IAU interval in [0,nitend-nit000-1]   nitiaufin = ', nitiaufin 
     194         WRITE(numout,*) '      Type of IAU weighting function                           niaufn    = ', niaufn 
     195         WRITE(numout,*) '      Logical switch for ensuring that the sa > salfixmin      ln_salfix = ', ln_salfix 
     196         WRITE(numout,*) '      Minimum salinity after applying the increments           salfixmin = ', salfixmin 
    181197         WRITE(numout,*) '      Logical switch for phytoplankton balancing             ln_phytobal = ', ln_phytobal 
    182198         WRITE(numout,*) '      Logical switch for applying slchltot increments     ln_slchltotinc = ', ln_slchltotinc 
     
    197213         WRITE(numout,*) '      Logical switch for applying pph increments               ln_pphinc = ', ln_pphinc 
    198214         WRITE(numout,*) '      Logical switch for applying po2 increments               ln_po2inc = ', ln_po2inc 
    199          WRITE(numout,*) '      Logical switch for Incremental Analysis Updating (IAU)   ln_asmiau = ', ln_asmiau 
    200          WRITE(numout,*) '      Timestep of background in [0,nitend-nit000-1]            nitbkg    = ', nitbkg 
    201          WRITE(numout,*) '      Timestep of background for DI in [0,nitend-nit000-1]     nitdin    = ', nitdin 
    202          WRITE(numout,*) '      Timestep of start of IAU interval in [0,nitend-nit000-1] nitiaustr = ', nitiaustr 
    203          WRITE(numout,*) '      Timestep of end of IAU interval in [0,nitend-nit000-1]   nitiaufin = ', nitiaufin 
    204          WRITE(numout,*) '      Type of IAU weighting function                           niaufn    = ', niaufn 
    205          WRITE(numout,*) '      Logical switch for ensuring that the sa > salfixmin      ln_salfix = ', ln_salfix 
    206          WRITE(numout,*) '      Minimum salinity after applying the increments           salfixmin = ', salfixmin 
    207215         WRITE(numout,*) '      Choice of MLD for BGC assimilation                  mld_choice_bgc = ', mld_choice_bgc 
    208216         WRITE(numout,*) '      Maximum absolute chlorophyll increment (<=0 = off)    rn_maxchlinc = ', rn_maxchlinc 
     
    264272      IF (      ( ( .NOT. ln_asmdin ).AND.( .NOT. ln_asmiau ) ) & 
    265273         & .AND.( ( ln_trainc ).OR.( ln_dyninc ).OR.( ln_sshinc ).OR.( ln_seaiceinc ).OR. & 
    266          &        ( lk_bgcinc ) )) & 
     274         &        ( ln_sitinc ).OR.( lk_bgcinc ) )) & 
    267275         & CALL ctl_stop( ' One or more of ln_trainc, ln_dyninc, ln_sshinc, ln_seaiceinc,', & 
    268          &                ' ln_(bgc-variable)inc is set to .true.', & 
     276         &                ' ln_sitinc and ln_(bgc-variable)inc is set to .true.', & 
    269277         &                ' but ln_asmdin and ln_asmiau are both set to .false. :', & 
    270278         &                ' Inconsistent options') 
     
    275283 
    276284      IF ( ( .NOT. ln_trainc ).AND.( .NOT. ln_dyninc ).AND.( .NOT. ln_sshinc ).AND.( .NOT. ln_seaiceinc ) & 
    277          & .AND.( .NOT. lk_bgcinc ) )  & 
     285         & .AND.( .NOT. ln_sitinc ).AND.( .NOT. lk_bgcinc ) )  & 
    278286         & CALL ctl_warn( ' ln_trainc, ln_dyninc, ln_sshinc, ln_seaiceinc,', & 
    279          &                ' ln_(bgc-variable)inc are set to .false. :', & 
     287         &                ' ln_sitinc and ln_(bgc-variable)inc are set to .false. :', & 
    280288         &                ' The assimilation increments are not applied') 
    281289 
     
    377385      !-------------------------------------------------------------------- 
    378386 
    379       ALLOCATE( t_bkginc(jpi,jpj,jpk) ) 
    380       ALLOCATE( s_bkginc(jpi,jpj,jpk) ) 
    381       ALLOCATE( u_bkginc(jpi,jpj,jpk) ) 
    382       ALLOCATE( v_bkginc(jpi,jpj,jpk) ) 
    383       ALLOCATE( ssh_bkginc(jpi,jpj)   ) 
    384       ALLOCATE( seaice_bkginc(jpi,jpj)) 
     387      IF ( ln_trainc ) THEN 
     388         ALLOCATE( t_bkginc(jpi,jpj,jpk) ) 
     389         ALLOCATE( s_bkginc(jpi,jpj,jpk) ) 
     390         t_bkginc(:,:,:) = 0.0 
     391         s_bkginc(:,:,:) = 0.0 
     392      ENDIF 
     393      IF ( ln_dyninc ) THEN  
     394         ALLOCATE( u_bkginc(jpi,jpj,jpk) ) 
     395         ALLOCATE( v_bkginc(jpi,jpj,jpk) ) 
     396         u_bkginc(:,:,:) = 0.0 
     397         v_bkginc(:,:,:) = 0.0 
     398      ENDIF 
     399      IF ( ln_sshinc ) THEN 
     400         ALLOCATE( ssh_bkginc(jpi,jpj)   ) 
     401         ssh_bkginc(:,:) = 0.0 
     402      ENDIF 
     403      IF ( ln_seaiceinc ) THEN  
     404         ALLOCATE( seaice_bkginc(jpi,jpj)) 
     405         seaice_bkginc(:,:) = 0.0 
     406      ENDIF 
     407      IF ( ln_sitinc ) THEN  
     408         ALLOCATE( sit_bkginc(jpi,jpj)) 
     409         sit_bkginc(:,:) = 0.0 
     410      ENDIF 
    385411#if defined key_asminc 
    386412      ALLOCATE( ssh_iau(jpi,jpj)      ) 
    387 #endif 
    388       t_bkginc(:,:,:) = 0.0 
    389       s_bkginc(:,:,:) = 0.0 
    390       u_bkginc(:,:,:) = 0.0 
    391       v_bkginc(:,:,:) = 0.0 
    392       ssh_bkginc(:,:) = 0.0 
    393       seaice_bkginc(:,:) = 0.0 
    394 #if defined key_asminc 
    395413      ssh_iau(:,:)    = 0.0 
    396414#endif 
    397415      IF ( ( ln_trainc ).OR.( ln_dyninc ).OR.( ln_sshinc ).OR.( ln_seaiceinc ) & 
    398          &  .OR.( lk_bgcinc ) ) THEN 
     416         &  .OR.( ln_sitinc ).OR.( lk_bgcinc ) ) THEN 
    399417 
    400418         !-------------------------------------------------------------------- 
     
    459477            ! to allow for differences in masks 
    460478            WHERE( ABS( ssh_bkginc(:,:) ) > 1.0e+10 ) ssh_bkginc(:,:) = 0.0 
     479         ENDIF 
     480 
     481         IF ( ln_sitinc ) THEN 
     482            CALL iom_get( inum, jpdom_autoglo, 'bckinsit', sit_bkginc, 1 ) 
     483            ! Apply the masks 
     484            sit_bkginc(:,:) = sit_bkginc(:,:) * tmask(:,:,1) 
     485            ! Set missing increments to 0.0 rather than 1e+20 
     486            ! to allow for differences in masks 
     487            WHERE( ABS( sit_bkginc(:,:) ) > 1.0e+10 ) sit_bkginc(:,:) = 0.0 
    461488         ENDIF 
    462489 
     
    827854      ! Perhaps the following call should be in step 
    828855      IF   ( ln_seaiceinc  )   CALL seaice_asm_inc ( kt )   ! apply sea ice concentration increment 
     856      IF   ( ln_sitinc  )      CALL sit_asm_inc ( kt )      ! apply sea ice thickness increment 
    829857      ! 
    830858   END SUBROUTINE tra_asm_inc 
     
    9881016   END SUBROUTINE ssh_asm_inc 
    9891017 
     1018   SUBROUTINE sit_asm_inc( kt, kindic ) 
     1019      !!---------------------------------------------------------------------- 
     1020      !!                    ***  ROUTINE sit_asm_inc  *** 
     1021      !!           
     1022      !! ** Purpose : Apply the sea ice thickness assimilation increment. 
     1023      !! 
     1024      !! ** Method  : Direct initialization or Incremental Analysis Updating. 
     1025      !! 
     1026      !! ** Action  :  
     1027      !! 
     1028      !!---------------------------------------------------------------------- 
     1029      IMPLICIT NONE 
     1030      ! 
     1031      INTEGER, INTENT(in)           ::   kt   ! Current time step 
     1032      INTEGER, INTENT(in), OPTIONAL ::   kindic   ! flag for disabling the deallocation 
     1033      ! 
     1034      INTEGER  ::   it 
     1035      REAL(wp) ::   zincwgt   ! IAU weight for current time step 
     1036      !!---------------------------------------------------------------------- 
     1037 
     1038      IF ( ln_asmiau ) THEN 
     1039 
     1040         !-------------------------------------------------------------------- 
     1041         ! Incremental Analysis Updating 
     1042         !-------------------------------------------------------------------- 
     1043 
     1044         IF ( ( kt >= nitiaustr_r ).AND.( kt <= nitiaufin_r ) ) THEN 
     1045 
     1046            it = kt - nit000 + 1 
     1047            zincwgt = wgtiau(it)      ! IAU weight for the current time step  
     1048            ! note this is not a tendency so should not be divided by rdt (as with the tracer and other increments) 
     1049            ! EF: Actually CICE is expecting a tendency so is divided by rdt below 
     1050 
     1051            IF(lwp) THEN 
     1052               WRITE(numout,*)  
     1053               WRITE(numout,*) 'sit_asm_inc : sea ice thick IAU at time step = ', & 
     1054                  &  kt,' with IAU weight = ', wgtiau(it) 
     1055               WRITE(numout,*) '~~~~~~~~~~~~' 
     1056            ENDIF 
     1057 
     1058#if defined key_cice && defined key_asminc 
     1059            ! Sea-ice thickness : CICE case. Pass ice thickness increment tendency into CICE 
     1060            ndsit_da(:,:) = sit_bkginc(:,:) * zincwgt / rdt 
     1061#endif 
     1062 
     1063            IF ( kt == nitiaufin_r ) THEN 
     1064               DEALLOCATE( sit_bkginc ) 
     1065            ENDIF 
     1066 
     1067         ELSE 
     1068 
     1069#if defined key_cice && defined key_asminc 
     1070            ! Sea-ice thickness : CICE case. Zero ice increment tendency into CICE 
     1071            ndsit_da(:,:) = 0.0_wp 
     1072#endif 
     1073 
     1074         ENDIF 
     1075 
     1076      ELSEIF ( ln_asmdin ) THEN 
     1077 
     1078         !-------------------------------------------------------------------- 
     1079         ! Direct Initialization 
     1080         !-------------------------------------------------------------------- 
     1081 
     1082         IF ( kt == nitdin_r ) THEN 
     1083 
     1084            neuler = 0                    ! Force Euler forward step 
     1085 
     1086#if defined key_cice && defined key_asminc 
     1087            ! Sea-ice thickness : CICE case. Pass ice thickness increment tendency into CICE 
     1088           ndsit_da(:,:) = sit_bkginc(:,:) / rdt 
     1089#endif 
     1090           IF ( .NOT. PRESENT(kindic) ) THEN 
     1091              DEALLOCATE( sit_bkginc ) 
     1092           END IF 
     1093 
     1094         ELSE 
     1095 
     1096#if defined key_cice && defined key_asminc 
     1097            ! Sea-ice thicnkness : CICE case. Zero ice thickness increment tendency into CICE  
     1098            ndsit_da(:,:) = 0.0_wp 
     1099#endif 
     1100          
     1101         ENDIF 
     1102 
     1103      ENDIF 
     1104 
     1105   END SUBROUTINE sit_asm_inc 
    9901106 
    9911107   SUBROUTINE seaice_asm_inc( kt, kindic ) 
     
    9931109      !!                    ***  ROUTINE seaice_asm_inc  *** 
    9941110      !!           
    995       !! ** Purpose : Apply the sea ice assimilation increment. 
     1111      !! ** Purpose : Apply the sea ice concentration assimilation increment. 
    9961112      !! 
    9971113      !! ** Method  : Direct initialization or Incremental Analysis Updating. 
Note: See TracChangeset for help on using the changeset viewer.