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 6762 for branches/UKMO/dev_r5518_25hr_mean_assim_bkg/NEMOGCM/NEMO/OPA_SRC/ASM/asmbkg.F90 – NEMO

Ignore:
Timestamp:
2016-06-30T15:45:10+02:00 (8 years ago)
Author:
kingr
Message:

Added code to asmbkg.F90 and asminc.F90 to allow writing of average fields (over namelist-specified window) into assimilation background file.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/UKMO/dev_r5518_25hr_mean_assim_bkg/NEMOGCM/NEMO/OPA_SRC/ASM/asmbkg.F90

    r6761 r6762  
    5050   USE ice 
    5151#endif 
     52   USE asminc, ONLY: ln_avgbkg 
    5253   IMPLICIT NONE 
    5354   PRIVATE 
    5455    
    5556   PUBLIC   asm_bkg_wri   !: Write out the background state 
     57 
     58  !! * variables for calculating time means 
     59   REAL(wp),SAVE, ALLOCATABLE,   DIMENSION(:,:,:) ::   tn_tavg  , sn_tavg   
     60   REAL(wp),SAVE, ALLOCATABLE,   DIMENSION(:,:,:) ::   un_tavg  , vn_tavg 
     61   REAL(wp),SAVE, ALLOCATABLE,   DIMENSION(:,:,:) ::   avt_tavg 
     62#if defined key_zdfgls || key_zdftke 
     63   REAL(wp),SAVE, ALLOCATABLE,   DIMENSION(:,:,:) ::   en_tavg 
     64#endif 
     65   REAL(wp),SAVE, ALLOCATABLE,   DIMENSION(:,:)   ::   sshn_tavg 
     66   REAL(wp),SAVE :: gcx_tavg 
     67   REAL(wp),SAVE :: numtimes_tavg     ! No of times to average over 
    5668 
    5769   !!---------------------------------------------------------------------- 
     
    8395      !!----------------------------------------------------------------------- 
    8496 
    85       !                                !------------------------------------------- 
    86       IF( kt == nitbkg_r ) THEN        ! Write out background at time step nitbkg_r 
    87          !                             !-----------------------------------======== 
     97 
     98      ! If creating an averaged assim bkg, initialise on first timestep 
     99      IF ( ln_avgbkg .AND. kt == ( nn_it000 - 1) ) THEN 
     100         ! Allocate memory  
     101         ALLOCATE( tn_tavg(jpi,jpj,jpk), STAT=ierror ) 
     102         IF( ierror > 0 ) THEN 
     103            CALL ctl_stop( 'asm_wri_bkg: unable to allocate tn_tavg' )   ;   RETURN 
     104         ENDIF 
     105         tn_tavg=0 
     106         ALLOCATE( sn_tavg(jpi,jpj,jpk), STAT=ierror ) 
     107         IF( ierror > 0 ) THEN 
     108            CALL ctl_stop( 'asm_wri_bkg: unable to allocate sn_tavg' )   ;   RETURN 
     109         ENDIF 
     110         sn_tavg=0 
     111         ALLOCATE( un_tavg(jpi,jpj,jpk), STAT=ierror ) 
     112         IF( ierror > 0 ) THEN 
     113            CALL ctl_stop( 'asm_wri_bkg: unable to allocate un_tavg' )   ;   RETURN 
     114         ENDIF 
     115         un_tavg=0 
     116         ALLOCATE( vn_tavg(jpi,jpj,jpk), STAT=ierror ) 
     117         IF( ierror > 0 ) THEN 
     118            CALL ctl_stop( 'asm_wri_bkg: unable to allocate vn_tavg' )   ;   RETURN 
     119         ENDIF 
     120         vn_tavg=0 
     121         ALLOCATE( ssh_tavg(jpi,jpj), STAT=ierror ) 
     122         IF( ierror > 0 ) THEN 
     123            CALL ctl_stop( 'asm_wri_bkg: unable to allocate ssh_tavg' )   ;   RETURN 
     124         ENDIF 
     125         ssh_tavg=0 
     126         ALLOCATE( en_tavg(jpi,jpj,jpk), STAT=ierror ) 
     127         IF( ierror > 0 ) THEN 
     128            CALL ctl_stop( 'asm_wri_bkg: unable to allocate en_tavg' )   ;   RETURN 
     129         ENDIF 
     130         en_tavg=0 
     131         ALLOCATE( avt_tavg(jpi,jpj,jpk), STAT=ierror ) 
     132         IF( ierror > 0 ) THEN 
     133            CALL ctl_stop( 'asm_wri_bkg: unable to allocate avt_tavg' )   ;   RETURN 
     134         ENDIF 
     135         avt_tavg=0 
     136         gcx_tavg=0     
     137          
     138         numtimes_tavg = REAL ( nitavgbkg_r -  nn_it000 + 1 ) 
     139      ENDIF    
     140 
     141      ! If creating an averaged assim bkg, sum the contribution every timestep 
     142      IF ( ln_avgbkg ) THEN  
     143         IF (lwp) THEN 
     144              WRITE(numout,*) 'asm_wri_bkg : Summing assim bkg fields at timestep ',kt 
     145              WRITE(numout,*) '~~~~~~~~~~~~ ' 
     146         ENDIF 
     147 
     148         tn_tavg(:,:,:)        = tn_tavg(:,:,:) + tsn(:,:,:,jp_tem) / numtimes_tavg 
     149         sn_tavg(:,:,:)        = sn_tavg(:,:,:) + tsn(:,:,:,jp_sal) / numtimes_tavg 
     150         sshn_tavg(:,:)        = sshn_tavg(:,:) + sshn (:,:) / numtimes_tavg 
     151         un_tavg(:,:,:)        = un_tavg(:,:,:) + un(:,:,:) / numtimes_tavg 
     152         vn_tavg(:,:,:)        = vn_tavg(:,:,:) + vn(:,:,:) / numtimes_tavg 
     153         gcx_tavg              = gcx_tavg       + gcx / numtimes_tavg 
     154         avt_tavg(:,:,:)        = avt_tavg(:,:,:) + avt(:,:,:) / numtimes_tavg 
     155#if defined key_zdftke 
     156         en_tavg(:,:,:)       = en_tavg(:,:,:) + en(:,:,:) / numtimes_tavg 
     157#endif 
     158      ENDIF 
     159      
     160 
     161      ! Write out background at time step nitbkg_r or nitavgbkg_r 
     162      IF( .NOT. ln_avgbkg .AND. (kt == nitbkg_r) ) .OR. & 
     163      &       ( ln_avgbkg .AND. (kt == nitavgbkg_r) ) THEN 
    88164         ! 
    89165         WRITE(cl_asmbkg, FMT='(A,".nc")' ) TRIM( c_asmbkg ) 
     
    109185            ENDIF 
    110186            ! 
    111             !                                      ! Write the information 
    112             CALL iom_rstput( kt, nitbkg_r, inum, 'rdastp' , zdate             ) 
    113             CALL iom_rstput( kt, nitbkg_r, inum, 'un'     , un                ) 
    114             CALL iom_rstput( kt, nitbkg_r, inum, 'vn'     , vn                ) 
    115             CALL iom_rstput( kt, nitbkg_r, inum, 'tn'     , tsn(:,:,:,jp_tem) ) 
    116             CALL iom_rstput( kt, nitbkg_r, inum, 'sn'     , tsn(:,:,:,jp_sal) ) 
    117             CALL iom_rstput( kt, nitbkg_r, inum, 'sshn'   , sshn              ) 
    118 #if defined key_zdftke 
    119             CALL iom_rstput( kt, nitbkg_r, inum, 'en'     , en                ) 
    120 #endif 
    121             CALL iom_rstput( kt, nitbkg_r, inum, 'gcx'    , gcx               ) 
    122             CALL iom_rstput( kt, nitbkg_r, inum, 'avt'    , avt               ) 
    123             ! 
     187            ! Write the information 
     188            CALL iom_rstput( kt, nitbkg_r, inum, 'rdastp' , zdate   ) 
     189             
     190            IF ( ln_avgbkg ) THEN 
     191               CALL iom_rstput( kt, nitbkg_r, inum, 'un'     , un_tavg ) 
     192               CALL iom_rstput( kt, nitbkg_r, inum, 'vn'     , vn_tavg ) 
     193               CALL iom_rstput( kt, nitbkg_r, inum, 'tn'     , tn_tavg ) 
     194               CALL iom_rstput( kt, nitbkg_r, inum, 'sn'     , sn_tavg ) 
     195               CALL iom_rstput( kt, nitbkg_r, inum, 'sshn'   , sshn    ) 
     196#if defined key_zdftke 
     197               CALL iom_rstput( kt, nitbkg_r, inum, 'en'     , en_tavg ) 
     198#endif 
     199               CALL iom_rstput( kt, nitbkg_r, inum, 'gcx'    , gcx_tavg) 
     200               CALL iom_rstput( kt, nitbkg_r, inum, 'avt'    , avt_tavg) 
     201               ! 
     202            ELSE 
     203               CALL iom_rstput( kt, nitbkg_r, inum, 'un'     , un                ) 
     204               CALL iom_rstput( kt, nitbkg_r, inum, 'vn'     , vn                ) 
     205               CALL iom_rstput( kt, nitbkg_r, inum, 'tn'     , tsn(:,:,:,jp_tem) ) 
     206               CALL iom_rstput( kt, nitbkg_r, inum, 'sn'     , tsn(:,:,:,jp_sal) ) 
     207               CALL iom_rstput( kt, nitbkg_r, inum, 'sshn'   , sshn              ) 
     208#if defined key_zdftke 
     209               CALL iom_rstput( kt, nitbkg_r, inum, 'en'     , en                ) 
     210#endif 
     211               CALL iom_rstput( kt, nitbkg_r, inum, 'gcx'    , gcx               ) 
     212               CALL iom_rstput( kt, nitbkg_r, inum, 'avt'    , avt               ) 
     213               ! 
     214            ENDIF 
     215             
    124216            CALL iom_close( inum ) 
     217 
    125218         ENDIF 
    126219         ! 
Note: See TracChangeset for help on using the changeset viewer.