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/2019/dev_r12072_MERGE_OPTION2_2019/tests/ISOMIP+/MY_SRC – NEMO

source: NEMO/branches/2019/dev_r12072_MERGE_OPTION2_2019/tests/ISOMIP+/MY_SRC/dtatsd.F90 @ 12202

Last change on this file since 12202 was 12202, checked in by cetlod, 4 years ago

dev_merge_option2 : merge in dev_r11613_ENHANCE-04_namelists_as_internalfiles

File size: 13.3 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 fldread         ! read input fields
21   !
22   USE in_out_manager  ! I/O manager
23   USE lib_mpp         ! MPP library
24
25   IMPLICIT NONE
26   PRIVATE
27
28   PUBLIC   dta_tsd_init   ! called by opa.F90
29   PUBLIC   dta_tsd        ! called by istate.F90 and tradmp.90
30
31   !                                  !!* namtsd  namelist : Temperature & Salinity Data *
32   LOGICAL , PUBLIC ::   ln_tsd_init   !: T & S data flag
33   LOGICAL , PUBLIC ::   ln_tsd_dmp    !: internal damping toward input data flag
34
35   TYPE(FLD), ALLOCATABLE, DIMENSION(:) ::   sf_tsdini ! structure of input SST (file informations, fields read)
36   TYPE(FLD), ALLOCATABLE, DIMENSION(:) ::   sf_tsddmp ! structure of input SST (file informations, fields read)
37
38   !!----------------------------------------------------------------------
39   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
40   !! $Id: dtatsd.F90 10213 2018-10-23 14:40:09Z aumont $
41   !! Software governed by the CeCILL license (see ./LICENSE)
42   !!----------------------------------------------------------------------
43CONTAINS
44
45   SUBROUTINE dta_tsd_init( ld_tradmp )
46      !!----------------------------------------------------------------------
47      !!                   ***  ROUTINE dta_tsd_init  ***
48      !!                   
49      !! ** Purpose :   initialisation of T & S input data
50      !!
51      !! ** Method  : - Read namtsd namelist
52      !!              - allocates T & S data structure
53      !!----------------------------------------------------------------------
54      LOGICAL, INTENT(in), OPTIONAL ::   ld_tradmp   ! force the initialization when tradp is used
55      !
56      INTEGER ::   ios, ierr0, ierr1, ierr2, ierr3   ! local integers
57      !!
58      CHARACTER(len=100)            ::   cn_dir          ! Root directory for location of ssr files
59      TYPE(FLD_N), DIMENSION( jpts) ::   slf_i           ! array of namelist informations on the fields to read
60      TYPE(FLD_N)                   ::   sn_tem, sn_sal
61      TYPE(FLD_N)                   ::   sn_dmpt, sn_dmps
62      !!
63      NAMELIST/namtsd/   ln_tsd_init, ln_tsd_dmp, cn_dir, sn_tem, sn_sal, sn_dmpt, sn_dmps
64      !!----------------------------------------------------------------------
65      !
66      !  Initialisation
67      ierr0 = 0  ;  ierr1 = 0  ;  ierr2 = 0  ;  ierr3 = 0
68      !
69      READ  ( numnam_ref, namtsd, IOSTAT = ios, ERR = 901)
70901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namtsd in reference namelist', lwp )
71      READ  ( numnam_cfg, namtsd, IOSTAT = ios, ERR = 902 )
72902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namtsd in configuration namelist', lwp )
73      IF(lwm) WRITE ( numond, namtsd )
74
75      IF( PRESENT( ld_tradmp ) )   ln_tsd_dmp = .TRUE.     ! forces the initialization when tradmp is used
76     
77      IF(lwp) THEN                  ! control print
78         WRITE(numout,*)
79         WRITE(numout,*) 'dta_tsd_init : Temperature & Salinity data '
80         WRITE(numout,*) '~~~~~~~~~~~~ '
81         WRITE(numout,*) '   Namelist namtsd'
82         WRITE(numout,*) '      Initialisation of ocean T & S with T &S input data   ln_tsd_init = ', ln_tsd_init
83         WRITE(numout,*) '      damping of ocean T & S toward T &S input data        ln_tsd_dmp  = ', ln_tsd_dmp
84         WRITE(numout,*)
85         IF( .NOT.ln_tsd_init .AND. .NOT.ln_tsd_dmp ) THEN
86            WRITE(numout,*)
87            WRITE(numout,*) '   ===>>   T & S data not used'
88         ENDIF
89      ENDIF
90      !
91      IF( ln_rstart .AND. ln_tsd_init ) THEN
92         CALL ctl_warn( 'dta_tsd_init: ocean restart and T & S data intialisation, ',   &
93            &           'we keep the restart T & S values and set ln_tsd_init to FALSE' )
94         ln_tsd_init = .FALSE.
95      ENDIF
96      !
97      !                             ! allocate the arrays (if necessary)
98      IF( ln_tsd_init ) THEN
99         !
100         ALLOCATE( sf_tsdini(jpts), STAT=ierr0 )
101         IF( ierr0 > 0 ) THEN
102            CALL ctl_stop( 'dta_tsd_init: unable to allocate sf_tsd structure' )   ;   RETURN
103         ENDIF
104         !
105                                ALLOCATE( sf_tsdini(jp_tem)%fnow(jpi,jpj,jpk)   , STAT=ierr0 )
106         IF( sn_tem%ln_tint )   ALLOCATE( sf_tsdini(jp_tem)%fdta(jpi,jpj,jpk,2) , STAT=ierr1 )
107                                ALLOCATE( sf_tsdini(jp_sal)%fnow(jpi,jpj,jpk)   , STAT=ierr2 )
108         IF( sn_sal%ln_tint )   ALLOCATE( sf_tsdini(jp_sal)%fdta(jpi,jpj,jpk,2) , STAT=ierr3 )
109         !
110         IF( ierr0 + ierr1 + ierr2 + ierr3 > 0 ) THEN
111            CALL ctl_stop( 'dta_tsd : unable to allocate T & S data arrays' )   ;   RETURN
112         ENDIF
113         !
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_tsdini, slf_i, cn_dir, 'dta_tsd', 'Temperature & Salinity data', 'namtsd', no_print )
117         !
118      END IF
119
120      IF( ln_tsd_dmp ) THEN
121         !
122         ALLOCATE( sf_tsddmp(jpts), STAT=ierr0 )
123         IF( ierr0 > 0 ) THEN
124            CALL ctl_stop( 'dta_tsd_init: unable to allocate sf_tsddmp structure' )   ;   RETURN
125         ENDIF
126         !
127         ! dmp file
128                                 ALLOCATE( sf_tsddmp(jp_tem)%fnow(jpi,jpj,jpk)   , STAT=ierr0 )
129         IF( sn_dmpt%ln_tint )   ALLOCATE( sf_tsddmp(jp_tem)%fdta(jpi,jpj,jpk,2) , STAT=ierr1 )
130                                 ALLOCATE( sf_tsddmp(jp_sal)%fnow(jpi,jpj,jpk)   , STAT=ierr2 )
131         IF( sn_dmps%ln_tint )   ALLOCATE( sf_tsddmp(jp_sal)%fdta(jpi,jpj,jpk,2) , STAT=ierr3 )
132         !
133         IF( ierr0 + ierr1 + ierr2 + ierr3 > 0 ) THEN
134            CALL ctl_stop( 'dta_tsd : unable to allocate T & S dmp data arrays' )   ;   RETURN
135         ENDIF
136         !
137         !                         ! fill sf_tsd with sn_tem & sn_sal and control print
138         slf_i(jp_tem) = sn_dmpt   ;   slf_i(jp_sal) = sn_dmps
139         CALL fld_fill( sf_tsddmp, slf_i, cn_dir, 'dta_tsd', 'Temperature & Salinity dmp data', 'namtsd', no_print )
140         !
141      ENDIF
142      !
143   END SUBROUTINE dta_tsd_init
144
145
146   SUBROUTINE dta_tsd( kt, cddta, ptsd )
147      !!----------------------------------------------------------------------
148      !!                   ***  ROUTINE dta_tsd  ***
149      !!                   
150      !! ** Purpose :   provides T and S data at kt
151      !!
152      !! ** Method  : - call fldread routine
153      !!              - ORCA_R2: add some hand made alteration to read data 
154      !!              - 'key_orca_lev10' interpolates on 10 times more levels
155      !!              - s- or mixed z-s coordinate: vertical interpolation on model mesh
156      !!              - ln_tsd_dmp=F: deallocates the T-S data structure
157      !!                as T-S data are no are used
158      !!
159      !! ** Action  :   ptsd   T-S data on medl mesh and interpolated at time-step kt
160      !!----------------------------------------------------------------------
161      INTEGER                              , INTENT(in   ) ::   kt     ! ocean time-step
162      CHARACTER(LEN=3)                     , INTENT(in   ) ::   cddta  ! dmp or ini
163      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(  out) ::   ptsd   ! T & S data
164      !
165      INTEGER ::   ji, jj, jk, jl, jkk   ! dummy loop indicies
166      INTEGER ::   ik, il0, il1, ii0, ii1, ij0, ij1   ! local integers
167      REAL(wp)::   zl, zi                             ! local scalars
168      REAL(wp), DIMENSION(jpk) ::  ztp, zsp   ! 1D workspace
169      !!----------------------------------------------------------------------
170      !
171      SELECT CASE(cddta)
172      CASE('ini') 
173         CALL fld_read( kt, 1, sf_tsdini ) !==   read T & S data at kt time step   ==!
174         ptsd(:,:,:,jp_tem) = sf_tsdini(jp_tem)%fnow(:,:,:)    ! NO mask
175         ptsd(:,:,:,jp_sal) = sf_tsdini(jp_sal)%fnow(:,:,:) 
176      CASE('dmp')
177         CALL fld_read( kt, 1, sf_tsddmp ) !==   read T & S data at kt time step   ==!
178         ptsd(:,:,:,jp_tem) = sf_tsddmp(jp_tem)%fnow(:,:,:)    ! NO mask
179         ptsd(:,:,:,jp_sal) = sf_tsddmp(jp_sal)%fnow(:,:,:) 
180      CASE DEFAULT
181         CALL ctl_stop('STOP', 'dta_tsd: cddta case unknown')
182      END SELECT
183      !
184      IF( ln_sco ) THEN                   !==   s- or mixed s-zps-coordinate   ==!
185         !
186         IF( kt == nit000 .AND. lwp )THEN
187            WRITE(numout,*)
188            WRITE(numout,*) 'dta_tsd: interpolates T & S data onto the s- or mixed s-z-coordinate mesh'
189         ENDIF
190         !
191         DO jj = 1, jpj                         ! vertical interpolation of T & S
192            DO ji = 1, jpi
193               DO jk = 1, jpk                        ! determines the intepolated T-S profiles at each (i,j) points
194                  zl = gdept_0(ji,jj,jk)
195                  IF(     zl < gdept_1d(1  ) ) THEN          ! above the first level of data
196                     ztp(jk) =  ptsd(ji,jj,1    ,jp_tem)
197                     zsp(jk) =  ptsd(ji,jj,1    ,jp_sal)
198                  ELSEIF( zl > gdept_1d(jpk) ) THEN          ! below the last level of data
199                     ztp(jk) =  ptsd(ji,jj,jpkm1,jp_tem)
200                     zsp(jk) =  ptsd(ji,jj,jpkm1,jp_sal)
201                  ELSE                                      ! inbetween : vertical interpolation between jkk & jkk+1
202                     DO jkk = 1, jpkm1                                  ! when  gdept(jkk) < zl < gdept(jkk+1)
203                        IF( (zl-gdept_1d(jkk)) * (zl-gdept_1d(jkk+1)) <= 0._wp ) THEN
204                           zi = ( zl - gdept_1d(jkk) ) / (gdept_1d(jkk+1)-gdept_1d(jkk))
205                           ztp(jk) = ptsd(ji,jj,jkk,jp_tem) + ( ptsd(ji,jj,jkk+1,jp_tem) - ptsd(ji,jj,jkk,jp_tem) ) * zi 
206                           zsp(jk) = ptsd(ji,jj,jkk,jp_sal) + ( ptsd(ji,jj,jkk+1,jp_sal) - ptsd(ji,jj,jkk,jp_sal) ) * zi
207                        ENDIF
208                     END DO
209                  ENDIF
210               END DO
211               DO jk = 1, jpkm1
212                  ptsd(ji,jj,jk,jp_tem) = ztp(jk) * tmask(ji,jj,jk)     ! mask required for mixed zps-s-coord
213                  ptsd(ji,jj,jk,jp_sal) = zsp(jk) * tmask(ji,jj,jk)
214               END DO
215               ptsd(ji,jj,jpk,jp_tem) = 0._wp
216               ptsd(ji,jj,jpk,jp_sal) = 0._wp
217            END DO
218         END DO
219         !
220      ELSE                                !==   z- or zps- coordinate   ==!
221         !                             
222         ptsd(:,:,:,jp_tem) = ptsd(:,:,:,jp_tem) * tmask(:,:,:)    ! Mask
223         ptsd(:,:,:,jp_sal) = ptsd(:,:,:,jp_sal) * tmask(:,:,:)
224         !
225         IF( ln_zps ) THEN                      ! zps-coordinate (partial steps) interpolation at the last ocean level
226            DO jj = 1, jpj
227               DO ji = 1, jpi
228                  ik = mbkt(ji,jj) 
229                  IF( ik > 1 ) THEN
230                     zl = ( gdept_1d(ik) - gdept_0(ji,jj,ik) ) / ( gdept_1d(ik) - gdept_1d(ik-1) )
231                     ptsd(ji,jj,ik,jp_tem) = (1.-zl) * ptsd(ji,jj,ik,jp_tem) + zl * ptsd(ji,jj,ik-1,jp_tem)
232                     ptsd(ji,jj,ik,jp_sal) = (1.-zl) * ptsd(ji,jj,ik,jp_sal) + zl * ptsd(ji,jj,ik-1,jp_sal)
233                  ENDIF
234                  ik = mikt(ji,jj)
235                  IF( ik > 1 ) THEN
236                     zl = ( gdept_0(ji,jj,ik) - gdept_1d(ik) ) / ( gdept_1d(ik+1) - gdept_1d(ik) ) 
237                     ptsd(ji,jj,ik,jp_tem) = (1.-zl) * ptsd(ji,jj,ik,jp_tem) + zl * ptsd(ji,jj,ik+1,jp_tem)
238                     ptsd(ji,jj,ik,jp_sal) = (1.-zl) * ptsd(ji,jj,ik,jp_sal) + zl * ptsd(ji,jj,ik+1,jp_sal)
239                  END IF
240               END DO
241            END DO
242         ENDIF
243         !
244      ENDIF
245      !
246      SELECT CASE(cddta)
247      CASE('ini') 
248         !                        !==   deallocate T & S structure   ==!
249         !                                              (data used only for initialisation)
250         IF(lwp) WRITE(numout,*) 'dta_tsd: deallocte T & S arrays as they are only use to initialize the run'
251                                        DEALLOCATE( sf_tsdini(jp_tem)%fnow )     ! T arrays in the structure
252         IF( sf_tsdini(jp_tem)%ln_tint )   DEALLOCATE( sf_tsdini(jp_tem)%fdta )
253                                        DEALLOCATE( sf_tsdini(jp_sal)%fnow )     ! S arrays in the structure
254         IF( sf_tsdini(jp_sal)%ln_tint )   DEALLOCATE( sf_tsdini(jp_sal)%fdta )
255                                        DEALLOCATE( sf_tsdini              )     ! the structure itself
256         !
257      END SELECT
258      !
259   END SUBROUTINE dta_tsd
260
261   !!======================================================================
262END MODULE dtatsd
Note: See TracBrowser for help on using the repository browser.