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 3294 for trunk/NEMOGCM/NEMO/TOP_SRC/PISCES/trcsms_pisces.F90 – NEMO

Ignore:
Timestamp:
2012-01-28T17:44:18+01:00 (12 years ago)
Author:
rblod
Message:

Merge of 3.4beta into the trunk

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMOGCM/NEMO/TOP_SRC/PISCES/trcsms_pisces.F90

    r2715 r3294  
    1313   !!   trcsms_pisces        :  Time loop of passive tracers sms 
    1414   !!---------------------------------------------------------------------- 
    15    USE oce_trc         ! 
    16    USE trc 
    17    USE sms_pisces 
    18     
    19    USE p4zint          !  
    20    USE p4zche          !  
    21    USE p4zbio          !  
    22    USE p4zsink         !  
    23    USE p4zopt          !  
    24    USE p4zlim          !  
    25    USE p4zprod         ! 
    26    USE p4zmort         ! 
    27    USE p4zmicro        !  
    28    USE p4zmeso         !  
    29    USE p4zrem          !  
    30    USE p4zsed          !  
    31    USE p4zlys          !  
    32    USE p4zflx          !  
    33  
    34    USE prtctl_trc 
    35  
    36    USE trdmod_oce 
    37    USE trdmod_trc 
    38  
    39    USE sedmodel 
     15   USE oce_trc         !  shared variables between ocean and passive tracers 
     16   USE trc             !  passive tracers common variables  
     17   USE sms_pisces      !  PISCES Source Minus Sink variables 
     18   USE p4zbio          !  Biological model 
     19   USE p4zche          !  Chemical model 
     20   USE p4zlys          !  Calcite saturation 
     21   USE p4zflx          !  Gas exchange 
     22   USE p4zsed          !  Sedimentation 
     23   USE p4zint          !  time interpolation 
     24   USE trdmod_oce      !  Ocean trends variables 
     25   USE trdmod_trc      !  TOP trends variables 
     26   USE sedmodel        !  Sediment model 
     27   USE prtctl_trc      !  print control for debugging 
    4028 
    4129   IMPLICIT NONE 
     
    4331 
    4432   PUBLIC   trc_sms_pisces    ! called in trcsms.F90 
     33 
     34   LOGICAL ::  ln_check_mass = .false.       !: Flag to check mass conservation  
     35 
     36   INTEGER ::  numno3  !: logical unit for NO3 budget 
     37   INTEGER ::  numalk  !: logical unit for talk budget 
     38   INTEGER ::  numsil  !: logical unit for Si budget 
    4539 
    4640   !!---------------------------------------------------------------------- 
     
    6357      !!              - ... 
    6458      !!--------------------------------------------------------------------- 
    65       USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released 
    66       USE wrk_nemo, ONLY: ztrpis => wrk_3d_1   ! used for pisces sms trends 
    6759      ! 
    6860      INTEGER, INTENT( in ) ::   kt      ! ocean time-step index       
     
    7163      CHARACTER (len=25) :: charout 
    7264      !!--------------------------------------------------------------------- 
    73  
    74       IF( kt == nit000 )   CALL trc_sms_pisces_init    ! Initialization (first time-step only) 
    75  
    76       IF( wrk_in_use(3,1) )  THEN 
    77         CALL ctl_stop('trc_sms_pisces : requested workspace array unavailable.')  ;  RETURN 
    78       ENDIF 
     65      ! 
     66      IF( nn_timing == 1 )  CALL timing_start('trc_sms_pisces') 
     67      ! 
     68      IF( ln_pisdmp .AND. MOD( kt - nn_dttrc, nn_pisdmp ) == 0 )   CALL trc_sms_pisces_dmp( kt )  ! Relaxation of some tracers 
     69                                                                   CALL trc_sms_pisces_mass_conserv( kt ) ! Mass conservation checking 
    7970 
    8071      IF( ndayflxtr /= nday_year ) THEN      ! New days 
     
    8677         IF(lwp) write(numout,*) '~~~~~~' 
    8778 
    88          CALL p4z_che          ! computation of chemical constants 
    89          CALL p4z_int          ! computation of various rates for biogeochemistry 
     79         CALL p4z_che              ! computation of chemical constants 
     80         CALL p4z_int              ! computation of various rates for biogeochemistry 
    9081         ! 
    9182      ENDIF 
     
    109100      END DO 
    110101 
    111  
    112102      IF( l_trdtrc ) THEN 
    113103          DO jn = jp_pcs0, jp_pcs1 
    114             ztrpis(:,:,:) = tra(:,:,:,jn) 
    115             CALL trd_mod_trc( ztrpis, jn, jptra_trd_sms, kt )   ! save trends 
     104            CALL trd_mod_trc( tra(:,:,:,jn), jn, jptra_trd_sms, kt )   ! save trends 
    116105          END DO 
    117           DEALLOCATE( ztrpis ) 
    118106      END IF 
    119107 
     
    127115         ! 
    128116      ENDIF 
    129  
    130       IF( wrk_not_released(3,1) ) CALL ctl_stop('trc_sms_pisces : failed to release workspace array.')  
    131  
     117      ! 
     118      IF( nn_timing == 1 )  CALL timing_stop('trc_sms_pisces') 
     119      ! 
    132120   END SUBROUTINE trc_sms_pisces 
    133121 
    134    SUBROUTINE trc_sms_pisces_init 
     122   SUBROUTINE trc_sms_pisces_dmp( kt ) 
    135123      !!---------------------------------------------------------------------- 
    136       !!                  ***  ROUTINE trc_sms_pisces_init  *** 
    137       !! 
    138       !! ** Purpose :   Initialization of PH variable 
    139       !! 
     124      !!                    ***  trc_sms_pisces_dmp  *** 
     125      !! 
     126      !! ** purpose  : Relaxation of some tracers 
    140127      !!---------------------------------------------------------------------- 
    141       INTEGER  ::  ji, jj, jk 
    142       REAL(wp) ::  zcaralk, zbicarb, zco3 
    143       REAL(wp) ::  ztmas, ztmas1 
    144  
    145       IF( .NOT. ln_rsttr ) THEN 
    146          ! Initialization of chemical variables of the carbon cycle 
    147          ! -------------------------------------------------------- 
    148          DO jk = 1, jpk 
    149             DO jj = 1, jpj 
    150                DO ji = 1, jpi 
    151                   ztmas   = tmask(ji,jj,jk) 
    152                   ztmas1  = 1. - tmask(ji,jj,jk) 
    153                   zcaralk = trn(ji,jj,jk,jptal) - borat(ji,jj,jk) / (  1. + 1.E-8 / ( rtrn + akb3(ji,jj,jk) )  ) 
    154                   zco3    = ( zcaralk - trn(ji,jj,jk,jpdic) ) * ztmas + 0.5e-3 * ztmas1 
    155                   zbicarb = ( 2. * trn(ji,jj,jk,jpdic) - zcaralk ) 
    156                   hi(ji,jj,jk) = ( ak23(ji,jj,jk) * zbicarb / zco3 ) * ztmas + 1.e-9 * ztmas1 
    157                END DO 
    158             END DO 
    159          END DO 
    160          ! 
    161       END IF 
    162  
    163       ! Time step duration for biology 
    164       xstep = rfact2 / rday 
    165  
    166       CALL p4z_sink_init      ! vertical flux of particulate organic matter 
    167       CALL p4z_opt_init       ! Optic: PAR in the water column 
    168       CALL p4z_lim_init       ! co-limitations by the various nutrients 
    169       CALL p4z_prod_init      ! phytoplankton growth rate over the global ocean.  
    170       CALL p4z_rem_init       ! remineralisation 
    171       CALL p4z_mort_init      ! phytoplankton mortality 
    172       CALL p4z_micro_init     ! microzooplankton 
    173       CALL p4z_meso_init      ! mesozooplankton 
    174       CALL p4z_sed_init       ! sedimentation 
    175       CALL p4z_lys_init       ! calcite saturation 
    176       CALL p4z_flx_init       ! gas exchange 
    177  
    178       ndayflxtr = 0 
    179  
    180    END SUBROUTINE trc_sms_pisces_init 
     128      ! 
     129      INTEGER, INTENT( in )  ::     kt ! time step 
     130      ! 
     131      REAL(wp) ::  alkmean = 2426.     ! mean value of alkalinity ( Glodap ; for Goyet 2391. ) 
     132      REAL(wp) ::  po4mean = 2.165     ! mean value of phosphates 
     133      REAL(wp) ::  no3mean = 30.90     ! mean value of nitrate 
     134      REAL(wp) ::  silmean = 91.51     ! mean value of silicate 
     135      ! 
     136      REAL(wp) :: zarea, zalksum, zpo4sum, zno3sum, zsilsum 
     137      !!--------------------------------------------------------------------- 
     138 
     139 
     140      IF(lwp)  WRITE(numout,*) 
     141      IF(lwp)  WRITE(numout,*) ' trc_sms_pisces_dmp : Relaxation of nutrients at time-step kt = ', kt 
     142      IF(lwp)  WRITE(numout,*) 
     143 
     144      IF( cp_cfg == "orca" .AND. .NOT. lk_c1d ) THEN      ! ORCA condiguration (not 1D) ! 
     145         !                                                    ! --------------------------- ! 
     146         ! set total alkalinity, phosphate, nitrate & silicate 
     147         zarea          = 1._wp / glob_sum( cvol(:,:,:) ) * 1e6               
     148 
     149         zalksum = glob_sum( trn(:,:,:,jptal) * cvol(:,:,:)  ) * zarea 
     150         zpo4sum = glob_sum( trn(:,:,:,jppo4) * cvol(:,:,:)  ) * zarea / 122. 
     151         zno3sum = glob_sum( trn(:,:,:,jpno3) * cvol(:,:,:)  ) * zarea / 7.6 
     152         zsilsum = glob_sum( trn(:,:,:,jpsil) * cvol(:,:,:)  ) * zarea 
     153  
     154         IF(lwp) WRITE(numout,*) '       TALK mean : ', zalksum 
     155         trn(:,:,:,jptal) = trn(:,:,:,jptal) * alkmean / zalksum 
     156 
     157         IF(lwp) WRITE(numout,*) '       PO4  mean : ', zpo4sum 
     158         trn(:,:,:,jppo4) = trn(:,:,:,jppo4) * po4mean / zpo4sum 
     159 
     160         IF(lwp) WRITE(numout,*) '       NO3  mean : ', zno3sum 
     161         trn(:,:,:,jpno3) = trn(:,:,:,jpno3) * no3mean / zno3sum 
     162 
     163         IF(lwp) WRITE(numout,*) '       SiO3 mean : ', zsilsum 
     164         trn(:,:,:,jpsil) = MIN( 400.e-6,trn(:,:,:,jpsil) * silmean / zsilsum ) 
     165         ! 
     166      ENDIF 
     167 
     168   END SUBROUTINE trc_sms_pisces_dmp 
     169 
     170   SUBROUTINE trc_sms_pisces_mass_conserv ( kt ) 
     171      !!---------------------------------------------------------------------- 
     172      !!                  ***  ROUTINE trc_sms_pisces_mass_conserv  *** 
     173      !! 
     174      !! ** Purpose :  Mass conservation check  
     175      !! 
     176      !!--------------------------------------------------------------------- 
     177      ! 
     178      INTEGER, INTENT( in ) ::   kt      ! ocean time-step index       
     179      !! 
     180      REAL(wp) :: zalkbudget, zno3budget, zsilbudget 
     181      ! 
     182      NAMELIST/nampismass/ ln_check_mass 
     183      !!--------------------------------------------------------------------- 
     184 
     185      IF( kt == nittrc000 ) THEN  
     186         REWIND( numnatp )        
     187         READ  ( numnatp, nampismass ) 
     188         IF(lwp) THEN                         ! control print 
     189            WRITE(numout,*) ' ' 
     190            WRITE(numout,*) ' Namelist parameter for mass conservation checking' 
     191            WRITE(numout,*) ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~' 
     192            WRITE(numout,*) '    Flag to check mass conservation of NO3/Si/TALK ln_check_mass = ', ln_check_mass 
     193         ENDIF 
     194 
     195         IF( ln_check_mass .AND. lwp) THEN      !   Open budget file of NO3, ALK, Si 
     196            CALL ctl_opn( numno3, 'no3.budget' , 'REPLACE', 'FORMATTED', 'SEQUENTIAL', -1, 6, .FALSE., narea ) 
     197            CALL ctl_opn( numsil, 'sil.budget' , 'REPLACE', 'FORMATTED', 'SEQUENTIAL', -1, 6, .FALSE., narea ) 
     198            CALL ctl_opn( numalk, 'talk.budget', 'REPLACE', 'FORMATTED', 'SEQUENTIAL', -1, 6, .FALSE., narea ) 
     199         ENDIF 
     200      ENDIF 
     201 
     202      IF( ln_check_mass ) THEN      !   Compute the budget of NO3, ALK, Si 
     203         zno3budget = glob_sum( (   trn(:,:,:,jpno3) + trn(:,:,:,jpnh4)  & 
     204            &                     + trn(:,:,:,jpphy) + trn(:,:,:,jpdia)  & 
     205            &                     + trn(:,:,:,jpzoo) + trn(:,:,:,jpmes)  & 
     206            &                     + trn(:,:,:,jppoc) + trn(:,:,:,jpgoc)  & 
     207            &                     + trn(:,:,:,jpdoc)                     ) * cvol(:,:,:)  )  
     208         !  
     209         zsilbudget = glob_sum( (   trn(:,:,:,jpsil) + trn(:,:,:,jpdsi)  & 
     210            &                     + trn(:,:,:,jpbsi)                     ) * cvol(:,:,:)  ) 
     211         !  
     212         zalkbudget = glob_sum( (   trn(:,:,:,jpno3) * rno3              & 
     213            &                     + trn(:,:,:,jptal)                     & 
     214            &                     + trn(:,:,:,jpcal) * 2.                ) * cvol(:,:,:)  ) 
     215 
     216         IF( lwp ) THEN 
     217            WRITE(numno3,9500) kt,  zno3budget / areatot 
     218            WRITE(numsil,9500) kt,  zsilbudget / areatot 
     219            WRITE(numalk,9500) kt,  zalkbudget / areatot 
     220         ENDIF 
     221       ENDIF 
     222 9500  FORMAT(i10,e18.10)      
     223       ! 
     224   END SUBROUTINE trc_sms_pisces_mass_conserv 
    181225 
    182226#else 
Note: See TracChangeset for help on using the changeset viewer.