MODULE trcini_lobster !!====================================================================== !! *** MODULE trcini_lobster *** !! TOP : initialisation of the LOBSTER biological model !!====================================================================== !! History : - ! 1999-09 (M. Levy) Original code !! - ! 2000-12 (0. Aumont, E. Kestenare) add sediment !! 1.0 ! 2004-03 (C. Ethe) Modularity !! - ! 2005-03 (O. Aumont, A. El Moussaoui) F90 !! History : 2.0 ! 2007-12 (C. Ethe, G. Madec) from trcini.lobster1.h90 !!---------------------------------------------------------------------- #if defined key_lobster !!---------------------------------------------------------------------- !! 'key_lobster' LOBSTER bio-model !!---------------------------------------------------------------------- !! trc_ini_lobster : LOBSTER model initialisation !!---------------------------------------------------------------------- USE par_trc ! TOP parameters USE sms_lobster ! Source Minus Sink variables USE oce_trc ! ocean variables USE trc USE lbclnk USE lib_mpp USE lib_fortran IMPLICIT NONE PRIVATE PUBLIC trc_ini_lobster ! called by trcini.F90 module # include "top_substitute.h90" !!---------------------------------------------------------------------- !! NEMO/TOP 3.3 , NEMO Consortium (2010) !! $Id$ !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) !!---------------------------------------------------------------------- CONTAINS SUBROUTINE trc_ini_lobster !!---------------------------------------------------------------------- !! *** ROUTINE trc_ini_lobster *** !! ** purpose : specific initialisation for LOBSTER bio-model !!---------------------------------------------------------------------- USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released USE wrk_nemo, ONLY: zrro => wrk_2d_1, zdm0 => wrk_3d_1 !! INTEGER :: ji, jj, jk, jn REAL(wp) :: ztest, zfluo, zfluu !!---------------------------------------------------------------------- IF( wrk_in_use(2, 1) .OR. wrk_in_use(3, 1) )THEN CALL ctl_stop('trc_ini_lobster : requested workspace arrays unavailable.') RETURN END IF ! Control consitency CALL trc_ctl_lobster IF(lwp) WRITE(numout,*) IF(lwp) WRITE(numout,*) ' trc_ini_lobster : LOBSTER biochemical model initialisation' IF(lwp) WRITE(numout,*) ' ~~~~~~~~~~~~~~~' ! initialization of fields for optical model ! -------------------------------------------- xze (:,:) = 5.e0 xpar(:,:,:) = 0.e0 ! initialization for passive tracer remineralisation-damping array ! ----------------------------------------------------------------- DO jn = jp_lob0, jp_lob1 remdmp(:,jn) = tminr END DO IF(lwp) THEN WRITE(numout,*) ' ' WRITE(numout,*) ' trcini: compute remineralisation-damping ' WRITE(numout,*) ' arrays for tracers' ENDIF ! initialization of biological variables ! ------------------------------------------ ! Calculate vertical distribution of newly formed biogenic poc ! in the water column in the case of max. possible bottom depth ! ------------------------------------------------------------ zdm0 = 0.e0 zrro = 1.e0 DO jk = jpkb,jpkm1 DO jj =1, jpj DO ji =1, jpi zfluo = ( fsdepw(ji,jj,jk ) / fsdepw(ji,jj,jpkb) )**xhr zfluu = ( fsdepw(ji,jj,jk+1) / fsdepw(ji,jj,jpkb) )**xhr IF( zfluo.GT.1. ) zfluo = 1.e0 zdm0(ji,jj,jk) = zfluo - zfluu IF( jk <= jpkb-1 ) zdm0(ji,jj,jk) = 0.e0 zrro(ji,jj) = zrro(ji,jj) - zdm0(ji,jj,jk) END DO END DO END DO zdm0(:,:,jpk) = zrro(:,:) ! Calculate vertical distribution of newly formed biogenic poc ! in the water column with realistic topography (first "dry" layer ! contains total fraction, which has passed to the upper layers) ! ---------------------------------------------------------------------- dminl = 0. dmin3 = zdm0 DO jk = 1, jpk DO jj = 1, jpj DO ji = 1, jpi IF( tmask(ji,jj,jk) == 0. ) THEN dminl(ji,jj) = dminl(ji,jj) + dmin3(ji,jj,jk) dmin3(ji,jj,jk) = 0.e0 ENDIF END DO END DO END DO DO jj = 1, jpj DO ji = 1, jpi IF( tmask(ji,jj,1) == 0 ) dmin3(ji,jj,1) = 0.e0 END DO END DO ! Coastal mask ! ------------ cmask(:,:) = 0.e0 DO ji = 2, jpi-1 DO jj = 2, jpj-1 if (tmask(ji,jj,1) == 1) then ztest=tmask(ji+1,jj,1)*tmask(ji-1,jj,1)*tmask(ji,jj+1,1)*tmask(ji,jj-1,1) IF (ztest == 0) cmask(ji,jj) = 1. endif END DO END DO CALL lbc_lnk( cmask, 'T', 1. ) ! Coastal surface ! --------------- areacot = glob_sum( e1t(:,:) * e2t(:,:) * cmask(:,:) ) ! Initialization of tracer concentration in case of no restart !------------------------------------------------------------- IF( .NOT. ln_rsttr ) THEN # if defined key_eel_r6 || defined key_eel_r2 ! LOBSTER initialisation for EEL ! ---------------------- ! here: analytical initialisation used in Levy et al. (2001) DO jk = 1, 7 trn(:,:,jk,jp_lob_det) = 0.016 * tmask(:,:,jk) trn(:,:,jk,jp_lob_zoo) = 0.018 * tmask(:,:,jk) trn(:,:,jk,jp_lob_phy) = 0.036 * tmask(:,:,jk) trn(:,:,jk,jp_lob_no3) = 1.e-5 * tmask(:,:,jk) trn(:,:,jk,jp_lob_nh4) = 5.e-4 * tmask(:,:,jk) trn(:,:,jk,jp_lob_dom) = 0.017 * tmask(:,:,jk) END DO trn(:,:, 8,jp_lob_det) = 0.020 * tmask(:,:, 8) trn(:,:, 8,jp_lob_zoo) = 0.027 * tmask(:,:, 8) trn(:,:, 8,jp_lob_phy) = 0.041 * tmask(:,:, 8) trn(:,:, 8,jp_lob_no3) = 0.00022 * tmask(:,:, 8) trn(:,:, 8,jp_lob_nh4) = 0.0033 * tmask(:,:, 8) trn(:,:, 8,jp_lob_dom) = 0.021 * tmask(:,:, 8) trn(:,:, 9,jp_lob_det) = 0.0556 * tmask(:,:, 9) trn(:,:, 9,jp_lob_zoo) = 0.123 * tmask(:,:, 9) trn(:,:, 9,jp_lob_phy) = 0.122 * tmask(:,:, 9) trn(:,:, 9,jp_lob_no3) = 0.028 * tmask(:,:, 9) trn(:,:, 9,jp_lob_nh4) = 0.024 * tmask(:,:, 9) trn(:,:, 9,jp_lob_dom) = 0.06 * tmask(:,:, 9) trn(:,:,10,jp_lob_det) = 0.025 * tmask(:,:,10) trn(:,:,10,jp_lob_zoo) = 0.016 * tmask(:,:,10) trn(:,:,10,jp_lob_phy) = 0.029 * tmask(:,:,10) trn(:,:,10,jp_lob_no3) = 2.462 * tmask(:,:,10) trn(:,:,10,jp_lob_nh4) = 0.04 * tmask(:,:,10) trn(:,:,10,jp_lob_dom) = 0.022 * tmask(:,:,10) trn(:,:,11,jp_lob_det) = 0.0057 * tmask(:,:,11) trn(:,:,11,jp_lob_zoo) = 0.0005 * tmask(:,:,11) trn(:,:,11,jp_lob_phy) = 0.0006 * tmask(:,:,11) trn(:,:,11,jp_lob_no3) = 3.336 * tmask(:,:,11) trn(:,:,11,jp_lob_nh4) = 0.005 * tmask(:,:,11) trn(:,:,11,jp_lob_dom) = 0.004 * tmask(:,:,11) trn(:,:,12,jp_lob_det) = 0.002 * tmask(:,:,12) trn(:,:,12,jp_lob_zoo) = 1.e-6 * tmask(:,:,12) trn(:,:,12,jp_lob_phy) = 5.e-6 * tmask(:,:,12) trn(:,:,12,jp_lob_no3) = 4.24 * tmask(:,:,12) trn(:,:,12,jp_lob_nh4) = 0.001 * tmask(:,:,12) trn(:,:,12,jp_lob_dom) = 3.e-5 * tmask(:,:,12) DO jk=13,jpk trn(:,:,jk,jp_lob_det) = 0.e0 trn(:,:,jk,jp_lob_zoo) = 0.e0 trn(:,:,jk,jp_lob_phy) = 0.e0 trn(:,:,jk,jp_lob_nh4) = 0.e0 trn(:,:,jk,jp_lob_dom) = 0.e0 END DO trn(:,:,13,jp_lob_no3) = 5.31 * tmask(:,:,13) trn(:,:,14,jp_lob_no3) = 6.73 * tmask(:,:,14) trn(:,:,15,jp_lob_no3) = 8.32 * tmask(:,:,15) trn(:,:,16,jp_lob_no3) = 10.13 * tmask(:,:,16) trn(:,:,17,jp_lob_no3) = 11.95 * tmask(:,:,17) trn(:,:,18,jp_lob_no3) = 13.57 * tmask(:,:,18) trn(:,:,19,jp_lob_no3) = 15.08 * tmask(:,:,19) trn(:,:,20,jp_lob_no3) = 16.41 * tmask(:,:,20) trn(:,:,21,jp_lob_no3) = 17.47 * tmask(:,:,21) trn(:,:,22,jp_lob_no3) = 18.29 * tmask(:,:,22) trn(:,:,23,jp_lob_no3) = 18.88 * tmask(:,:,23) trn(:,:,24,jp_lob_no3) = 19.30 * tmask(:,:,24) trn(:,:,25,jp_lob_no3) = 19.68 * tmask(:,:,25) trn(:,:,26,jp_lob_no3) = 19.91 * tmask(:,:,26) trn(:,:,27,jp_lob_no3) = 19.99 * tmask(:,:,27) trn(:,:,28,jp_lob_no3) = 20.01 * tmask(:,:,28) trn(:,:,29,jp_lob_no3) = 20.01 * tmask(:,:,29) trn(:,:,30,jp_lob_no3) = 20.01 * tmask(:,:,30) # elif defined key_gyre ! LOBSTER initialisation for GYRE ! ---------------------- ! here: init NO3=f(density) by asklod AS Kremeur 2005-07 trn(:,:,:,jp_lob_det) = 0.1 * tmask(:,:,:) trn(:,:,:,jp_lob_zoo) = 0.1 * tmask(:,:,:) trn(:,:,:,jp_lob_nh4) = 0.1 * tmask(:,:,:) trn(:,:,:,jp_lob_phy) = 0.1 * tmask(:,:,:) trn(:,:,:,jp_lob_dom) = 1.0 * tmask(:,:,:) DO jk = 1, jpk DO jj = 1, jpj DO ji = 1, jpi IF( rhd(ji,jj,jk) <= 24.5e-3 ) THEN trn(ji,jj,jk,jp_lob_no3) = 2. * tmask(ji,jj,jk) ELSE trn(ji,jj,jk,jp_lob_no3) = ( 15.55 * ( rhd(ji,jj,jk) * 1000. ) - 380.11 ) * tmask(ji,jj,jk) ENDIF END DO END DO END DO #endif ENDIF ! initialize the POC in sediments sedpocb(:,:) = 0.e0 sedpocn(:,:) = 0.e0 sedpoca(:,:) = 0.e0 IF(lwp) WRITE(numout,*) 'Initialization of LOBSTER tracers done' IF(lwp) WRITE(numout,*) ' ' IF( wrk_not_released(2, 1) .OR. wrk_not_released(3, 1) )THEN CALL ctl_stop('trc_ini_lobster : failed to release workspace arrays.') END IF END SUBROUTINE trc_ini_lobster SUBROUTINE trc_ctl_lobster !!---------------------------------------------------------------------- !! *** ROUTINE trc_ctl_lobster *** !! !! ** Purpose : control the cpp options, namelist and files !!---------------------------------------------------------------------- INTEGER :: jl, jn IF(lwp) WRITE(numout,*) IF(lwp) WRITE(numout,*) ' use LOBSTER biological model ' ! Check number of tracers ! ----------------------- IF( jp_lobster /= 6 ) CALL ctl_stop( ' LOBSTER has 6 passive tracers. Change jp_lobster in par_lobster.F90' ) ! Check tracer names ! ------------------ IF( ctrcnm(jp_lob_det) /= 'DET' .OR. ctrcnm(jp_lob_zoo) /= 'ZOO' .OR. & & ctrcnm(jp_lob_phy) /= 'PHY' .OR. ctrcnm(jp_lob_no3) /= 'NO3' .OR. & & ctrcnm(jp_lob_nh4) /= 'NH4' .OR. ctrcnm(jp_lob_dom) /= 'DOM' .OR. & & ctrcnl(jp_lob_det) /= 'Detritus' .OR. & & ctrcnl(jp_lob_zoo) /= 'Zooplankton concentration' .OR. & & ctrcnl(jp_lob_phy) /= 'Phytoplankton concentration' .OR. & & ctrcnl(jp_lob_no3) /= 'Nitrate concentration' .OR. & & ctrcnl(jp_lob_nh4) /= 'Ammonium concentration' .OR. & & ctrcnl(jp_lob_dom) /= 'Dissolved organic matter' ) THEN ctrcnm(jp_lob_det)='DET' ctrcnl(jp_lob_det)='Detritus' ctrcnm(jp_lob_zoo)='ZOO' ctrcnl(jp_lob_zoo)='Zooplankton concentration' ctrcnm(jp_lob_phy)='PHY' ctrcnl(jp_lob_phy)='Phytoplankton concentration' ctrcnm(jp_lob_no3)='NO3' ctrcnl(jp_lob_no3)='Nitrate concentration' ctrcnm(jp_lob_nh4)='NH4' ctrcnl(jp_lob_nh4)='Ammonium concentration' ctrcnm(jp_lob_dom)='DOM' ctrcnl(jp_lob_dom)='Dissolved organic matter' IF(lwp) THEN CALL ctl_warn( ' We force tracer names ' ) DO jl = 1, jp_lobster jn = jp_lob0 + jl - 1 WRITE(numout,*) ' tracer nb: ',jn,' name = ',ctrcnm(jn), ctrcnl(jn) END DO WRITE(numout,*) ' ' ENDIF ENDIF ! Check tracer units DO jl = 1, jp_lobster jn = jp_lob0 + jl - 1 IF( ctrcun(jn) /= 'mmole-N/m3') THEN ctrcun(jn) = 'mmole-N/m3' IF(lwp) THEN CALL ctl_warn( ' We force tracer units ' ) WRITE(numout,*) ' tracer ',ctrcnm(jn), 'UNIT= ',ctrcun(jn) ENDIF ENDIF END DO END SUBROUTINE trc_ctl_lobster #else !!---------------------------------------------------------------------- !! Dummy module No LOBSTER bio-model !!---------------------------------------------------------------------- CONTAINS SUBROUTINE trc_ini_lobster ! Empty routine END SUBROUTINE trc_ini_lobster #endif !!====================================================================== END MODULE trcini_lobster