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.
diawri_dimg.h90 in branches/2012/dev_NOC_2012_rev3555/NEMOGCM/NEMO/OPA_SRC/DIA – NEMO

source: branches/2012/dev_NOC_2012_rev3555/NEMOGCM/NEMO/OPA_SRC/DIA/diawri_dimg.h90 @ 3649

Last change on this file since 3649 was 3625, checked in by acc, 12 years ago

Branch dev_NOC_2012_r3555. #1006. Step 7. Check in code now merged with dev_r3385_NOCS04_HAMF

  • Property svn:keywords set to Id
File size: 13.9 KB
RevLine 
[3]1  !!----------------------------------------------------------------------
[32]2  !!                        ***  diawri_dimg.h90  ***
[3]3  !!----------------------------------------------------------------------
[2528]4  !! NEMO/OPA 3.3 , NEMO Consortium (2010)
5  !! $Id $
6  !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
[3]7  !!----------------------------------------------------------------------
8
[2528]9  SUBROUTINE dia_wri( kt )
[3]10    !!----------------------------------------------------------------------
11    !!           *** routine dia_wri ***
12    !!
13    !! ** Purpose : output dynamics and tracer fields on direct access file
14    !!              suitable for MPP computing
15    !!
16    !! ** define key : 'key_dimgout'
17    !!
18    !! **  Method : Default is to cumulate the values over the interval between
19    !!      2 output, and each nwrite time-steps  the mean value is  computed
20    !!      and written to the direct access file.
21    !!     If 'key_diainstant' is defined, no mean values are computed and the
22    !!     instantaneous fields are dump.
23    !!       Each processor creates its own file with its local data
24    !!     Merging all the files is performed off line by a dedicated program
25    !!
26    !! ** Arguments :
27    !!     kt      : time-step number
28    !!     kindinc :  error condition indicator : >=0 :  OK, < 0 : error.
29    !!
30    !! ** Naming convention for files
31    !!
32    !! {cexper}_{var}_y----m--d--.dimg
33    !!   cexper is the name of the experience, given in the namelist
34    !!   var can be either U, V, T, S, KZ, SSH, ...
35    !!   var can also be 2D, which means that each level of the file is a 2D field as described below
36    !!    y----m--d--  is the date at the time of the dump
37    !!    For mpp output, each processor dumps its own memory, on appropriate record range
38    !!    (direct access : for level jk of a klev field on proc narea irec = 1+ klev*(narea -1) + jk )
39    !!    To be tested with a lot of procs !!!!
40    !!
[888]41    !!  level 1:  utau(:,:) * umask(:,:,1) zonal stress in N.m-2
42    !!  level 2:  vtau(:,:) * vmask(:,:,1) meridional stress in N. m-2
43    !!  level 3:  qsr + qns                total heat flux (W/m2)
[2528]44    !!  level 4:  ( emp (:,:)-rnf(:,:) )   E-P flux (mm/day)
[1106]45    !!  level 5:  tb  (:,:,1)-sst          model SST -forcing sst (degree C) ! deprecated
[405]46    !!  level 6:  bsfb(:,:)         streamfunction (m**3/s)
47    !!  level 7:  qsr (:,:)         solar flux (W/m2)
48    !!  level 8:  qrp (:,:)                relax component of T flux.
49    !!  level 9:  erp (:,:)                relax component of S flux
50    !!  level 10: hmld(:,:)                turbocline depth
51    !!  level 11: hmlp(:,:)                mixed layer depth
[1037]52    !!  level 12: fr_i(:,:)                ice fraction (between 0 and 1)
[1106]53    !!  level 13: sst(:,:)                 the observed SST we relax to. ! deprecated
[405]54    !!  level 14: qct(:,:)                 equivalent flux due to treshold SST
55    !!  level 15: fbt(:,:)                 feedback term .
[3625]56    !!  level 16: ( emp * sss )            concentration/dilution term on salinity
57    !!  level 17: ( emp * sst )            concentration/dilution term on temperature
[405]58    !!  level 17: fsalt(:,:)               Ice=>ocean net freshwater
59    !!  level 18: gps(:,:)                 the surface pressure (m).
60    !!  level 19: spgu(:,:)                the surface pressure gradient in X direction.
61    !!  level 20: spgv(:,:)                the surface pressure gradient in Y direction.
[3]62    !!
[2528]63    !! History:  OPA  ! 1997-02 ( Clipper Group ) dimg files
64    !!            -   ! 2003-12 ( J.M. Molines) f90, mpp output for OPA9.0
65    !!   NEMO    1.0  ! 2005-05  (S. Theetten) add emps fsalt move gps spgu spgv 2 lines below
66    !!            -   ! 2005-11  (V. Garnier) Surface pressure gradient organization
[3]67    !!----------------------------------------------------------------------
[32]68    USE lib_mpp
[2528]69    !!
[1567]70    INTEGER ,INTENT(in) :: kt
[2528]71    !!
[3]72#if defined key_diainstant
[182]73    LOGICAL, PARAMETER :: ll_dia_inst=.TRUE.  !: for instantaneous output
[3]74#else
[182]75    LOGICAL, PARAMETER :: ll_dia_inst=.FALSE. !: for average output
76#endif
[2715]77    INTEGER              , SAVE                    ::  nmoyct
78    REAL(wp), ALLOCATABLE, SAVE, DIMENSION (:,:,:) ::  um , vm, wm   ! mean u, v, w fields
79    REAL(wp), ALLOCATABLE, SAVE, DIMENSION (:,:,:) ::  avtm          ! mean kz fields
80    REAL(wp), ALLOCATABLE, SAVE, DIMENSION (:,:,:) ::  tm , sm       ! mean t, s fields
81    REAL(wp), ALLOCATABLE, SAVE, DIMENSION (:,:,:) ::  fsel          ! mean 2d fields
82   
83    INTEGER :: inbsel, jk
84    INTEGER :: iyear,imon,iday
[3294]85    INTEGER :: ialloc
[3]86    REAL(wp) :: zdtj
87    CHARACTER(LEN=80) :: clname
88    CHARACTER(LEN=80) :: cltext
89    CHARACTER(LEN=80) :: clmode
[32]90    CHARACTER(LEN= 4) :: clver
[2528]91    !!----------------------------------------------------------------------
[3294]92    IF( nn_timing == 1 )   CALL timing_start('dia_wri')
[3]93    !
94    !  Initialization
95    !  ---------------
96    !
[3294]97    IF( .NOT. ALLOCATED(um) )THEN
[2715]98       ALLOCATE(um(jpi,jpj,jpk), vm(jpi,jpj,jpk), &
99                wm(jpi,jpj,jpk),                  &
100                avtm(jpi,jpj,jpk),                &
101                tm(jpi,jpj,jpk), sm(jpi,jpj,jpk), &
102                fsel(jpi,jpj,jpk),                &
[3294]103                STAT=ialloc )
104       !
105       IF( lk_mpp      )   CALL mpp_sum ( ialloc  )
106       IF( ialloc /= 0 )   CALL ctl_warn('dia_wri( diawri_dimg.h90) : failed to allocate arrays')
107    ENDIF
[2715]108
[3294]109
[3625]110    inbsel = 18
[3]111
[2528]112    IF( inbsel >  jpk ) THEN
113       IF(lwp) WRITE(numout,*)  ' STOP inbsel =',inbsel,' is larger than jpk=',jpk
[3]114       STOP
[405]115    ENDIF
[3]116
117    iyear = ndastp/10000
118    imon = (ndastp-iyear*10000)/100
119    iday = ndastp - imon*100 - iyear*10000
120
121    !     
122    !! dimg format V1.0 should start with the 4 char. string '@!01'
123    !!
124    clver='@!01'
125    !
[405]126    IF( .NOT. ll_dia_inst ) THEN
[3]127       !
128       !! * Mean output section
129       !! ----------------------
130       !
[405]131       IF( kt == nit000 .AND. lwp ) WRITE(numout,*) &
[3]132            'THE OUTPUT FILES CONTAINS THE AVERAGE OF EACH FIELD'
133       !
[405]134       IF( kt == nit000  ) THEN
[3]135          ! reset arrays for average computation
136          nmoyct = 0
137          !
138          um(:,:,:) = 0._wp
139          vm(:,:,:) = 0._wp
[182]140          wm(:,:,:) = 0._wp
[405]141          avtm(:,:,:) = 0._wp
[3]142          tm(:,:,:) = 0._wp
143          sm(:,:,:) = 0._wp
144          fsel(:,:,:) = 0._wp
145          !
[405]146       ENDIF
[3]147
148       !  cumulate values
149       !  ---------------
150
151       nmoyct = nmoyct+1
152       !
153       um(:,:,:)=um(:,:,:) + un (:,:,:)
154       vm(:,:,:)=vm(:,:,:) + vn (:,:,:)
[182]155       wm(:,:,:)=wm(:,:,:) + wn (:,:,:)
[405]156       avtm(:,:,:)=avtm(:,:,:) + avt (:,:,:)
[3294]157       tm(:,:,:)=tm(:,:,:) + tsn(:,:,:,jp_tem)
158       sm(:,:,:)=sm(:,:,:) + tsn(:,:,:,jp_sal)
[3]159       !
[888]160       fsel(:,:,1 ) = fsel(:,:,1 ) + utau(:,:) * umask(:,:,1)
161       fsel(:,:,2 ) = fsel(:,:,2 ) + vtau(:,:) * vmask(:,:,1)
162       fsel(:,:,3 ) = fsel(:,:,3 ) + qsr (:,:) + qns  (:,:)
[2528]163       fsel(:,:,4 ) = fsel(:,:,4 ) + ( emp(:,:)-rnf(:,:) )
[3294]164       !        fsel(:,:,5 ) = fsel(:,:,5 ) + tsb(:,:,1,jp_tem)  !RB not used
[1528]165       fsel(:,:,6 ) = fsel(:,:,6 ) + sshn(:,:)
[3]166       fsel(:,:,7 ) = fsel(:,:,7 ) + qsr(:,:)
167       fsel(:,:,8 ) = fsel(:,:,8 ) + qrp (:,:)
168       fsel(:,:,9 ) = fsel(:,:,9 ) + erp (:,:)
169       fsel(:,:,10) = fsel(:,:,10) + hmld(:,:)
170       fsel(:,:,11) = fsel(:,:,11) + hmlp(:,:)
[1037]171       fsel(:,:,12) = fsel(:,:,12) + fr_i(:,:)
[1106]172       !        fsel(:,:,13) = fsel(:,:,13)   !RB not used
[3]173       !        fsel(:,:,14) = fsel(:,:,14) + qct(:,:)
174       !        fsel(:,:,15) = fsel(:,:,15) + fbt(:,:)
[3625]175       fsel(:,:,16) = fsel(:,:,16) + ( emp(:,:)*tsn(:,:,1,jp_sal) )
176       fsel(:,:,17) = fsel(:,:,17) + ( emp(:,:)*tsn(:,:,1,jp_tem) )
[3]177       !
[1685]178       ! Output of dynamics and tracer fields and selected fields
179       ! --------------------------------------------------------
[3]180       !
181       !
182       zdtj=rdt/86400.   ! time step in days
183       WRITE(clmode,'(f5.1,a)' ) nwrite*zdtj,' days average'
184
185       !       iwrite=NINT(adatrj/rwrite)
186       !      IF (abs(adatrj-iwrite*rwrite) < zdtj/2.      &
187
[405]188       IF(  ( MOD (kt-nit000+1,nwrite) ==  0 )          &
[1567]189            &   .OR. ( kt == 1 .AND. ninist ==1 )  ) THEN
[3]190          ! it is time to make a dump on file
191          ! compute average
192          um(:,:,:) = um(:,:,:) / nmoyct
193          vm(:,:,:) = vm(:,:,:) / nmoyct
[182]194          wm(:,:,:) = wm(:,:,:) / nmoyct
[405]195          avtm(:,:,:) = avtm(:,:,:) / nmoyct
[3]196          tm(:,:,:) = tm(:,:,:) / nmoyct
197          sm(:,:,:) = sm(:,:,:) / nmoyct
198          !
199          fsel(:,:,:) = fsel(:,:,:) / nmoyct
200          !
201          ! note : the surface pressure is not averaged, but rather
202          ! computed from the averaged gradients.
203          !
[888]204          ! mask mean field with tmask except utau vtau (1,2)
[632]205          DO jk=3,inbsel
206            fsel(:,:,jk)=fsel(:,:,jk)*tmask(:,:,1)
207          END DO
[3]208       ENDIF
209       !
[182]210    ELSE   ! ll_dia_inst true
[3]211       !
212       !! * Instantaneous output section
213       !! ------------------------------
214       !
[405]215       IF( kt == nit000 .AND. lwp ) WRITE(numout,*) &
[3]216            'THE OUTPUT FILES CONTAINS INSTANTANEOUS VALUES OF EACH FIELD'
217       !
218       zdtj=rdt/86400.   ! time step in days
219       !  iwrite=NINT(adatrj/rwrite)
220       clmode='instantaneous'
221       !     IF (abs(adatrj-iwrite*rwrite) < zdtj/2.  &
[182]222       IF (  ( MOD (kt-nit000+1,nwrite) ==  0 )          &
[1567]223            &   .OR. ( kt == 1 .AND. ninist == 1 )  ) THEN
[3]224          !
225          ! transfer wp arrays to sp arrays for dimg files
226          fsel(:,:,:) = 0._wp
227          !
[888]228          fsel(:,:,1 ) = utau(:,:) * umask(:,:,1)
229          fsel(:,:,2 ) = vtau(:,:) * vmask(:,:,1)
[1057]230          fsel(:,:,3 ) = (qsr (:,:) + qns (:,:)) * tmask(:,:,1)
[2528]231          fsel(:,:,4 ) = ( emp(:,:)-rnf(:,:) ) * tmask(:,:,1)
[3294]232          !         fsel(:,:,5 ) = (tsb(:,:,1,jp_tem) - sf_sst(1)%fnow(:,:) ) *tmask(:,:,1) !RB not used
[3]233
234          fsel(:,:,6 ) = sshn(:,:)
[632]235          fsel(:,:,7 ) = qsr (:,:) * tmask(:,:,1)
236          fsel(:,:,8 ) = qrp (:,:) * tmask(:,:,1)
237          fsel(:,:,9 ) = erp (:,:) * tmask(:,:,1)
238          fsel(:,:,10) = hmld(:,:) * tmask(:,:,1)
239          fsel(:,:,11) = hmlp(:,:) * tmask(:,:,1)
[1037]240          fsel(:,:,12) = fr_i(:,:) * tmask(:,:,1)
[1106]241          !         fsel(:,:,13) = sf_sst(1)%fnow(:,:) !RB not used
[3]242          !         fsel(:,:,14) =  qct(:,:)
243          !         fsel(:,:,15) =  fbt(:,:)
[3625]244          fsel(:,:,16) = ( emp(:,:)-tsn(:,:,1,jp_sal) ) * tmask(:,:,1)
245          fsel(:,:,17) = ( emp(:,:)-tsn(:,:,1,jp_tem) ) * tmask(:,:,1)
[3]246          !
247          !         qct(:,:) = 0._wp
248       ENDIF
249    ENDIF
250    !
251    ! Opening of the datrj.out file with the absolute time in day of each dump
252    ! this file gives a record of the dump date for post processing ( ASCII file )
253    !
[405]254    IF(  ( MOD (kt-nit000+1,nwrite) ==  0 )          &
[1567]255         &   .OR. ( kt == 1 .AND. ninist == 1 )  ) THEN
[3]256
[405]257       IF( lwp) WRITE(numout,*)'Days since the begining of the run :',adatrj
[3]258
259       !! * U section
260
261       WRITE(clname,9000) TRIM(cexper),'U',iyear,imon,iday
262       cltext=TRIM(cexper)//' U(m/s) '//TRIM(clmode)
263       !
[2715]264       IF( ll_dia_inst) THEN   ;   CALL dia_wri_dimg(clname, cltext, un, jpk, 'T')
265       ELSE                    ;   CALL dia_wri_dimg(clname, cltext, um, jpk, 'T')
[3]266       ENDIF
267
268       !! * V section
269
270       WRITE(clname,9000) TRIM(cexper),'V',iyear,imon,iday
271       cltext=TRIM(cexper)//' V(m/s) '//TRIM(clmode)
272       !
[405]273       IF( ll_dia_inst) THEN
[3]274          CALL dia_wri_dimg(clname, cltext, vn, jpk, 'T')
275       ELSE
276          CALL dia_wri_dimg(clname, cltext, vm, jpk, 'T')
[405]277       ENDIF
[3]278       !
279
280       !! * KZ section
281
282       WRITE(clname,9000) TRIM(cexper),'KZ',iyear,imon,iday
[405]283       cltext=TRIM(cexper)//' KZ(m2/s) '//TRIM(clmode)
[3]284
[405]285       IF( ll_dia_inst) THEN
286          CALL dia_wri_dimg(clname, cltext, avt, jpk, 'W')
287       ELSE
288          CALL dia_wri_dimg(clname, cltext, avtm, jpk, 'W')
289       ENDIF
[3]290       !
291
[182]292       !! * W section
293
294       WRITE(clname,9000) TRIM(cexper),'W',iyear,imon,iday
295       cltext=TRIM(cexper)//' W(m/s) '//TRIM(clmode)
296
[405]297       IF( ll_dia_inst) THEN
[182]298          CALL dia_wri_dimg(clname, cltext, wn, jpk, 'W')
299       ELSE
300          CALL dia_wri_dimg(clname, cltext, wm, jpk, 'W')
[405]301       ENDIF
[182]302
[3]303       !! * T section
304
305       WRITE(clname,9000) TRIM(cexper),'T',iyear,imon,iday
306       cltext=TRIM(cexper)//' T (DegC) '//TRIM(clmode)
307
[405]308       IF( ll_dia_inst) THEN
[3294]309          CALL dia_wri_dimg(clname, cltext, tsn(:,:,:,jp_tem), jpk, 'T')
[3]310       ELSE
[3294]311          CALL dia_wri_dimg(clname, cltext, tm               , jpk, 'T')
[405]312       ENDIF
[3]313       !
314
315       !! * S section
316
317       WRITE(clname,9000) TRIM(cexper),'S',iyear,imon,iday
318       cltext=TRIM(cexper)//' S (PSU) '//TRIM(clmode)
319
[405]320       IF( ll_dia_inst) THEN
[3294]321          CALL dia_wri_dimg(clname, cltext, tsn(:,:,:,jp_sal), jpk, 'T')
[3]322       ELSE
[3294]323          CALL dia_wri_dimg(clname, cltext, sm               , jpk, 'T')
[405]324       ENDIF
[3]325       !
326
327       !! * 2D section
328
329       WRITE(clname,9000) TRIM(cexper),'2D',iyear,imon,iday
330       cltext='2D fields '//TRIM(clmode)
331
[405]332       IF( ll_dia_inst) THEN
[3]333          CALL dia_wri_dimg(clname, cltext, fsel, inbsel, '2')
334       ELSE
335          CALL dia_wri_dimg(clname, cltext, fsel, inbsel, '2')
336       ENDIF
337
[32]338       IF( lk_mpp )   CALL mppsync   ! synchronization in mpp
[3]339
340       !! * Log message in numout
341
[405]342       IF( lwp)WRITE(numout,*) ' '
[1685]343       IF( lwp)WRITE(numout,*) ' **** WRITE in dimg file ',kt
[3]344
[405]345       IF( lwp .AND.        ll_dia_inst) WRITE(numout,*) '    instantaneous fields'
346       IF( lwp .AND. .NOT.  ll_dia_inst) WRITE(numout,*) '    average fields with ',nmoyct,'pdt'
[3]347       !
348       !
349       !! * Reset cumulating arrays  and counter to 0 after writing
350       !
[405]351       IF( .NOT. ll_dia_inst ) THEN
[3]352          nmoyct = 0
353          !
354          um(:,:,:) = 0._wp
355          vm(:,:,:) = 0._wp
[574]356          wm(:,:,:) = 0._wp
[3]357          tm(:,:,:) = 0._wp
358          sm(:,:,:) = 0._wp
359          fsel(:,:,:) = 0._wp
[480]360          avtm(:,:,:) = 0._wp
[3]361       ENDIF
[405]362    ENDIF
[3]363    !
[3294]364    IF( nn_timing == 1 )   CALL timing_stop('dia_wri')
365    !
[3]3669000 FORMAT(a,"_",a,"_y",i4.4,"m",i2.2,"d",i2.2,".dimgproc")
[2528]367    !
[3]368  END SUBROUTINE dia_wri
Note: See TracBrowser for help on using the repository browser.