Index: branches/UKMO/dev_r5518_v3.6_asm_nemovar_community/NEMOGCM/NEMO/OPA_SRC/ASM/asminc.F90
===================================================================
--- branches/UKMO/dev_r5518_v3.6_asm_nemovar_community/NEMOGCM/NEMO/OPA_SRC/ASM/asminc.F90	(revision 7802)
+++ branches/UKMO/dev_r5518_v3.6_asm_nemovar_community/NEMOGCM/NEMO/OPA_SRC/ASM/asminc.F90	(revision 7803)
@@ -131,4 +131,7 @@
    REAL(wp), PUBLIC, DIMENSION(:,:,:,:), ALLOCATABLE :: logchl_balinc  !: Increment to BGC variables from logchl assim
 #endif
+   REAL(wp) :: rn_maxchlinc = -999.0  !: maximum absolute non-log chlorophyll increment from logchl assimilation
+                                      !: <= 0 implies no maximum applied (switch turned off)
+                                      !:  > 0 implies maximum absolute chl increment capped at this value
 
    INTEGER :: mld_choice        = 4   !: choice of mld criteria to use for physics assimilation
@@ -207,5 +210,5 @@
          &                 nitbkg, nitdin, nitiaustr, nitiaufin, niaufn,   &
          &                 ln_salfix, salfixmin, nn_divdmp, nitavgbkg, mld_choice, &
-         &                 mld_choice_bgc
+         &                 mld_choice_bgc, rn_maxchlinc
       !!----------------------------------------------------------------------
 
@@ -288,4 +291,5 @@
          WRITE(numout,*) '      Choice of MLD for physics assimilation                  mld_choice = ', mld_choice
          WRITE(numout,*) '      Choice of MLD for BGC assimilation                  mld_choice_bgc = ', mld_choice_bgc
+         WRITE(numout,*) '      Maximum absolute chlorophyll increment (<=0 = off)    rn_maxchlinc = ', rn_maxchlinc
       ENDIF
 
@@ -1408,5 +1412,5 @@
 #if defined key_fabm
          CALL asm_logchl_bal_ersem( ln_logchlpftinc, nn_asmpfts, mld_choice_bgc, &
-            &                       logchl_bkginc, logchl_balinc )
+            &                       rn_maxchlinc, logchl_bkginc, logchl_balinc )
 #elif defined key_medusa && defined key_foam_medusa
          !CALL asm_logchl_bal_medusa()
Index: branches/UKMO/dev_r5518_v3.6_asm_nemovar_community/NEMOGCM/NEMO/OPA_SRC/ASM/asmlogchlbal_ersem.F90
===================================================================
--- branches/UKMO/dev_r5518_v3.6_asm_nemovar_community/NEMOGCM/NEMO/OPA_SRC/ASM/asmlogchlbal_ersem.F90	(revision 7802)
+++ branches/UKMO/dev_r5518_v3.6_asm_nemovar_community/NEMOGCM/NEMO/OPA_SRC/ASM/asmlogchlbal_ersem.F90	(revision 7803)
@@ -29,6 +29,6 @@
 CONTAINS
 
-   SUBROUTINE asm_logchl_bal_ersem( ln_logchlpftinc, npfts, mld_choice_bgc, &
-      &                             logchl_bkginc, logchl_balinc )
+   SUBROUTINE asm_logchl_bal_ersem( ld_logchlpftinc, npfts, mld_choice_bgc, &
+      &                             k_maxchlinc, logchl_bkginc, logchl_balinc )
       !!---------------------------------------------------------------------------
       !!                    ***  ROUTINE asm_logchl_bal_ersem  ***
@@ -46,7 +46,8 @@
       !!---------------------------------------------------------------------------
       !!
-      LOGICAL,  INTENT(in   )                               :: ln_logchlpftinc
+      LOGICAL,  INTENT(in   )                               :: ld_logchlpftinc
       INTEGER,  INTENT(in   )                               :: npfts
       INTEGER,  INTENT(in   )                               :: mld_choice_bgc
+      REAL(wp), INTENT(in   )                               :: k_maxchlinc
       REAL(wp), INTENT(in   ), DIMENSION(jpi,jpj,npfts)     :: logchl_bkginc
       REAL(wp), INTENT(  out), DIMENSION(jpi,jpj,jpk,jptra) :: logchl_balinc
@@ -65,4 +66,5 @@
       ! 2) Take 10^log10(analysis) to get analysis
       ! 3) Subtract background from analysis to get chl incs
+      ! If k_maxchlinc > 0 then cap total absolute chlorophyll increment at that value
       !
       ! Only apply increments if all of Chl1-4 background values are > 0
@@ -70,5 +72,5 @@
       ! that something's going wrong which the assimilation might make worse
       !
-      IF ( ln_logchlpftinc ) THEN
+      IF ( ld_logchlpftinc ) THEN
          !
          ! Assimilating separate PFTs, so separately transform each from LogChl to Chl
@@ -103,4 +105,17 @@
                         &                                             trn(ji,jj,1,jp_fabm_m1+jp_fabm_chl4)
                   ENDIF
+                  IF (k_maxchlinc > 0.0) THEN
+                     chl_inc = logchl_balinc(ji,jj,1,jp_fabm_m1+jp_fabm_chl1) + &
+                               logchl_balinc(ji,jj,1,jp_fabm_m1+jp_fabm_chl2) + &
+                               logchl_balinc(ji,jj,1,jp_fabm_m1+jp_fabm_chl3) + &
+                               logchl_balinc(ji,jj,1,jp_fabm_m1+jp_fabm_chl4)
+                     IF ( ABS(chl_inc) > k_maxchlinc ) THEN
+                        chl_tot = ABS(chl_inc) / k_maxchlinc
+                        logchl_balinc(ji,jj,1,jp_fabm_m1+jp_fabm_chl1) = logchl_balinc(ji,jj,1,jp_fabm_m1+jp_fabm_chl1) / chl_tot
+                        logchl_balinc(ji,jj,1,jp_fabm_m1+jp_fabm_chl2) = logchl_balinc(ji,jj,1,jp_fabm_m1+jp_fabm_chl2) / chl_tot
+                        logchl_balinc(ji,jj,1,jp_fabm_m1+jp_fabm_chl3) = logchl_balinc(ji,jj,1,jp_fabm_m1+jp_fabm_chl3) / chl_tot
+                        logchl_balinc(ji,jj,1,jp_fabm_m1+jp_fabm_chl4) = logchl_balinc(ji,jj,1,jp_fabm_m1+jp_fabm_chl4) / chl_tot
+                     ENDIF
+                  ENDIF
                ENDIF
             END DO
@@ -124,4 +139,7 @@
                      &      trn(ji,jj,1,jp_fabm_m1+jp_fabm_chl3) + trn(ji,jj,1,jp_fabm_m1+jp_fabm_chl4)
                   chl_inc = 10**( LOG10( chl_tot ) + logchl_bkginc(ji,jj,1) ) - chl_tot
+                  IF (k_maxchlinc > 0.0) THEN
+                     chl_inc = MAX( -1.0 * k_maxchlinc, MIN( chl_inc, k_maxchlinc ) )
+                  ENDIF
                   logchl_balinc(ji,jj,1,jp_fabm_m1+jp_fabm_chl1) = chl_inc * trn(ji,jj,1,jp_fabm_m1+jp_fabm_chl1) / chl_tot
                   logchl_balinc(ji,jj,1,jp_fabm_m1+jp_fabm_chl2) = chl_inc * trn(ji,jj,1,jp_fabm_m1+jp_fabm_chl2) / chl_tot
@@ -192,9 +210,10 @@
    !!----------------------------------------------------------------------
 CONTAINS
-   SUBROUTINE asm_logchl_bal_ersem( ln_logchlpftinc, npfts, mld_choice_bgc, &
-      &                             logchl_bkginc, logchl_balinc )
-      LOGICAL :: ln_logchlpftinc
+   SUBROUTINE asm_logchl_bal_ersem( ld_logchlpftinc, npfts, mld_choice_bgc, &
+      &                             k_maxchlinc, logchl_bkginc, logchl_balinc )
+      LOGICAL :: ld_logchlpftinc
       INTEGER :: npfts
       INTEGER :: mld_choice_bgc
+      REAL    :: k_maxchlinc
       REAL    :: logchl_bkginc(:,:,:)
       REAL    :: logchl_balinc(:,:,:,:)
