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.
dtatsd.F90 in NEMO/branches/2020/dev_r13383_HPC-02_Daley_Tiling/src/OCE/DOM – NEMO

source: NEMO/branches/2020/dev_r13383_HPC-02_Daley_Tiling/src/OCE/DOM/dtatsd.F90 @ 13518

Last change on this file since 13518 was 13518, checked in by hadcv, 4 years ago

Tiling for modules before tra_adv

  • Property svn:keywords set to Id
File size: 13.8 KB
Line 
1MODULE dtatsd
2   !!======================================================================
3   !!                     ***  MODULE  dtatsd  ***
4   !! Ocean data  :  read ocean Temperature & Salinity Data from gridded data
5   !!======================================================================
6   !! History :  OPA  ! 1991-03  ()  Original code
7   !!             -   ! 1992-07  (M. Imbard)
8   !!            8.0  ! 1999-10  (M.A. Foujols, M. Imbard)  NetCDF FORMAT
9   !!   NEMO     1.0  ! 2002-06  (G. Madec)  F90: Free form and module
10   !!            3.3  ! 2010-10  (C. Bricaud, S. Masson)  use of fldread
11   !!            3.4  ! 2010-11  (G. Madec, C. Ethe) Merge of dtatem and dtasal + remove CPP keys
12   !!----------------------------------------------------------------------
13
14   !!----------------------------------------------------------------------
15   !!   dta_tsd      : read and time interpolated ocean Temperature & Salinity Data
16   !!----------------------------------------------------------------------
17   USE oce             ! ocean dynamics and tracers
18   USE phycst          ! physical constants
19   USE dom_oce         ! ocean space and time domain
20   USE domain, ONLY : dom_tile
21   USE fldread         ! read input fields
22   !
23   USE in_out_manager  ! I/O manager
24   USE lib_mpp         ! MPP library
25
26   IMPLICIT NONE
27   PRIVATE
28
29   PUBLIC   dta_tsd_init   ! called by opa.F90
30   PUBLIC   dta_tsd        ! called by istate.F90 and tradmp.90
31
32   !                                  !!* namtsd  namelist : Temperature & Salinity Data *
33   LOGICAL , PUBLIC ::   ln_tsd_init   !: T & S data flag
34   LOGICAL , PUBLIC ::   ln_tsd_dmp    !: internal damping toward input data flag
35
36   TYPE(FLD), ALLOCATABLE, DIMENSION(:) ::   sf_tsd   ! structure of input SST (file informations, fields read)
37
38   !! * Substitutions
39#  include "do_loop_substitute.h90"
40   !!----------------------------------------------------------------------
41   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
42   !! $Id$
43   !! Software governed by the CeCILL license (see ./LICENSE)
44   !!----------------------------------------------------------------------
45CONTAINS
46
47   SUBROUTINE dta_tsd_init( ld_tradmp )
48      !!----------------------------------------------------------------------
49      !!                   ***  ROUTINE dta_tsd_init  ***
50      !!                   
51      !! ** Purpose :   initialisation of T & S input data
52      !!
53      !! ** Method  : - Read namtsd namelist
54      !!              - allocates T & S data structure
55      !!----------------------------------------------------------------------
56      LOGICAL, INTENT(in), OPTIONAL ::   ld_tradmp   ! force the initialization when tradp is used
57      !
58      INTEGER ::   ios, ierr0, ierr1, ierr2, ierr3   ! local integers
59      !!
60      CHARACTER(len=100)            ::   cn_dir          ! Root directory for location of ssr files
61      TYPE(FLD_N), DIMENSION( jpts) ::   slf_i           ! array of namelist informations on the fields to read
62      TYPE(FLD_N)                   ::   sn_tem, sn_sal
63      !!
64      NAMELIST/namtsd/   ln_tsd_init, ln_tsd_dmp, cn_dir, sn_tem, sn_sal
65      !!----------------------------------------------------------------------
66      !
67      !  Initialisation
68      ierr0 = 0  ;  ierr1 = 0  ;  ierr2 = 0  ;  ierr3 = 0
69      !
70      READ  ( numnam_ref, namtsd, IOSTAT = ios, ERR = 901)
71901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namtsd in reference namelist' )
72      READ  ( numnam_cfg, namtsd, IOSTAT = ios, ERR = 902 )
73902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namtsd in configuration namelist' )
74      IF(lwm) WRITE ( numond, namtsd )
75
76      IF( PRESENT( ld_tradmp ) )   ln_tsd_dmp = .TRUE.     ! forces the initialization when tradmp is used
77     
78      IF(lwp) THEN                  ! control print
79         WRITE(numout,*)
80         WRITE(numout,*) 'dta_tsd_init : Temperature & Salinity data '
81         WRITE(numout,*) '~~~~~~~~~~~~ '
82         WRITE(numout,*) '   Namelist namtsd'
83         WRITE(numout,*) '      Initialisation of ocean T & S with T &S input data   ln_tsd_init = ', ln_tsd_init
84         WRITE(numout,*) '      damping of ocean T & S toward T &S input data        ln_tsd_dmp  = ', ln_tsd_dmp
85         WRITE(numout,*)
86         IF( .NOT.ln_tsd_init .AND. .NOT.ln_tsd_dmp ) THEN
87            WRITE(numout,*)
88            WRITE(numout,*) '   ===>>   T & S data not used'
89         ENDIF
90      ENDIF
91      !
92      IF( ln_rstart .AND. ln_tsd_init ) THEN
93         CALL ctl_warn( 'dta_tsd_init: ocean restart and T & S data intialisation, ',   &
94            &           'we keep the restart T & S values and set ln_tsd_init to FALSE' )
95         ln_tsd_init = .FALSE.
96      ENDIF
97      !
98      !                             ! allocate the arrays (if necessary)
99      IF( ln_tsd_init .OR. ln_tsd_dmp ) THEN
100         !
101         ALLOCATE( sf_tsd(jpts), STAT=ierr0 )
102         IF( ierr0 > 0 ) THEN
103            CALL ctl_stop( 'dta_tsd_init: unable to allocate sf_tsd structure' )   ;   RETURN
104         ENDIF
105         !
106                                ALLOCATE( sf_tsd(jp_tem)%fnow(jpi,jpj,jpk)   , STAT=ierr0 )
107         IF( sn_tem%ln_tint )   ALLOCATE( sf_tsd(jp_tem)%fdta(jpi,jpj,jpk,2) , STAT=ierr1 )
108                                ALLOCATE( sf_tsd(jp_sal)%fnow(jpi,jpj,jpk)   , STAT=ierr2 )
109         IF( sn_sal%ln_tint )   ALLOCATE( sf_tsd(jp_sal)%fdta(jpi,jpj,jpk,2) , STAT=ierr3 )
110         !
111         IF( ierr0 + ierr1 + ierr2 + ierr3 > 0 ) THEN
112            CALL ctl_stop( 'dta_tsd : unable to allocate T & S data arrays' )   ;   RETURN
113         ENDIF
114         !                         ! fill sf_tsd with sn_tem & sn_sal and control print
115         slf_i(jp_tem) = sn_tem   ;   slf_i(jp_sal) = sn_sal
116         CALL fld_fill( sf_tsd, slf_i, cn_dir, 'dta_tsd', 'Temperature & Salinity data', 'namtsd', no_print )
117         !
118      ENDIF
119      !
120   END SUBROUTINE dta_tsd_init
121
122
123   SUBROUTINE dta_tsd( kt, ptsd )
124      !!----------------------------------------------------------------------
125      !!                   ***  ROUTINE dta_tsd  ***
126      !!                   
127      !! ** Purpose :   provides T and S data at kt
128      !!
129      !! ** Method  : - call fldread routine
130      !!              - ORCA_R2: add some hand made alteration to read data 
131      !!              - 'key_orca_lev10' interpolates on 10 times more levels
132      !!              - s- or mixed z-s coordinate: vertical interpolation on model mesh
133      !!              - ln_tsd_dmp=F: deallocates the T-S data structure
134      !!                as T-S data are no are used
135      !!
136      !! ** Action  :   ptsd   T-S data on medl mesh and interpolated at time-step kt
137      !!----------------------------------------------------------------------
138      INTEGER                          , INTENT(in   ) ::   kt     ! ocean time-step
139      REAL(wp), DIMENSION(ST_2D(nn_hls),jpk,jpts), INTENT(  out) ::   ptsd   ! T & S data
140      !
141      INTEGER ::   ji, jj, jk, jl, jkk   ! dummy loop indicies
142      INTEGER ::   ik, il0, il1, ii0, ii1, ij0, ij1   ! local integers
143      REAL(wp)::   zl, zi                             ! local scalars
144      REAL(wp), DIMENSION(jpk) ::  ztp, zsp   ! 1D workspace
145      !!----------------------------------------------------------------------
146      !
147      IF( ntile == 0 .OR. ntile == 1 )  THEN                                         ! Do only for the full domain
148         IF( ln_tile ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = 0 )            ! Use full domain
149            CALL fld_read( kt, 1, sf_tsd )   !==   read T & S data at kt time step   ==!
150      !
151      !
152!!gm  This should be removed from the code   ===>>>>  T & S files has to be changed
153         !
154         !                                   !==   ORCA_R2 configuration and T & S damping   ==!
155         ! TODO: NOT TESTED- requires orca2
156         IF( cn_cfg == "orca" .OR. cn_cfg == "ORCA" ) THEN
157            IF( nn_cfg == 2 .AND. ln_tsd_dmp ) THEN    ! some hand made alterations
158               !
159               ij0 = 101 + nn_hls       ;   ij1 = 109 + nn_hls                       ! Reduced T & S in the Alboran Sea
160               ii0 = 141 + nn_hls - 1   ;   ii1 = 155 + nn_hls - 1
161               DO jj = mj0(ij0), mj1(ij1)
162                  DO ji = mi0(ii0), mi1(ii1)
163                     sf_tsd(jp_tem)%fnow(ji,jj,13:13) = sf_tsd(jp_tem)%fnow(ji,jj,13:13) - 0.20_wp
164                     sf_tsd(jp_tem)%fnow(ji,jj,14:15) = sf_tsd(jp_tem)%fnow(ji,jj,14:15) - 0.35_wp
165                     sf_tsd(jp_tem)%fnow(ji,jj,16:25) = sf_tsd(jp_tem)%fnow(ji,jj,16:25) - 0.40_wp
166                     !
167                     sf_tsd(jp_sal)%fnow(ji,jj,13:13) = sf_tsd(jp_sal)%fnow(ji,jj,13:13) - 0.15_wp
168                     sf_tsd(jp_sal)%fnow(ji,jj,14:15) = sf_tsd(jp_sal)%fnow(ji,jj,14:15) - 0.25_wp
169                     sf_tsd(jp_sal)%fnow(ji,jj,16:17) = sf_tsd(jp_sal)%fnow(ji,jj,16:17) - 0.30_wp
170                     sf_tsd(jp_sal)%fnow(ji,jj,18:25) = sf_tsd(jp_sal)%fnow(ji,jj,18:25) - 0.35_wp
171                  END DO
172               END DO
173               ij0 =  87 + nn_hls       ;   ij1 =  96 + nn_hls                       ! Reduced temperature in Red Sea
174               ii0 = 148 + nn_hls - 1   ;   ii1 = 160 + nn_hls - 1
175               sf_tsd(jp_tem)%fnow( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ,  4:10 ) = 7.0_wp
176               sf_tsd(jp_tem)%fnow( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 11:13 ) = 6.5_wp
177               sf_tsd(jp_tem)%fnow( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 14:20 ) = 6.0_wp
178            ENDIF
179         ENDIF
180!!gm end
181         IF( ln_tile ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = 1 )            ! Revert to tile domain
182      ENDIF
183      !
184      DO_3D( 0, 0, 0, 0, 1, jpk )
185         ptsd(ji,jj,jk,jp_tem) = sf_tsd(jp_tem)%fnow(ji,jj,jk)    ! NO mask
186         ptsd(ji,jj,jk,jp_sal) = sf_tsd(jp_sal)%fnow(ji,jj,jk)
187      END_3D
188      !
189      IF( ln_sco ) THEN                   !==   s- or mixed s-zps-coordinate   ==!
190         !
191         IF( ntile == 0 .OR. ntile == 1 )  THEN                       ! Do only on the first tile
192            IF( kt == nit000 .AND. lwp )THEN
193               WRITE(numout,*)
194               WRITE(numout,*) 'dta_tsd: interpolates T & S data onto the s- or mixed s-z-coordinate mesh'
195            ENDIF
196         ENDIF
197         !
198         DO_2D( 1, 1, 1, 1 )
199            DO jk = 1, jpk                        ! determines the intepolated T-S profiles at each (i,j) points
200               zl = gdept_0(ji,jj,jk)
201               IF(     zl < gdept_1d(1  ) ) THEN          ! above the first level of data
202                  ztp(jk) =  ptsd(ji,jj,1    ,jp_tem)
203                  zsp(jk) =  ptsd(ji,jj,1    ,jp_sal)
204               ELSEIF( zl > gdept_1d(jpk) ) THEN          ! below the last level of data
205                  ztp(jk) =  ptsd(ji,jj,jpkm1,jp_tem)
206                  zsp(jk) =  ptsd(ji,jj,jpkm1,jp_sal)
207               ELSE                                      ! inbetween : vertical interpolation between jkk & jkk+1
208                  DO jkk = 1, jpkm1                                  ! when  gdept(jkk) < zl < gdept(jkk+1)
209                     IF( (zl-gdept_1d(jkk)) * (zl-gdept_1d(jkk+1)) <= 0._wp ) THEN
210                        zi = ( zl - gdept_1d(jkk) ) / (gdept_1d(jkk+1)-gdept_1d(jkk))
211                        ztp(jk) = ptsd(ji,jj,jkk,jp_tem) + ( ptsd(ji,jj,jkk+1,jp_tem) - ptsd(ji,jj,jkk,jp_tem) ) * zi 
212                        zsp(jk) = ptsd(ji,jj,jkk,jp_sal) + ( ptsd(ji,jj,jkk+1,jp_sal) - ptsd(ji,jj,jkk,jp_sal) ) * zi
213                     ENDIF
214                  END DO
215               ENDIF
216            END DO
217            DO jk = 1, jpkm1
218               ptsd(ji,jj,jk,jp_tem) = ztp(jk) * tmask(ji,jj,jk)     ! mask required for mixed zps-s-coord
219               ptsd(ji,jj,jk,jp_sal) = zsp(jk) * tmask(ji,jj,jk)
220            END DO
221            ptsd(ji,jj,jpk,jp_tem) = 0._wp
222            ptsd(ji,jj,jpk,jp_sal) = 0._wp
223         END_2D
224         !
225      ELSE                                !==   z- or zps- coordinate   ==!
226         !                             
227         DO_3D( 0, 0, 0, 0, 1, jpk )
228            ptsd(ji,jj,jk,jp_tem) = ptsd(ji,jj,jk,jp_tem) * tmask(ji,jj,jk)    ! Mask
229            ptsd(ji,jj,jk,jp_sal) = ptsd(ji,jj,jk,jp_sal) * tmask(ji,jj,jk)
230         END_3D
231         !
232         ! TODO: NOT TESTED- requires zps
233         IF( ln_zps ) THEN                      ! zps-coordinate (partial steps) interpolation at the last ocean level
234            DO_2D( 1, 1, 1, 1 )
235               ik = mbkt(ji,jj) 
236               IF( ik > 1 ) THEN
237                  zl = ( gdept_1d(ik) - gdept_0(ji,jj,ik) ) / ( gdept_1d(ik) - gdept_1d(ik-1) )
238                  ptsd(ji,jj,ik,jp_tem) = (1.-zl) * ptsd(ji,jj,ik,jp_tem) + zl * ptsd(ji,jj,ik-1,jp_tem)
239                  ptsd(ji,jj,ik,jp_sal) = (1.-zl) * ptsd(ji,jj,ik,jp_sal) + zl * ptsd(ji,jj,ik-1,jp_sal)
240               ENDIF
241               ik = mikt(ji,jj)
242               IF( ik > 1 ) THEN
243                  zl = ( gdept_0(ji,jj,ik) - gdept_1d(ik) ) / ( gdept_1d(ik+1) - gdept_1d(ik) ) 
244                  ptsd(ji,jj,ik,jp_tem) = (1.-zl) * ptsd(ji,jj,ik,jp_tem) + zl * ptsd(ji,jj,ik+1,jp_tem)
245                  ptsd(ji,jj,ik,jp_sal) = (1.-zl) * ptsd(ji,jj,ik,jp_sal) + zl * ptsd(ji,jj,ik+1,jp_sal)
246               END IF
247            END_2D
248         ENDIF
249         !
250      ENDIF
251      !
252      IF( .NOT.ln_tsd_dmp ) THEN                   !==   deallocate T & S structure   ==!
253         !                                              (data used only for initialisation)
254         IF(lwp) WRITE(numout,*) 'dta_tsd: deallocte T & S arrays as they are only use to initialize the run'
255                                        DEALLOCATE( sf_tsd(jp_tem)%fnow )     ! T arrays in the structure
256         IF( sf_tsd(jp_tem)%ln_tint )   DEALLOCATE( sf_tsd(jp_tem)%fdta )
257                                        DEALLOCATE( sf_tsd(jp_sal)%fnow )     ! S arrays in the structure
258         IF( sf_tsd(jp_sal)%ln_tint )   DEALLOCATE( sf_tsd(jp_sal)%fdta )
259                                        DEALLOCATE( sf_tsd              )     ! the structure itself
260      ENDIF
261      !
262   END SUBROUTINE dta_tsd
263
264   !!======================================================================
265END MODULE dtatsd
Note: See TracBrowser for help on using the repository browser.