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 11990 for branches/UKMO/dev_r5518_GO6_package_asm_3d_bgc_3dnitbal/NEMOGCM/NEMO/OPA_SRC/ASM/asmbgc.F90 – NEMO

Ignore:
Timestamp:
2019-11-27T16:43:05+01:00 (4 years ago)
Author:
dford
Message:

Get the nitrogen balancing working with 3D chlorophyll increments.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/UKMO/dev_r5518_GO6_package_asm_3d_bgc_3dnitbal/NEMOGCM/NEMO/OPA_SRC/ASM/asmbgc.F90

    r9862 r11990  
    5959   USE asmphyto2dbal_medusa, ONLY: & ! phyto2d balancing for MEDUSA 
    6060      & asm_phyto2d_bal_medusa 
     61   USE asmphyto3dbal_medusa, ONLY: & ! phyto3d balancing for MEDUSA 
     62      & asm_phyto3d_bal_medusa 
    6163   USE asmpco2bal, ONLY:    & ! pCO2 balancing for MEDUSA 
    6264      & asm_pco2_bal 
     
    7173      & ploss_avg,          & 
    7274      & phyt_avg,           & 
     75      & pgrow_avg_3d,       & 
     76      & ploss_avg_3d,       & 
     77      & phyt_avg_3d,        & 
    7378      & mld_max 
    7479#elif defined key_hadocc 
     
    172177   REAL(wp), DIMENSION(:,:),     ALLOCATABLE :: ploss_avg_bkg   ! Background phyto loss 
    173178   REAL(wp), DIMENSION(:,:),     ALLOCATABLE :: phyt_avg_bkg    ! Background phyto conc 
     179   REAL(wp), DIMENSION(:,:,:),   ALLOCATABLE :: pgrow_avg_3d_bkg   ! Background phyto growth 
     180   REAL(wp), DIMENSION(:,:,:),   ALLOCATABLE :: ploss_avg_3d_bkg   ! Background phyto loss 
     181   REAL(wp), DIMENSION(:,:,:),   ALLOCATABLE :: phyt_avg_3d_bkg    ! Background phyto conc 
    174182   REAL(wp), DIMENSION(:,:),     ALLOCATABLE :: mld_max_bkg     ! Background max MLD 
    175183   REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE :: tracer_bkg      ! Background tracer state 
     
    213221         & ( .NOT. ln_slchlnoninc ).AND.( .NOT. ln_schltotinc  ).AND. & 
    214222         & ( .NOT. ln_slphytotinc ).AND.( .NOT. ln_slphydiainc ).AND. & 
    215          & ( .NOT. ln_slphynoninc ) ) THEN 
     223         & ( .NOT. ln_slphynoninc ).AND.( .NOT. ln_plchltotinc ).AND. & 
     224         & ( .NOT. ln_pchltotinc  ) ) THEN 
    216225         CALL ctl_warn( ' Cannot calculate phytoplankton balancing increments', & 
    217             &           ' if not assimilating ocean colour,',                   & 
     226            &           ' if not assimilating phytoplankton,',                   & 
    218227            &           ' so ln_phytobal will be set to .false.') 
    219228         ln_phytobal = .FALSE. 
     
    525534         ALLOCATE( ploss_avg_bkg(jpi,jpj)        ) 
    526535         ALLOCATE( phyt_avg_bkg(jpi,jpj)         ) 
     536         ALLOCATE( pgrow_avg_3d_bkg(jpi,jpj,jpk) ) 
     537         ALLOCATE( ploss_avg_3d_bkg(jpi,jpj,jpk) ) 
     538         ALLOCATE( phyt_avg_3d_bkg(jpi,jpj,jpk)  ) 
    527539         ALLOCATE( mld_max_bkg(jpi,jpj)          ) 
    528540         ALLOCATE( tracer_bkg(jpi,jpj,jpk,jptra) ) 
     
    530542         ploss_avg_bkg(:,:)  = 0.0 
    531543         phyt_avg_bkg(:,:)   = 0.0 
     544         pgrow_avg_3d_bkg(:,:,:)  = 0.0 
     545         ploss_avg_3d_bkg(:,:,:)  = 0.0 
     546         phyt_avg_3d_bkg(:,:,:)   = 0.0 
    532547         mld_max_bkg(:,:)    = 0.0 
    533548         tracer_bkg(:,:,:,:) = 0.0 
     
    565580            CALL iom_get( inum, jpdom_autoglo, 'ploss_avg', ploss_avg_bkg ) 
    566581            CALL iom_get( inum, jpdom_autoglo, 'phyt_avg',  phyt_avg_bkg  ) 
     582            CALL iom_get( inum, jpdom_autoglo, 'pgrow_avg_3d', pgrow_avg_3d_bkg ) 
     583            CALL iom_get( inum, jpdom_autoglo, 'ploss_avg_3d', ploss_avg_3d_bkg ) 
     584            CALL iom_get( inum, jpdom_autoglo, 'phyt_avg_3d',  phyt_avg_3d_bkg  ) 
    567585            CALL iom_get( inum, jpdom_autoglo, 'mld_max',   mld_max_bkg   ) 
    568586            pgrow_avg_bkg(:,:) = pgrow_avg_bkg(:,:) * tmask(:,:,1) 
    569587            ploss_avg_bkg(:,:) = ploss_avg_bkg(:,:) * tmask(:,:,1) 
    570588            phyt_avg_bkg(:,:)  = phyt_avg_bkg(:,:)  * tmask(:,:,1) 
     589            pgrow_avg_3d_bkg(:,:,:) = pgrow_avg_3d_bkg(:,:,:) * tmask(:,:,:) 
     590            ploss_avg_3d_bkg(:,:,:) = ploss_avg_3d_bkg(:,:,:) * tmask(:,:,:) 
     591            phyt_avg_3d_bkg(:,:,:)  = phyt_avg_3d_bkg(:,:,:)  * tmask(:,:,:) 
    571592            mld_max_bkg(:,:)   = mld_max_bkg(:,:)   * tmask(:,:,1) 
    572593 
     
    727748            CALL iom_rstput( kt, kt, inum, 'phy3d_phd', phyto3d_balinc(:,:,:,jpphd) ) 
    728749            CALL iom_rstput( kt, kt, inum, 'phy3d_pds', phyto3d_balinc(:,:,:,jppds) ) 
     750            IF ( ln_phytobal ) THEN 
     751               CALL iom_rstput( kt, kt, inum, 'phy3d_zmi', phyto3d_balinc(:,:,:,jpzmi) ) 
     752               CALL iom_rstput( kt, kt, inum, 'phy3d_zme', phyto3d_balinc(:,:,:,jpzme) ) 
     753               CALL iom_rstput( kt, kt, inum, 'phy3d_din', phyto3d_balinc(:,:,:,jpdin) ) 
     754               CALL iom_rstput( kt, kt, inum, 'phy3d_sil', phyto3d_balinc(:,:,:,jpsil) ) 
     755               CALL iom_rstput( kt, kt, inum, 'phy3d_fer', phyto3d_balinc(:,:,:,jpfer) ) 
     756               CALL iom_rstput( kt, kt, inum, 'phy3d_det', phyto3d_balinc(:,:,:,jpdet) ) 
     757               CALL iom_rstput( kt, kt, inum, 'phy3d_dtc', phyto3d_balinc(:,:,:,jpdtc) ) 
     758               CALL iom_rstput( kt, kt, inum, 'phy3d_dic', phyto3d_balinc(:,:,:,jpdic) ) 
     759               CALL iom_rstput( kt, kt, inum, 'phy3d_alk', phyto3d_balinc(:,:,:,jpalk) ) 
     760               CALL iom_rstput( kt, kt, inum, 'phy3d_oxy', phyto3d_balinc(:,:,:,jpoxy) ) 
     761            ENDIF 
    729762#elif defined key_hadocc 
    730763            CALL iom_rstput( kt, kt, inum, 'phy3d_phy', phyto3d_balinc(:,:,:,jp_had_phy) ) 
     
    810843      CALL iom_rstput( kt, nitbkg_r, knum, 'ploss_avg'   , ploss_avg        ) 
    811844      CALL iom_rstput( kt, nitbkg_r, knum, 'phyt_avg'    , phyt_avg         ) 
     845      CALL iom_rstput( kt, nitbkg_r, knum, 'pgrow_avg_3d'   , pgrow_avg_3d        ) 
     846      CALL iom_rstput( kt, nitbkg_r, knum, 'ploss_avg_3d'   , ploss_avg_3d        ) 
     847      CALL iom_rstput( kt, nitbkg_r, knum, 'phyt_avg_3d'    , phyt_avg_3d         ) 
    812848      CALL iom_rstput( kt, nitbkg_r, knum, 'mld_max'     , mld_max          ) 
    813849      CALL iom_rstput( kt, nitbkg_r, knum, 'medusa_chn'  , trn(:,:,:,jpchn) ) 
     
    11631199      INTEGER                          :: ji, jj, jk   ! Loop counters 
    11641200      INTEGER                          :: it           ! Index 
     1201      REAL(wp)                         :: zincper      ! IAU interval in seconds 
    11651202      REAL(wp)                         :: zincwgt      ! IAU weight for timestep 
    11661203      REAL(wp)                         :: zfrac_chn    ! Fraction of jpchn 
     
    12151252            END DO 
    12161253         ENDIF 
    1217  
     1254          
    12181255#if defined key_medusa && defined key_foam_medusa 
    1219          ! Loop over each grid point partioning the increments based on existing ratios 
    1220          DO jk = 1, jpk 
    1221             DO jj = 1, jpj 
    1222                DO ji = 1, jpi 
    1223                   IF ( ( tracer_bkg(ji,jj,jk,jpchn) > 0.0 ) .AND. ( tracer_bkg(ji,jj,jk,jpchd) > 0.0 ) ) THEN 
    1224                      zfrac_chn = tracer_bkg(ji,jj,jk,jpchn) / (tracer_bkg(ji,jj,jk,jpchn) + tracer_bkg(ji,jj,jk,jpchd)) 
    1225                      zfrac_chd = 1.0 - zfrac_chn 
    1226                      phyto3d_balinc(ji,jj,jk,jpchn) = chl_inc(ji,jj,jk) * zfrac_chn 
    1227                      phyto3d_balinc(ji,jj,jk,jpchd) = chl_inc(ji,jj,jk) * zfrac_chd 
    1228                      zrat_phn_chn = tracer_bkg(ji,jj,jk,jpphn) / tracer_bkg(ji,jj,jk,jpchn) 
    1229                      zrat_phd_chd = tracer_bkg(ji,jj,jk,jpphd) / tracer_bkg(ji,jj,jk,jpchd) 
    1230                      zrat_pds_chd = tracer_bkg(ji,jj,jk,jppds) / tracer_bkg(ji,jj,jk,jpchd) 
    1231                      phyto3d_balinc(ji,jj,jk,jpphn) = phyto3d_balinc(ji,jj,jk,jpchn) * zrat_phn_chn 
    1232                      phyto3d_balinc(ji,jj,jk,jpphd) = phyto3d_balinc(ji,jj,jk,jpchd) * zrat_phd_chd 
    1233                      phyto3d_balinc(ji,jj,jk,jppds) = phyto3d_balinc(ji,jj,jk,jpchd) * zrat_pds_chd 
    1234                   ENDIF 
     1256         IF ( ln_phytobal ) THEN 
     1257            zincper = (nitiaufin_r - nitiaustr_r + 1) * rdt 
     1258            CALL asm_phyto3d_bal_medusa( chl_inc,                             & 
     1259               &                         zincper,                             & 
     1260               &                         rn_maxchlinc,                        & 
     1261               &                         pgrow_avg_3d_bkg, ploss_avg_3d_bkg,  & 
     1262               &                         phyt_avg_3d_bkg,                     & 
     1263               &                         tracer_bkg, phyto3d_balinc ) 
     1264         ELSE 
     1265            ! Loop over each grid point partioning the increments based on existing ratios 
     1266            DO jk = 1, jpk 
     1267               DO jj = 1, jpj 
     1268                  DO ji = 1, jpi 
     1269                     IF ( ( tracer_bkg(ji,jj,jk,jpchn) > 0.0 ) .AND. ( tracer_bkg(ji,jj,jk,jpchd) > 0.0 ) ) THEN 
     1270                        zfrac_chn = tracer_bkg(ji,jj,jk,jpchn) / (tracer_bkg(ji,jj,jk,jpchn) + tracer_bkg(ji,jj,jk,jpchd)) 
     1271                        zfrac_chd = 1.0 - zfrac_chn 
     1272                        phyto3d_balinc(ji,jj,jk,jpchn) = chl_inc(ji,jj,jk) * zfrac_chn 
     1273                        phyto3d_balinc(ji,jj,jk,jpchd) = chl_inc(ji,jj,jk) * zfrac_chd 
     1274                        zrat_phn_chn = tracer_bkg(ji,jj,jk,jpphn) / tracer_bkg(ji,jj,jk,jpchn) 
     1275                        zrat_phd_chd = tracer_bkg(ji,jj,jk,jpphd) / tracer_bkg(ji,jj,jk,jpchd) 
     1276                        zrat_pds_chd = tracer_bkg(ji,jj,jk,jppds) / tracer_bkg(ji,jj,jk,jpchd) 
     1277                        phyto3d_balinc(ji,jj,jk,jpphn) = phyto3d_balinc(ji,jj,jk,jpchn) * zrat_phn_chn 
     1278                        phyto3d_balinc(ji,jj,jk,jpphd) = phyto3d_balinc(ji,jj,jk,jpchd) * zrat_phd_chd 
     1279                        phyto3d_balinc(ji,jj,jk,jppds) = phyto3d_balinc(ji,jj,jk,jpchd) * zrat_pds_chd 
     1280                     ENDIF 
     1281                  END DO 
    12351282               END DO 
    12361283            END DO 
    1237          END DO 
     1284         ENDIF 
    12381285#elif defined key_hadocc 
    12391286         phyto3d_balinc(:,:,:,jp_had_phy) = ( cchl_p_bkg(:,:,:) / (mw_carbon * c2n_p) ) * chl_inc(:,:,:) 
     
    14201467         ! Account for phytoplankton balancing if required 
    14211468         IF ( ln_phytobal ) THEN 
    1422             dic_bkg_temp(:,:) = tracer_bkg(:,:,1,jpdic) + phyto2d_balinc(:,:,1,jpdic) 
    1423             alk_bkg_temp(:,:) = tracer_bkg(:,:,1,jpalk) + phyto2d_balinc(:,:,1,jpalk) 
     1469            IF ( ln_slchltotinc ) THEN 
     1470               dic_bkg_temp(:,:) = tracer_bkg(:,:,1,jpdic) + phyto2d_balinc(:,:,1,jpdic) 
     1471               alk_bkg_temp(:,:) = tracer_bkg(:,:,1,jpalk) + phyto2d_balinc(:,:,1,jpalk) 
     1472            ENDIF 
     1473            IF ( ln_plchltotinc ) THEN 
     1474               dic_bkg_temp(:,:) = tracer_bkg(:,:,1,jpdic) + phyto3d_balinc(:,:,1,jpdic) 
     1475               alk_bkg_temp(:,:) = tracer_bkg(:,:,1,jpalk) + phyto3d_balinc(:,:,1,jpalk) 
     1476            ENDIF 
    14241477         ELSE 
    14251478            dic_bkg_temp(:,:) = tracer_bkg(:,:,1,jpdic) 
     
    16661719         ! Account for phytoplankton balancing if required 
    16671720         IF ( ln_phytobal ) THEN 
    1668             dic_bkg_temp(:,:,:) = tracer_bkg(:,:,:,jpdic) + phyto2d_balinc(:,:,:,jpdic) 
    1669             alk_bkg_temp(:,:,:) = tracer_bkg(:,:,:,jpalk) + phyto2d_balinc(:,:,:,jpalk) 
    1670             din_bkg_temp(:,:,:) = tracer_bkg(:,:,:,jpdin) + phyto2d_balinc(:,:,:,jpdin) 
    1671             sil_bkg_temp(:,:,:) = tracer_bkg(:,:,:,jpsil) + phyto2d_balinc(:,:,:,jpsil) 
     1721            IF ( ln_slchltotinc ) THEN 
     1722               dic_bkg_temp(:,:,:) = tracer_bkg(:,:,:,jpdic) + phyto2d_balinc(:,:,:,jpdic) 
     1723               alk_bkg_temp(:,:,:) = tracer_bkg(:,:,:,jpalk) + phyto2d_balinc(:,:,:,jpalk) 
     1724               din_bkg_temp(:,:,:) = tracer_bkg(:,:,:,jpdin) + phyto2d_balinc(:,:,:,jpdin) 
     1725               sil_bkg_temp(:,:,:) = tracer_bkg(:,:,:,jpsil) + phyto2d_balinc(:,:,:,jpsil) 
     1726            ENDIF 
     1727            IF ( ln_plchltotinc ) THEN 
     1728               dic_bkg_temp(:,:,:) = tracer_bkg(:,:,:,jpdic) + phyto3d_balinc(:,:,:,jpdic) 
     1729               alk_bkg_temp(:,:,:) = tracer_bkg(:,:,:,jpalk) + phyto3d_balinc(:,:,:,jpalk) 
     1730               din_bkg_temp(:,:,:) = tracer_bkg(:,:,:,jpdin) + phyto3d_balinc(:,:,:,jpdin) 
     1731               sil_bkg_temp(:,:,:) = tracer_bkg(:,:,:,jpsil) + phyto3d_balinc(:,:,:,jpsil) 
     1732            ENDIF 
    16721733         ELSE 
    16731734            dic_bkg_temp(:,:,:) = tracer_bkg(:,:,:,jpdic) 
     
    18611922            CALL ctl_stop ( ' bgc3d_asm_inc: no compatible BGC model defined' ) 
    18621923#endif 
    1863             IF ( ln_phytobal ) THEN 
     1924            IF ( ln_slchltotinc .OR. ln_schltotinc ) THEN 
    18641925               pno3_bkginc(:,:,:) = pno3_bkginc(:,:,:) - phyto2d_balinc(:,:,:,it) 
    18651926            ENDIF 
     
    18811942            CALL ctl_stop ( ' bgc3d_asm_inc: no compatible BGC model defined' ) 
    18821943#endif 
    1883             IF ( ln_phytobal ) THEN 
     1944            IF ( ln_slchltotinc .OR. ln_schltotinc ) THEN 
    18841945               psi4_bkginc(:,:,:) = psi4_bkginc(:,:,:) - phyto2d_balinc(:,:,:,it) 
    18851946            ENDIF 
     
    19031964            CALL ctl_stop ( ' bgc3d_asm_inc: no compatible BGC model defined' ) 
    19041965#endif 
    1905             IF ( ln_phytobal ) THEN 
     1966            IF ( ln_slchltotinc .OR. ln_schltotinc ) THEN 
    19061967               pdic_bkginc(:,:,:) = pdic_bkginc(:,:,:) - phyto2d_balinc(:,:,:,it) 
    19071968            ENDIF 
     
    19251986            CALL ctl_stop ( ' bgc3d_asm_inc: no compatible BGC model defined' ) 
    19261987#endif 
    1927             IF ( ln_phytobal ) THEN 
     1988            IF ( ln_slchltotinc .OR. ln_schltotinc ) THEN 
    19281989               palk_bkginc(:,:,:) = palk_bkginc(:,:,:) - phyto2d_balinc(:,:,:,it) 
    19291990            ENDIF 
     
    19452006            CALL ctl_stop ( ' bgc3d_asm_inc: no compatible BGC model defined' ) 
    19462007#endif 
    1947             IF ( ln_phytobal ) THEN 
     2008            IF ( ln_slchltotinc .OR. ln_schltotinc ) THEN 
    19482009               po2_bkginc(:,:,:) = po2_bkginc(:,:,:) - phyto2d_balinc(:,:,:,it) 
    19492010            ENDIF 
Note: See TracChangeset for help on using the changeset viewer.