Changeset 12928 for NEMO/branches/2019/dev_r11078_OSMOSIS_IMMERSE_Nurser/src/TOP/PISCES/P4Z/p4zmicro.F90
- Timestamp:
- 2020-05-14T21:46:00+02:00 (4 years ago)
- Location:
- NEMO/branches/2019/dev_r11078_OSMOSIS_IMMERSE_Nurser
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2019/dev_r11078_OSMOSIS_IMMERSE_Nurser
- Property svn:externals
-
old new 6 6 ^/vendors/FCM@HEAD ext/FCM 7 7 ^/vendors/IOIPSL@HEAD ext/IOIPSL 8 9 # SETTE 10 ^/utils/CI/sette@HEAD sette
-
- Property svn:externals
-
NEMO/branches/2019/dev_r11078_OSMOSIS_IMMERSE_Nurser/src/TOP/PISCES/P4Z/p4zmicro.F90
r12178 r12928 42 42 REAL(wp), PUBLIC :: epshermin !: minimum growth efficiency for grazing 1 43 43 44 !! * Substitutions 45 # include "do_loop_substitute.h90" 44 46 !!---------------------------------------------------------------------- 45 47 !! NEMO/TOP 4.0 , NEMO Consortium (2018) … … 49 51 CONTAINS 50 52 51 SUBROUTINE p4z_micro( kt, knt )53 SUBROUTINE p4z_micro( kt, knt, Kbb, Krhs ) 52 54 !!--------------------------------------------------------------------- 53 55 !! *** ROUTINE p4z_micro *** … … 59 61 INTEGER, INTENT(in) :: kt ! ocean time step 60 62 INTEGER, INTENT(in) :: knt ! ??? 63 INTEGER, INTENT(in) :: Kbb, Krhs ! time level indices 61 64 ! 62 65 INTEGER :: ji, jj, jk … … 64 67 REAL(wp) :: zgraze , zdenom, zdenom2 65 68 REAL(wp) :: zfact , zfood, zfoodlim, zbeta 66 REAL(wp) :: zepsherf, zepshert, zepsherv, zgrarsig, zgraztotc, zgraztotn, zgraztotf 69 REAL(wp) :: zepsherf, zepshert, zepsherv, zepsherq 70 REAL(wp) :: zgrarsig, zgraztotc, zgraztotn, zgraztotf 67 71 REAL(wp) :: zgrarem, zgrafer, zgrapoc, zprcaca, zmortz 68 72 REAL(wp) :: zrespz, ztortz, zgrasrat, zgrasratn 69 73 REAL(wp) :: zgrazp, zgrazm, zgrazsd 70 74 REAL(wp) :: zgrazmf, zgrazsf, zgrazpf 71 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrazing, zfezoo 72 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: zw3d, zzligprod 75 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrazing, zfezoo, zzligprod 73 76 CHARACTER (len=25) :: charout 74 77 !!--------------------------------------------------------------------- … … 76 79 IF( ln_timing ) CALL timing_start('p4z_micro') 77 80 ! 78 IF (ln_ligand) THEN 79 ALLOCATE( zzligprod(jpi,jpj,jpk) ) 80 zzligprod(:,:,:) = 0._wp 81 ENDIF 82 ! 83 DO jk = 1, jpkm1 84 DO jj = 1, jpj 85 DO ji = 1, jpi 86 zcompaz = MAX( ( trb(ji,jj,jk,jpzoo) - 1.e-9 ), 0.e0 ) 87 zfact = xstep * tgfunc2(ji,jj,jk) * zcompaz 88 89 ! Respiration rates of both zooplankton 90 ! ------------------------------------- 91 zrespz = resrat * zfact * trb(ji,jj,jk,jpzoo) / ( xkmort + trb(ji,jj,jk,jpzoo) ) & 92 & + resrat * zfact * 3. * nitrfac(ji,jj,jk) 93 94 ! Zooplankton mortality. A square function has been selected with 95 ! no real reason except that it seems to be more stable and may mimic predation. 96 ! --------------------------------------------------------------- 97 ztortz = mzrat * 1.e6 * zfact * trb(ji,jj,jk,jpzoo) * (1. - nitrfac(ji,jj,jk)) 98 99 zcompadi = MIN( MAX( ( trb(ji,jj,jk,jpdia) - xthreshdia ), 0.e0 ), xsizedia ) 100 zcompaph = MAX( ( trb(ji,jj,jk,jpphy) - xthreshphy ), 0.e0 ) 101 zcompapoc = MAX( ( trb(ji,jj,jk,jppoc) - xthreshpoc ), 0.e0 ) 102 103 ! Microzooplankton grazing 104 ! ------------------------ 105 zfood = xprefn * zcompaph + xprefc * zcompapoc + xprefd * zcompadi 106 zfoodlim = MAX( 0. , zfood - min(xthresh,0.5*zfood) ) 107 zdenom = zfoodlim / ( xkgraz + zfoodlim ) 108 zdenom2 = zdenom / ( zfood + rtrn ) 109 zgraze = grazrat * xstep * tgfunc2(ji,jj,jk) * trb(ji,jj,jk,jpzoo) * (1. - nitrfac(ji,jj,jk)) 110 111 zgrazp = zgraze * xprefn * zcompaph * zdenom2 112 zgrazm = zgraze * xprefc * zcompapoc * zdenom2 113 zgrazsd = zgraze * xprefd * zcompadi * zdenom2 114 115 zgrazpf = zgrazp * trb(ji,jj,jk,jpnfe) / (trb(ji,jj,jk,jpphy) + rtrn) 116 zgrazmf = zgrazm * trb(ji,jj,jk,jpsfe) / (trb(ji,jj,jk,jppoc) + rtrn) 117 zgrazsf = zgrazsd * trb(ji,jj,jk,jpdfe) / (trb(ji,jj,jk,jpdia) + rtrn) 118 ! 119 zgraztotc = zgrazp + zgrazm + zgrazsd 120 zgraztotf = zgrazpf + zgrazsf + zgrazmf 121 zgraztotn = zgrazp * quotan(ji,jj,jk) + zgrazm + zgrazsd * quotad(ji,jj,jk) 122 123 ! Grazing by microzooplankton 124 zgrazing(ji,jj,jk) = zgraztotc 125 126 ! Various remineralization and excretion terms 127 ! -------------------------------------------- 128 zgrasrat = ( zgraztotf + rtrn ) / ( zgraztotc + rtrn ) 129 zgrasratn = ( zgraztotn + rtrn ) / ( zgraztotc + rtrn ) 130 zepshert = MIN( 1., zgrasratn, zgrasrat / ferat3) 131 zbeta = MAX(0., (epsher - epshermin) ) 132 zepsherf = epshermin + zbeta / ( 1.0 + 0.04E6 * 12. * zfood * zbeta ) 133 zepsherv = zepsherf * zepshert 134 135 zgrafer = zgraztotc * MAX( 0. , ( 1. - unass ) * zgrasrat - ferat3 * zepsherv ) 136 zgrarem = zgraztotc * ( 1. - zepsherv - unass ) 137 zgrapoc = zgraztotc * unass 138 139 ! Update of the TRA arrays 140 ! ------------------------ 141 zgrarsig = zgrarem * sigma1 142 tra(ji,jj,jk,jppo4) = tra(ji,jj,jk,jppo4) + zgrarsig 143 tra(ji,jj,jk,jpnh4) = tra(ji,jj,jk,jpnh4) + zgrarsig 144 tra(ji,jj,jk,jpdoc) = tra(ji,jj,jk,jpdoc) + zgrarem - zgrarsig 145 ! 146 IF( ln_ligand ) THEN 147 tra(ji,jj,jk,jplgw) = tra(ji,jj,jk,jplgw) + (zgrarem - zgrarsig) * ldocz 148 zzligprod(ji,jj,jk) = (zgrarem - zgrarsig) * ldocz 149 ENDIF 150 ! 151 tra(ji,jj,jk,jpoxy) = tra(ji,jj,jk,jpoxy) - o2ut * zgrarsig 152 tra(ji,jj,jk,jpfer) = tra(ji,jj,jk,jpfer) + zgrafer 153 zfezoo(ji,jj,jk) = zgrafer 154 tra(ji,jj,jk,jppoc) = tra(ji,jj,jk,jppoc) + zgrapoc 155 prodpoc(ji,jj,jk) = prodpoc(ji,jj,jk) + zgrapoc 156 tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) + zgraztotf * unass 157 tra(ji,jj,jk,jpdic) = tra(ji,jj,jk,jpdic) + zgrarsig 158 tra(ji,jj,jk,jptal) = tra(ji,jj,jk,jptal) + rno3 * zgrarsig 159 ! Update the arrays TRA which contain the biological sources and sinks 160 ! -------------------------------------------------------------------- 161 zmortz = ztortz + zrespz 162 tra(ji,jj,jk,jpzoo) = tra(ji,jj,jk,jpzoo) - zmortz + zepsherv * zgraztotc 163 tra(ji,jj,jk,jpphy) = tra(ji,jj,jk,jpphy) - zgrazp 164 tra(ji,jj,jk,jpdia) = tra(ji,jj,jk,jpdia) - zgrazsd 165 tra(ji,jj,jk,jpnch) = tra(ji,jj,jk,jpnch) - zgrazp * trb(ji,jj,jk,jpnch)/(trb(ji,jj,jk,jpphy)+rtrn) 166 tra(ji,jj,jk,jpdch) = tra(ji,jj,jk,jpdch) - zgrazsd * trb(ji,jj,jk,jpdch)/(trb(ji,jj,jk,jpdia)+rtrn) 167 tra(ji,jj,jk,jpdsi) = tra(ji,jj,jk,jpdsi) - zgrazsd * trb(ji,jj,jk,jpdsi)/(trb(ji,jj,jk,jpdia)+rtrn) 168 tra(ji,jj,jk,jpgsi) = tra(ji,jj,jk,jpgsi) + zgrazsd * trb(ji,jj,jk,jpdsi)/(trb(ji,jj,jk,jpdia)+rtrn) 169 tra(ji,jj,jk,jpnfe) = tra(ji,jj,jk,jpnfe) - zgrazpf 170 tra(ji,jj,jk,jpdfe) = tra(ji,jj,jk,jpdfe) - zgrazsf 171 tra(ji,jj,jk,jppoc) = tra(ji,jj,jk,jppoc) + zmortz - zgrazm 172 prodpoc(ji,jj,jk) = prodpoc(ji,jj,jk) + zmortz 173 conspoc(ji,jj,jk) = conspoc(ji,jj,jk) - zgrazm 174 tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) + ferat3 * zmortz - zgrazmf 175 ! 176 ! calcite production 177 zprcaca = xfracal(ji,jj,jk) * zgrazp 178 prodcal(ji,jj,jk) = prodcal(ji,jj,jk) + zprcaca ! prodcal=prodcal(nanophy)+prodcal(microzoo)+prodcal(mesozoo) 179 ! 180 zprcaca = part * zprcaca 181 tra(ji,jj,jk,jpdic) = tra(ji,jj,jk,jpdic) - zprcaca 182 tra(ji,jj,jk,jptal) = tra(ji,jj,jk,jptal) - 2. * zprcaca 183 tra(ji,jj,jk,jpcal) = tra(ji,jj,jk,jpcal) + zprcaca 184 END DO 185 END DO 186 END DO 187 ! 188 IF( lk_iomput ) THEN 189 IF( knt == nrdttrc ) THEN 190 ALLOCATE( zw3d(jpi,jpj,jpk) ) 191 IF( iom_use( "GRAZ1" ) ) THEN 192 zw3d(:,:,:) = zgrazing(:,:,:) * 1.e+3 * rfact2r * tmask(:,:,:) ! Total grazing of phyto by zooplankton 193 CALL iom_put( "GRAZ1", zw3d ) 194 ENDIF 195 IF( iom_use( "FEZOO" ) ) THEN 196 zw3d(:,:,:) = zfezoo(:,:,:) * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:) ! 197 CALL iom_put( "FEZOO", zw3d ) 198 ENDIF 199 IF( iom_use( "LPRODZ" ) .AND. ln_ligand ) THEN 200 zw3d(:,:,:) = zzligprod(:,:,:) * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:) 201 CALL iom_put( "LPRODZ" , zw3d ) 202 ENDIF 203 DEALLOCATE( zw3d ) 204 ENDIF 205 ENDIF 206 ! 207 IF (ln_ligand) DEALLOCATE( zzligprod ) 208 ! 209 IF(ln_ctl) THEN ! print mean trends (used for debugging) 81 DO_3D_11_11( 1, jpkm1 ) 82 zcompaz = MAX( ( tr(ji,jj,jk,jpzoo,Kbb) - 1.e-9 ), 0.e0 ) 83 zfact = xstep * tgfunc2(ji,jj,jk) * zcompaz 84 85 ! Respiration rates of both zooplankton 86 ! ------------------------------------- 87 zrespz = resrat * zfact * tr(ji,jj,jk,jpzoo,Kbb) / ( xkmort + tr(ji,jj,jk,jpzoo,Kbb) ) & 88 & + resrat * zfact * 3. * nitrfac(ji,jj,jk) 89 90 ! Zooplankton mortality. A square function has been selected with 91 ! no real reason except that it seems to be more stable and may mimic predation. 92 ! --------------------------------------------------------------- 93 ztortz = mzrat * 1.e6 * zfact * tr(ji,jj,jk,jpzoo,Kbb) * (1. - nitrfac(ji,jj,jk)) 94 95 zcompadi = MIN( MAX( ( tr(ji,jj,jk,jpdia,Kbb) - xthreshdia ), 0.e0 ), xsizedia ) 96 zcompaph = MAX( ( tr(ji,jj,jk,jpphy,Kbb) - xthreshphy ), 0.e0 ) 97 zcompapoc = MAX( ( tr(ji,jj,jk,jppoc,Kbb) - xthreshpoc ), 0.e0 ) 98 99 ! Microzooplankton grazing 100 ! ------------------------ 101 zfood = xprefn * zcompaph + xprefc * zcompapoc + xprefd * zcompadi 102 zfoodlim = MAX( 0. , zfood - min(xthresh,0.5*zfood) ) 103 zdenom = zfoodlim / ( xkgraz + zfoodlim ) 104 zdenom2 = zdenom / ( zfood + rtrn ) 105 zgraze = grazrat * xstep * tgfunc2(ji,jj,jk) * tr(ji,jj,jk,jpzoo,Kbb) * (1. - nitrfac(ji,jj,jk)) 106 107 zgrazp = zgraze * xprefn * zcompaph * zdenom2 108 zgrazm = zgraze * xprefc * zcompapoc * zdenom2 109 zgrazsd = zgraze * xprefd * zcompadi * zdenom2 110 111 zgrazpf = zgrazp * tr(ji,jj,jk,jpnfe,Kbb) / (tr(ji,jj,jk,jpphy,Kbb) + rtrn) 112 zgrazmf = zgrazm * tr(ji,jj,jk,jpsfe,Kbb) / (tr(ji,jj,jk,jppoc,Kbb) + rtrn) 113 zgrazsf = zgrazsd * tr(ji,jj,jk,jpdfe,Kbb) / (tr(ji,jj,jk,jpdia,Kbb) + rtrn) 114 ! 115 zgraztotc = zgrazp + zgrazm + zgrazsd 116 zgraztotf = zgrazpf + zgrazsf + zgrazmf 117 zgraztotn = zgrazp * quotan(ji,jj,jk) + zgrazm + zgrazsd * quotad(ji,jj,jk) 118 119 ! Grazing by microzooplankton 120 zgrazing(ji,jj,jk) = zgraztotc 121 122 123 ! Microzooplankton efficiency. 124 ! We adopt a formulation proposed by Mitra et al. (2007) 125 ! The gross growth efficiency is controled by the most limiting nutrient. 126 ! Growth is also further decreased when the food quality is poor. This is currently 127 ! hard coded : it can be decreased by up to 50% (zepsherq) 128 ! GGE can also be decreased when food quantity is high, zepsherf (Montagnes and 129 ! Fulton, 2012) 130 ! ----------------------------------------------------------------------------- 131 zgrasrat = ( zgraztotf + rtrn ) / ( zgraztotc + rtrn ) 132 zgrasratn = ( zgraztotn + rtrn ) / ( zgraztotc + rtrn ) 133 zepshert = MIN( 1., zgrasratn, zgrasrat / ferat3) 134 zbeta = MAX(0., (epsher - epshermin) ) 135 zepsherf = epshermin + zbeta / ( 1.0 + 0.04E6 * 12. * zfood * zbeta ) 136 zepsherq = 0.5 + (1.0 - 0.5) * zepshert * ( 1.0 + 1.0 ) / ( zepshert + 1.0 ) 137 zepsherv = zepsherf * zepshert * zepsherq 138 139 zgrafer = zgraztotc * MAX( 0. , ( 1. - unass ) * zgrasrat - ferat3 * zepsherv ) 140 zgrarem = zgraztotc * ( 1. - zepsherv - unass ) 141 zgrapoc = zgraztotc * unass 142 143 ! Update of the TRA arrays 144 ! ------------------------ 145 zgrarsig = zgrarem * sigma1 146 tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) + zgrarsig 147 tr(ji,jj,jk,jpnh4,Krhs) = tr(ji,jj,jk,jpnh4,Krhs) + zgrarsig 148 tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + zgrarem - zgrarsig 149 ! 150 IF( ln_ligand ) THEN 151 tr(ji,jj,jk,jplgw,Krhs) = tr(ji,jj,jk,jplgw,Krhs) + (zgrarem - zgrarsig) * ldocz 152 zzligprod(ji,jj,jk) = (zgrarem - zgrarsig) * ldocz 153 ENDIF 154 ! 155 tr(ji,jj,jk,jpoxy,Krhs) = tr(ji,jj,jk,jpoxy,Krhs) - o2ut * zgrarsig 156 tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + zgrafer 157 zfezoo(ji,jj,jk) = zgrafer 158 tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) + zgrapoc 159 prodpoc(ji,jj,jk) = prodpoc(ji,jj,jk) + zgrapoc 160 tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + zgraztotf * unass 161 tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) + zgrarsig 162 tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + rno3 * zgrarsig 163 ! Update the arrays TRA which contain the biological sources and sinks 164 ! -------------------------------------------------------------------- 165 zmortz = ztortz + zrespz 166 tr(ji,jj,jk,jpzoo,Krhs) = tr(ji,jj,jk,jpzoo,Krhs) - zmortz + zepsherv * zgraztotc 167 tr(ji,jj,jk,jpphy,Krhs) = tr(ji,jj,jk,jpphy,Krhs) - zgrazp 168 tr(ji,jj,jk,jpdia,Krhs) = tr(ji,jj,jk,jpdia,Krhs) - zgrazsd 169 tr(ji,jj,jk,jpnch,Krhs) = tr(ji,jj,jk,jpnch,Krhs) - zgrazp * tr(ji,jj,jk,jpnch,Kbb)/(tr(ji,jj,jk,jpphy,Kbb)+rtrn) 170 tr(ji,jj,jk,jpdch,Krhs) = tr(ji,jj,jk,jpdch,Krhs) - zgrazsd * tr(ji,jj,jk,jpdch,Kbb)/(tr(ji,jj,jk,jpdia,Kbb)+rtrn) 171 tr(ji,jj,jk,jpdsi,Krhs) = tr(ji,jj,jk,jpdsi,Krhs) - zgrazsd * tr(ji,jj,jk,jpdsi,Kbb)/(tr(ji,jj,jk,jpdia,Kbb)+rtrn) 172 tr(ji,jj,jk,jpgsi,Krhs) = tr(ji,jj,jk,jpgsi,Krhs) + zgrazsd * tr(ji,jj,jk,jpdsi,Kbb)/(tr(ji,jj,jk,jpdia,Kbb)+rtrn) 173 tr(ji,jj,jk,jpnfe,Krhs) = tr(ji,jj,jk,jpnfe,Krhs) - zgrazpf 174 tr(ji,jj,jk,jpdfe,Krhs) = tr(ji,jj,jk,jpdfe,Krhs) - zgrazsf 175 tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) + zmortz - zgrazm 176 prodpoc(ji,jj,jk) = prodpoc(ji,jj,jk) + zmortz 177 conspoc(ji,jj,jk) = conspoc(ji,jj,jk) - zgrazm 178 tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + ferat3 * zmortz - zgrazmf 179 ! 180 ! calcite production 181 zprcaca = xfracal(ji,jj,jk) * zgrazp 182 prodcal(ji,jj,jk) = prodcal(ji,jj,jk) + zprcaca ! prodcal=prodcal(nanophy)+prodcal(microzoo)+prodcal(mesozoo) 183 ! 184 zprcaca = part * zprcaca 185 tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) - zprcaca 186 tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) - 2. * zprcaca 187 tr(ji,jj,jk,jpcal,Krhs) = tr(ji,jj,jk,jpcal,Krhs) + zprcaca 188 END_3D 189 ! 190 IF( lk_iomput .AND. knt == nrdttrc ) THEN 191 IF( iom_use("GRAZ1") ) THEN ! Total grazing of phyto by zooplankton 192 zgrazing(:,:,jpk) = 0._wp ; CALL iom_put( "GRAZ1" , zgrazing(:,:,:) * 1.e+3 * rfact2r * tmask(:,:,:) ) 193 ENDIF 194 IF( iom_use("FEZOO") ) THEN 195 zfezoo (:,:,jpk) = 0._wp ; CALL iom_put( "FEZOO", zfezoo(:,:,:) * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:) ) 196 ENDIF 197 IF( ln_ligand ) THEN 198 zzligprod(:,:,jpk) = 0._wp ; CALL iom_put( "LPRODZ", zzligprod(:,:,:) * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:)) 199 ENDIF 200 ENDIF 201 ! 202 IF(sn_cfctl%l_prttrc) THEN ! print mean trends (used for debugging) 210 203 WRITE(charout, FMT="('micro')") 211 204 CALL prt_ctl_trc_info(charout) 212 CALL prt_ctl_trc(tab4d=tr a, mask=tmask, clinfo=ctrcnm)205 CALL prt_ctl_trc(tab4d=tr(:,:,:,:,Krhs), mask=tmask, clinfo=ctrcnm) 213 206 ENDIF 214 207 ! … … 243 236 ENDIF 244 237 ! 245 REWIND( numnatp_ref ) ! Namelist nampiszoo in reference namelist : Pisces microzooplankton246 238 READ ( numnatp_ref, namp4zzoo, IOSTAT = ios, ERR = 901) 247 239 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namp4zzoo in reference namelist' ) 248 REWIND( numnatp_cfg ) ! Namelist nampiszoo in configuration namelist : Pisces microzooplankton249 240 READ ( numnatp_cfg, namp4zzoo, IOSTAT = ios, ERR = 902 ) 250 241 902 IF( ios > 0 ) CALL ctl_nam ( ios , 'namp4zzoo in configuration namelist' )
Note: See TracChangeset
for help on using the changeset viewer.