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 7162 for branches/2016/dev_r7012_ROBUST5_CNRS/NEMOGCM/NEMO/TOP_SRC/PISCES/P4Z/p4zsms.F90 – NEMO

Ignore:
Timestamp:
2016-11-01T14:23:51+01:00 (8 years ago)
Author:
cetlod
Message:

new top interface : Add PISCES quota model

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2016/dev_r7012_ROBUST5_CNRS/NEMOGCM/NEMO/TOP_SRC/PISCES/P4Z/p4zsms.F90

    r7068 r7162  
    7676        CALL p4z_che                              ! initialize the chemical constants 
    7777        ! 
    78         IF( .NOT. ln_rsttr ) THEN  ;   CALL p4z_ph_ini   !  set PH at kt=nit000  
     78        IF( .NOT. ln_rsttr ) THEN  ;   CALL ahini_for_at(hi)   !  set PH at kt=nit000  
    7979        ELSE                       ;   CALL p4z_rst( nittrc000, 'READ' )  !* read or initialize all required fields  
    8080        ENDIF 
     
    8484      IF( ln_pisdmp .AND. MOD( kt - nn_dttrc, nn_pisdmp ) == 0 )   CALL p4z_dmp( kt )      ! Relaxation of some tracers 
    8585      ! 
    86       !                                                                    !   set time step size (Euler/Leapfrog) 
    87       IF( ( neuler == 0 .AND. kt == nittrc000 ) .OR. ln_top_euler ) THEN   ;    rfact = rdttrc     !  at nittrc000 
    88       ELSEIF( kt <= nittrc000 + nn_dttrc )                          THEN   ;    rfact = 2. * rdttrc   ! at nittrc000 or nittrc000+nn_dttrc (Leapfrog) 
    89       ENDIF 
     86      rfact = r2dttrc 
    9087      ! 
    9188      IF( ( ln_top_euler .AND. kt == nittrc000 )  .OR. ( .NOT.ln_top_euler .AND. kt <= nittrc000 + nn_dttrc ) ) THEN 
     
    195192      !!             namelist: natext, natbio, natsms 
    196193      !!---------------------------------------------------------------------- 
    197       NAMELIST/nampisbio/ nrdttrc, wsbio, xkmort, ferat3, wsbio2, niter1max, niter2max 
     194      NAMELIST/nampisbio/ nrdttrc, wsbio, xkmort, ferat3, wsbio2, wsbio2max, wsbio2scale,    & 
     195         &                   niter1max, niter2max, wfep, ldocp, ldocz, lthet,  & 
     196         &                   no3rat3, po4rat3 
     197 
    198198      NAMELIST/nampisdmp/ ln_pisdmp, nn_pisdmp 
    199199      NAMELIST/nampismass/ ln_check_mass 
     
    212212      IF(lwp) THEN                         ! control print 
    213213         WRITE(numout,*) ' Namelist : nampisbio' 
    214          WRITE(numout,*) '    frequence pour la biologie                nrdttrc   =', nrdttrc 
    215          WRITE(numout,*) '    POC sinking speed                         wsbio     =', wsbio 
    216          WRITE(numout,*) '    half saturation constant for mortality    xkmort    =', xkmort 
    217          WRITE(numout,*) '    Fe/C in zooplankton                       ferat3    =', ferat3 
    218          WRITE(numout,*) '    Big particles sinking speed               wsbio2    =', wsbio2 
     214         WRITE(numout,*) '    frequence pour la biologie                nrdttrc    =', nrdttrc 
     215         WRITE(numout,*) '    POC sinking speed                         wsbio      =', wsbio 
     216         WRITE(numout,*) '    half saturation constant for mortality    xkmort     =', xkmort  
     217         IF( ln_p5z ) THEN 
     218            WRITE(numout,*) '    N/C in zooplankton                        no3rat3    =', no3rat3 
     219            WRITE(numout,*) '    P/C in zooplankton                        po4rat3    =', po4rat3 
     220         ENDIF 
     221         WRITE(numout,*) '    Fe/C in zooplankton                       ferat3     =', ferat3 
     222         WRITE(numout,*) '    Big particles sinking speed               wsbio2     =', wsbio2 
     223         WRITE(numout,*) '    Big particles maximum sinking speed       wsbio2max  =', wsbio2max 
     224         WRITE(numout,*) '    Big particles sinking speed length scale  wsbio2scale =', wsbio2scale 
    219225         WRITE(numout,*) '    Maximum number of iterations for POC      niter1max =', niter1max 
    220226         WRITE(numout,*) '    Maximum number of iterations for GOC      niter2max =', niter2max 
    221       ENDIF 
     227         IF( ln_ligand ) THEN 
     228            WRITE(numout,*) '    FeP sinking speed                             wfep   =', wfep 
     229            IF( ln_p4z ) THEN 
     230              WRITE(numout,*) '    Phyto ligand production per unit doc          ldocp  =', ldocp 
     231              WRITE(numout,*) '    Zoo ligand production per unit doc            ldocz  =', ldocz 
     232              WRITE(numout,*) '    Proportional loss of ligands due to Fe uptake lthet  =', lthet 
     233            ENDIF 
     234         ENDIF 
     235      ENDIF 
     236 
    222237 
    223238      REWIND( numnatp_ref )              ! Namelist nampisdmp in reference namelist : Pisces damping 
     
    256271   END SUBROUTINE p4z_sms_init 
    257272 
    258    SUBROUTINE p4z_ph_ini 
    259       !!--------------------------------------------------------------------- 
    260       !!                   ***  ROUTINE p4z_ini_ph  *** 
    261       !! 
    262       !!  ** Purpose : Initialization of chemical variables of the carbon cycle 
    263       !!--------------------------------------------------------------------- 
    264       INTEGER  ::  ji, jj, jk 
    265       REAL(wp) ::  zcaralk, zbicarb, zco3 
    266       REAL(wp) ::  ztmas, ztmas1 
    267       !!--------------------------------------------------------------------- 
    268  
    269       ! Set PH from  total alkalinity, borat (???), akb3 (???) and ak23 (???) 
    270       ! -------------------------------------------------------- 
    271       DO jk = 1, jpk 
    272          DO jj = 1, jpj 
    273             DO ji = 1, jpi 
    274                ztmas   = tmask(ji,jj,jk) 
    275                ztmas1  = 1. - tmask(ji,jj,jk) 
    276                zcaralk = trb(ji,jj,jk,jptal) - borat(ji,jj,jk) / (  1. + 1.E-8 / ( rtrn + akb3(ji,jj,jk) )  ) 
    277                zco3    = ( zcaralk - trb(ji,jj,jk,jpdic) ) * ztmas + 0.5e-3 * ztmas1 
    278                zbicarb = ( 2. * trb(ji,jj,jk,jpdic) - zcaralk ) 
    279                hi(ji,jj,jk) = ( ak23(ji,jj,jk) * zbicarb / zco3 ) * ztmas + 1.e-9 * ztmas1 
    280             END DO 
    281          END DO 
    282      END DO 
    283      ! 
    284    END SUBROUTINE p4z_ph_ini 
    285  
    286273   SUBROUTINE p4z_rst( kt, cdrw ) 
    287274      !!--------------------------------------------------------------------- 
     
    297284      CHARACTER(len=*), INTENT(in) ::   cdrw       ! "READ"/"WRITE" flag 
    298285      ! 
    299       INTEGER  ::  ji, jj, jk 
    300       REAL(wp) ::  zcaralk, zbicarb, zco3 
    301       REAL(wp) ::  ztmas, ztmas1 
    302286      !!--------------------------------------------------------------------- 
    303287 
     
    311295            CALL iom_get( numrtr, jpdom_autoglo, 'PH' , hi(:,:,:)  ) 
    312296         ELSE 
    313 !            hi(:,:,:) = 1.e-9  
    314             CALL p4z_ph_ini 
     297            CALL ahini_for_at(hi) 
    315298         ENDIF 
    316299         CALL iom_get( numrtr, jpdom_autoglo, 'Silicalim', xksi(:,:) ) 
     
    327310         ENDIF 
    328311         ! 
     312         IF( ln_p5z ) THEN 
     313            IF( iom_varid( numrtr, 'sized', ldstop = .FALSE. ) > 0 ) THEN 
     314               CALL iom_get( numrtr, jpdom_autoglo, 'sizep' , sized(:,:,:)  ) 
     315               CALL iom_get( numrtr, jpdom_autoglo, 'sizen' , sized(:,:,:)  ) 
     316               CALL iom_get( numrtr, jpdom_autoglo, 'sized' , sized(:,:,:)  ) 
     317            ELSE 
     318               sizep(:,:,:) = 1. 
     319               sizen(:,:,:) = 1. 
     320               sized(:,:,:) = 1. 
     321            ENDIF 
     322        ENDIF 
     323        ! 
    329324      ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN 
    330325         IF( kt == nitrst ) THEN 
     
    337332         CALL iom_rstput( kt, nitrst, numrtw, 'Silicamax', xksimax(:,:) ) 
    338333         CALL iom_rstput( kt, nitrst, numrtw, 'tcflxcum', t_oce_co2_flx_cum ) 
     334         IF( ln_p5z ) THEN 
     335            CALL iom_rstput( kt, nitrst, numrtw, 'sizep', sized(:,:,:) ) 
     336            CALL iom_rstput( kt, nitrst, numrtw, 'sizen', sized(:,:,:) ) 
     337            CALL iom_rstput( kt, nitrst, numrtw, 'sized', sized(:,:,:) ) 
     338         ENDIF 
    339339      ENDIF 
    340340      ! 
     
    423423      REAL(wp)             ::  zrdenittot, zsdenittot, znitrpottot 
    424424      CHARACTER(LEN=100)   ::   cltxt 
    425       REAL(wp), DIMENSION(jpi,jpj,jpk) :: zvol 
    426425      INTEGER :: jk 
     426      REAL(wp), POINTER, DIMENSION(:,:,:) :: zwork 
    427427      !!---------------------------------------------------------------------- 
    428428 
     
    444444      ENDIF 
    445445 
     446      CALL wrk_alloc( jpi, jpj, jpk, zwork ) 
    446447      ! 
    447448      IF( iom_use( "pno3tot" ) .OR. ( ln_check_mass .AND. kt == nitend )  ) THEN 
    448449         !   Compute the budget of NO3, ALK, Si, Fer 
    449          no3budget = glob_sum( (   trn(:,:,:,jpno3) + trn(:,:,:,jpnh4)  & 
    450             &                    + trn(:,:,:,jpphy) + trn(:,:,:,jpdia)  & 
    451             &                    + trn(:,:,:,jpzoo) + trn(:,:,:,jpmes)  & 
    452             &                    + trn(:,:,:,jppoc)                     & 
    453             &                    + trn(:,:,:,jpgoc)                     & 
    454             &                    + trn(:,:,:,jpdoc)                     ) * cvol(:,:,:)  ) 
    455          ! 
    456          no3budget = no3budget / areatot 
    457          CALL iom_put( "pno3tot", no3budget ) 
     450         IF( ln_p4z ) THEN 
     451            zwork(:,:,:) =    trn(:,:,:,jpno3) + trn(:,:,:,jpnh4)                      & 
     452               &          +   trn(:,:,:,jpphy) + trn(:,:,:,jpdia)                      & 
     453               &          +   trn(:,:,:,jppoc) + trn(:,:,:,jpgoc)  + trn(:,:,:,jpdoc)  &         
     454               &          +   trn(:,:,:,jpzoo) + trn(:,:,:,jpmes)  
     455        ELSE 
     456            zwork(:,:,:) =    trn(:,:,:,jpno3) + trn(:,:,:,jpnh4) + trn(:,:,:,jpnph)   & 
     457               &          +   trn(:,:,:,jpndi) + trn(:,:,:,jpnpi)                      &  
     458               &          +   trn(:,:,:,jppon) + trn(:,:,:,jpgon) + trn(:,:,:,jpdon)   & 
     459               &          + ( trn(:,:,:,jpzoo) + trn(:,:,:,jpmes) ) * no3rat3  
     460        ENDIF 
     461        ! 
     462        no3budget = glob_sum( zwork(:,:,:) * cvol(:,:,:)  )   
     463        no3budget = no3budget / areatot 
     464        CALL iom_put( "pno3tot", no3budget ) 
    458465      ENDIF 
    459466      ! 
    460467      IF( iom_use( "ppo4tot" ) .OR. ( ln_check_mass .AND. kt == nitend )  ) THEN 
    461          po4budget = glob_sum( (   trn(:,:,:,jppo4)                     & 
    462             &                    + trn(:,:,:,jpphy) + trn(:,:,:,jpdia)  & 
    463             &                    + trn(:,:,:,jpzoo) + trn(:,:,:,jpmes)  & 
    464             &                    + trn(:,:,:,jppoc)                     & 
    465             &                    + trn(:,:,:,jpgoc)                     & 
    466             &                    + trn(:,:,:,jpdoc)                     ) * cvol(:,:,:)  ) 
    467          po4budget = po4budget / areatot 
    468          CALL iom_put( "ppo4tot", po4budget ) 
     468         IF( ln_p4z ) THEN 
     469            zwork(:,:,:) =    trn(:,:,:,jppo4)                                         & 
     470               &          +   trn(:,:,:,jpphy) + trn(:,:,:,jpdia)                      & 
     471               &          +   trn(:,:,:,jppoc) + trn(:,:,:,jpgoc)  + trn(:,:,:,jpdoc)  &         
     472               &          +   trn(:,:,:,jpzoo) + trn(:,:,:,jpmes)  
     473        ELSE 
     474            zwork(:,:,:) =    trn(:,:,:,jppo4) + trn(:,:,:,jppph)                      & 
     475               &          +   trn(:,:,:,jppdi) + trn(:,:,:,jpppi)                      &  
     476               &          +   trn(:,:,:,jppop) + trn(:,:,:,jpgop) + trn(:,:,:,jpdop)   & 
     477               &          + ( trn(:,:,:,jpzoo) + trn(:,:,:,jpmes) ) * po4rat3  
     478        ENDIF 
     479        ! 
     480        po4budget = glob_sum( zwork(:,:,:) * cvol(:,:,:)  )   
     481        po4budget = po4budget / areatot 
     482        CALL iom_put( "ppo4tot", po4budget ) 
    469483      ENDIF 
    470484      ! 
    471485      IF( iom_use( "psiltot" ) .OR. ( ln_check_mass .AND. kt == nitend )  ) THEN 
    472          silbudget = glob_sum( (   trn(:,:,:,jpsil) + trn(:,:,:,jpgsi)  & 
    473             &                    + trn(:,:,:,jpdsi)                     ) * cvol(:,:,:)  ) 
    474          ! 
     486         zwork(:,:,:) =  trn(:,:,:,jpsil) + trn(:,:,:,jpgsi) + trn(:,:,:,jpdsi)  
     487         ! 
     488         silbudget = glob_sum( zwork(:,:,:) * cvol(:,:,:)  )   
    475489         silbudget = silbudget / areatot 
    476490         CALL iom_put( "psiltot", silbudget ) 
     
    478492      ! 
    479493      IF( iom_use( "palktot" ) .OR. ( ln_check_mass .AND. kt == nitend )  ) THEN 
    480          alkbudget = glob_sum( (   trn(:,:,:,jpno3) * rno3              & 
    481             &                    + trn(:,:,:,jptal)                     & 
    482             &                    + trn(:,:,:,jpcal) * 2.                ) * cvol(:,:,:)  ) 
    483          ! 
     494         zwork(:,:,:) =  trn(:,:,:,jpno3) * rno3 + trn(:,:,:,jptal) + trn(:,:,:,jpcal) * 2.               
     495         ! 
     496         alkbudget = glob_sum( zwork(:,:,:) * cvol(:,:,:)  )         ! 
    484497         alkbudget = alkbudget / areatot 
    485498         CALL iom_put( "palktot", alkbudget ) 
     
    487500      ! 
    488501      IF( iom_use( "pfertot" ) .OR. ( ln_check_mass .AND. kt == nitend )  ) THEN 
    489          ferbudget = glob_sum( (   trn(:,:,:,jpfer) + trn(:,:,:,jpnfe)  & 
    490             &                    + trn(:,:,:,jpdfe)                     & 
    491             &                    + trn(:,:,:,jpbfe)                     & 
    492             &                    + trn(:,:,:,jpsfe)                     & 
    493             &                    + trn(:,:,:,jpzoo) * ferat3            & 
    494             &                    + trn(:,:,:,jpmes) * ferat3            ) * cvol(:,:,:)  ) 
    495          ! 
     502         zwork(:,:,:) =   trn(:,:,:,jpfer) + trn(:,:,:,jpnfe) + trn(:,:,:,jpdfe)   & 
     503            &         +   trn(:,:,:,jpbfe) + trn(:,:,:,jpsfe)                      & 
     504            &         + ( trn(:,:,:,jpzoo) + trn(:,:,:,jpmes) )  * ferat3     
     505         IF( ln_ligand)  zwork(:,:,:) = zwork(:,:,:) + trn(:,:,:,jpfep)                 
     506         ! 
     507         ferbudget = glob_sum( zwork(:,:,:) * cvol(:,:,:)  )   
    496508         ferbudget = ferbudget / areatot 
    497509         CALL iom_put( "pfertot", ferbudget ) 
    498510      ENDIF 
    499511      ! 
    500  
     512      CALL wrk_dealloc( jpi, jpj, jpk, zwork ) 
     513      ! 
    501514      ! Global budget of N SMS : denitrification in the water column and in the sediment 
    502515      !                          nitrogen fixation by the diazotrophs 
Note: See TracChangeset for help on using the changeset viewer.