Changeset 2977 for branches/2011/dev_LOCEAN_2011/NEMOGCM/NEMO/OPA_SRC/DOM
- Timestamp:
- 2011-10-22T15:46:41+02:00 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2011/dev_LOCEAN_2011/NEMOGCM/NEMO/OPA_SRC/DOM/istate.F90
r2777 r2977 13 13 !! 2.0 ! 2006-07 (S. Masson) distributed restart using iom 14 14 !! 3.3 ! 2010-10 (C. Ethe) merge TRC-TRA 15 !! 3.4 ! 2011-04 (G. Madec) Merge of dtatem and dtasal & suppression of tb,tn/sb,sn 15 16 !!---------------------------------------------------------------------- 16 17 … … 30 31 USE zdf_oce ! ocean vertical physics 31 32 USE phycst ! physical constants 32 USE dtatem ! temperature data (dta_tem routine) 33 USE dtasal ! salinity data (dta_sal routine) 33 USE dtatsd ! data temperature and salinity (dta_tsd routine) 34 34 USE restart ! ocean restart (rst_read routine) 35 35 USE in_out_manager ! I/O manager … … 42 42 USE dynspg_exp ! pressure gradient schemes 43 43 USE dynspg_ts ! pressure gradient schemes 44 USE traswp ! Swap arrays (tra_swp routine)45 44 USE lib_mpp ! MPP library 46 45 … … 73 72 IF(lwp) WRITE(numout,*) '~~~~~~~~~~' 74 73 75 rhd (:,:,:) = 0.e0 76 rhop (:,:,:) = 0.e0 77 rn2 (:,:,:) = 0.e0 78 ta (:,:,:) = 0.e0 79 sa (:,:,:) = 0.e0 74 CALL dta_tsd_init ! Initialisation of T & S input data 75 76 rhd (:,:,: ) = 0.e0 77 rhop (:,:,: ) = 0.e0 78 rn2 (:,:,: ) = 0.e0 79 tsa (:,:,:,:) = 0.e0 80 80 81 81 IF( ln_rstart ) THEN ! Restart from a file … … 83 83 neuler = 1 ! Set time-step indicator at nit000 (leap-frog) 84 84 CALL rst_read ! Read the restart file 85 CALL tra_swap ! swap 3D arrays (t,s) in a 4D array (ts)86 85 CALL day_init ! model calendar (using both namelist and restart infos) 87 86 ELSE … … 99 98 hdivb(:,:,:) = 0.e0 ; hdivn(:,:,:) = 0.e0 100 99 ! 101 IF( cp_cfg == 'eel' ) THEN100 IF( cp_cfg == 'eel' ) THEN 102 101 CALL istate_eel ! EEL configuration : start from pre-defined U,V T-S fields 103 102 ELSEIF( cp_cfg == 'gyre' ) THEN 104 103 CALL istate_gyre ! GYRE configuration : start from pre-defined T-S fields 105 ELSE 106 ! ! Other configurations: Initial T-S fields 107 #if defined key_dtatem 108 CALL dta_tem( nit000 ) ! read 3D temperature data 109 tb(:,:,:) = t_dta(:,:,:) ; tn(:,:,:) = t_dta(:,:,:) 110 111 #else 112 IF(lwp) WRITE(numout,*) ! analytical temperature profile 113 IF(lwp) WRITE(numout,*)' Temperature initialization using an analytic profile' 114 CALL istate_tem 115 #endif 116 #if defined key_dtasal 117 CALL dta_sal( nit000 ) ! read 3D salinity data 118 sb(:,:,:) = s_dta(:,:,:) ; sn(:,:,:) = s_dta(:,:,:) 119 #else 120 ! No salinity data 121 IF(lwp)WRITE(numout,*) ! analytical salinity profile 122 IF(lwp)WRITE(numout,*)' Salinity initialisation using a constant value' 123 CALL istate_sal 124 #endif 104 ELSEIF( ln_tsd_init ) THEN ! Initial T-S fields read in files 105 CALL dta_tsd( nit000, tsb ) ! read 3D T and S data at nit000 106 tsn(:,:,:,:) = tsb(:,:,:,:) 107 ! 108 ELSE ! Initial T-S fields defined analytically 109 CALL istate_t_s 125 110 ENDIF 126 111 ! 127 CALL tra_swap ! swap 3D arrays (tb,sb,tn,sn) in a 4D array128 112 CALL eos( tsb, rhd, rhop ) ! before potential and in situ densities 129 113 #if ! defined key_c1d … … 150 134 END SUBROUTINE istate_init 151 135 152 153 SUBROUTINE istate_tem 136 SUBROUTINE istate_t_s 154 137 !!--------------------------------------------------------------------- 155 !! *** ROUTINE istate_t em***138 !! *** ROUTINE istate_t_s *** 156 139 !! 157 140 !! ** Purpose : Intialization of the temperature field with an 158 141 !! analytical profile or a file (i.e. in EEL configuration) 159 142 !! 160 !! ** Method : Use Philander analytic profile of temperature 143 !! ** Method : - temperature: use Philander analytic profile 144 !! - salinity : use to a constant value 35.5 161 145 !! 162 146 !! References : Philander ??? 163 147 !!---------------------------------------------------------------------- 164 INTEGER :: ji, jj, jk 148 INTEGER :: ji, jj, jk 149 REAL(wp) :: zsal = 35.50 165 150 !!---------------------------------------------------------------------- 166 151 ! 167 152 IF(lwp) WRITE(numout,*) 168 IF(lwp) WRITE(numout,*) 'istate_t em :initial temperature profile'169 IF(lwp) WRITE(numout,*) '~~~~~~~~~~ '153 IF(lwp) WRITE(numout,*) 'istate_t_s : Philander s initial temperature profile' 154 IF(lwp) WRITE(numout,*) '~~~~~~~~~~ and constant salinity (',zsal,' psu)' 170 155 ! 171 156 DO jk = 1, jpk 172 DO jj = 1, jpj 173 DO ji = 1, jpi 174 tn(ji,jj,jk) = ( ( ( 7.5 - 0.*ABS(gphit(ji,jj))/30. ) & 175 & *( 1.-TANH((fsdept(ji,jj,jk)-80.)/30.) ) & 176 & + 10.*(5000.-fsdept(ji,jj,jk))/5000.) ) * tmask(ji,jj,jk) 177 tb(ji,jj,jk) = tn(ji,jj,jk) 178 END DO 179 END DO 157 tsn(:,:,jk,jp_tem) = ( ( ( 7.5 - 0. * ABS( gphit(:,:) )/30. ) * ( 1.-TANH((fsdept(:,:,jk)-80.)/30.) ) & 158 & + 10. * ( 5000. - fsdept(:,:,jk) ) /5000.) ) * tmask(:,:,jk) 159 tsb(:,:,jk,jp_tem) = tsn(:,:,jk,jp_tem) 180 160 END DO 181 ! 182 IF(lwp) CALL prizre( tn , jpi , jpj , jpk , jpj/2 , & 183 & 1 , jpi , 5 , 1 , jpk , & 184 & 1 , 1. , numout ) 185 ! 186 END SUBROUTINE istate_tem 187 188 189 SUBROUTINE istate_sal 190 !!--------------------------------------------------------------------- 191 !! *** ROUTINE istate_sal *** 192 !! 193 !! ** Purpose : Intialize the salinity field with an analytic profile 194 !! 195 !! ** Method : Use to a constant value 35.5 196 !! 197 !! ** Action : Initialize sn and sb 198 !!---------------------------------------------------------------------- 199 REAL(wp) :: zsal = 35.50_wp 200 !!---------------------------------------------------------------------- 201 ! 202 IF(lwp) WRITE(numout,*) 203 IF(lwp) WRITE(numout,*) 'istate_sal : initial salinity : ', zsal 204 IF(lwp) WRITE(numout,*) '~~~~~~~~~~' 205 ! 206 sn(:,:,:) = zsal * tmask(:,:,:) 207 sb(:,:,:) = sn(:,:,:) 208 ! 209 END SUBROUTINE istate_sal 161 tsn(:,:,:,jp_sal) = zsal * tmask(:,:,:) 162 tsb(:,:,:,jp_sal) = tsn(:,:,:,jp_sal) 163 ! 164 END SUBROUTINE istate_t_s 210 165 211 166 … … 254 209 ! 255 210 DO jk = 1, jpk 256 t n(:,:,jk) = ( zt2 + zt1 * exp( - fsdept(:,:,jk) / 1000 ) ) * tmask(:,:,jk)257 t b(:,:,jk) = tn(:,:,jk)211 tsn(:,:,jk,jp_tem) = ( zt2 + zt1 * exp( - fsdept(:,:,jk) / 1000 ) ) * tmask(:,:,jk) 212 tsb(:,:,jk,jp_tem) = tsn(:,:,jk,jp_tem) 258 213 END DO 259 214 ! 260 IF(lwp) CALL prizre( t n, jpi , jpj , jpk , jpj/2 , &261 & 1 , jpi , 5 , 1 , jpk , &262 & 1 , 1. , numout )215 IF(lwp) CALL prizre( tsn(:,:,:,jp_tem), jpi , jpj , jpk , jpj/2 , & 216 & 1 , jpi , 5 , 1 , jpk , & 217 & 1 , 1. , numout ) 263 218 ! 264 219 ! set salinity field to a constant value … … 268 223 IF(lwp) WRITE(numout,*) '~~~~~~~~~~' 269 224 ! 270 sn(:,:,:) = zsal * tmask(:,:,:)271 sb(:,:,:) = sn(:,:,:)225 tsn(:,:,:,jp_sal) = zsal * tmask(:,:,:) 226 tsb(:,:,:,jp_sal) = tsn(:,:,:,jp_sal) 272 227 ! 273 228 ! set the dynamics: U,V, hdiv, rot (and ssh if necessary) … … 323 278 ! 324 279 CALL iom_open ( 'eel.initemp', inum ) 325 CALL iom_get ( inum, jpdom_data, 'initemp', t b) ! read before temprature (tb)280 CALL iom_get ( inum, jpdom_data, 'initemp', tsb(:,:,:,jp_tem) ) ! read before temprature (tb) 326 281 CALL iom_close( inum ) 327 282 ! 328 t n(:,:,:) = tb(:,:,:) ! set nox temperature to tb329 ! 330 IF(lwp) CALL prizre( t n, jpi , jpj , jpk , jpj/2 , &331 & 1 , jpi , 5 , 1 , jpk , &332 & 1 , 1. , numout )283 tsn(:,:,:,jp_tem) = tsb(:,:,:,jp_tem) ! set nox temperature to tb 284 ! 285 IF(lwp) CALL prizre( tsn(:,:,:,jp_tem), jpi , jpj , jpk , jpj/2 , & 286 & 1 , jpi , 5 , 1 , jpk , & 287 & 1 , 1. , numout ) 333 288 ! 334 289 ! set salinity field to a constant value … … 338 293 IF(lwp) WRITE(numout,*) '~~~~~~~~~~' 339 294 ! 340 sn(:,:,:) = zsal * tmask(:,:,:)341 sb(:,:,:) = sn(:,:,:)295 tsn(:,:,:,jp_sal) = zsal * tmask(:,:,:) 296 tsb(:,:,:,jp_sal) = tsn(:,:,:,jp_sal) 342 297 ! 343 298 ! ! =========================== … … 377 332 DO jj = 1, jpj 378 333 DO ji = 1, jpi 379 t n(ji,jj,jk) = ( 16. - 12. * TANH( (fsdept(ji,jj,jk) - 400) / 700 ) ) &334 tsn(ji,jj,jk,jp_tem) = ( 16. - 12. * TANH( (fsdept(ji,jj,jk) - 400) / 700 ) ) & 380 335 & * (-TANH( (500-fsdept(ji,jj,jk)) / 150 ) + 1) / 2 & 381 336 & + ( 15. * ( 1. - TANH( (fsdept(ji,jj,jk)-50.) / 1500.) ) & … … 383 338 & + 7. * (1500. - fsdept(ji,jj,jk)) / 1500. ) & 384 339 & * (-TANH( (fsdept(ji,jj,jk) - 500) / 150) + 1) / 2 385 t n(ji,jj,jk) = tn(ji,jj,jk) * tmask(ji,jj,jk)386 t b(ji,jj,jk) = tn(ji,jj,jk)387 388 sn(ji,jj,jk) = ( 36.25 - 1.13 * TANH( (fsdept(ji,jj,jk) - 305) / 460 ) ) &340 tsn(ji,jj,jk,jp_tem) = tsn(ji,jj,jk,jp_tem) * tmask(ji,jj,jk) 341 tsb(ji,jj,jk,jp_tem) = tsn(ji,jj,jk,jp_tem) 342 343 tsn(ji,jj,jk,jp_sal) = ( 36.25 - 1.13 * TANH( (fsdept(ji,jj,jk) - 305) / 460 ) ) & 389 344 & * (-TANH((500 - fsdept(ji,jj,jk)) / 150) + 1) / 2 & 390 345 & + ( 35.55 + 1.25 * (5000. - fsdept(ji,jj,jk)) / 5000. & … … 393 348 & + 0.2 * TANH( (fsdept(ji,jj,jk) - 1000.) / 5000.) ) & 394 349 & * (-TANH((fsdept(ji,jj,jk) - 500) / 150) + 1) / 2 395 sn(ji,jj,jk) = sn(ji,jj,jk) * tmask(ji,jj,jk)396 sb(ji,jj,jk) = sn(ji,jj,jk)350 tsn(ji,jj,jk,jp_sal) = tsn(ji,jj,jk,jp_sal) * tmask(ji,jj,jk) 351 tsb(ji,jj,jk,jp_sal) = tsn(ji,jj,jk,jp_sal) 397 352 END DO 398 353 END DO … … 408 363 ! ---------------------- 409 364 CALL iom_open ( 'data_tem', inum ) 410 CALL iom_get ( inum, jpdom_data, 'votemper', t n)365 CALL iom_get ( inum, jpdom_data, 'votemper', tsn(:,:,:,jp_tem) ) 411 366 CALL iom_close( inum ) 412 367 413 t n(:,:,:) = tn(:,:,:) * tmask(:,:,:)414 t b(:,:,:) = tn(:,:,:)368 tsn(:,:,:,jp_tem) = tsn(:,:,:,jp_tem) * tmask(:,:,:) 369 tsb(:,:,:,jp_tem) = tsn(:,:,:,jp_tem) 415 370 416 371 ! Read salinity field 417 372 ! ------------------- 418 373 CALL iom_open ( 'data_sal', inum ) 419 CALL iom_get ( inum, jpdom_data, 'vosaline', sn)374 CALL iom_get ( inum, jpdom_data, 'vosaline', tsn(:,:,:,jp_sal) ) 420 375 CALL iom_close( inum ) 421 376 422 sn(:,:,:) = sn(:,:,:) * tmask(:,:,:)423 sb(:,:,:) = sn(:,:,:)377 tsn(:,:,:,jp_sal) = tsn(:,:,:,jp_sal) * tmask(:,:,:) 378 tsb(:,:,:,jp_sal) = tsn(:,:,:,jp_sal) 424 379 425 380 END SELECT … … 429 384 WRITE(numout,*) ' Initial temperature and salinity profiles:' 430 385 WRITE(numout, "(9x,' level gdept_0 temperature salinity ')" ) 431 WRITE(numout, "(10x, i4, 3f10.2)" ) ( jk, gdept_0(jk), t n(2,2,jk), sn(2,2,jk), jk = 1, jpk )386 WRITE(numout, "(10x, i4, 3f10.2)" ) ( jk, gdept_0(jk), tsn(2,2,jk,jp_tem), tsn(2,2,jk,jp_sal), jk = 1, jpk ) 432 387 ENDIF 433 388
Note: See TracChangeset
for help on using the changeset viewer.