- Timestamp:
- 2010-10-06T16:19:27+02:00 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/DEV_r1986_BDY_updates/NEMO/OPA_SRC/BDY/bdydta.F90
r2100 r2168 16 16 !!---------------------------------------------------------------------- 17 17 !! bdy_dta : read u, v, t, s data along open boundaries 18 !! bdy_dta_bt : read depth-mean velocities and elevation along open 19 !! boundaries 18 !! bdy_dta_bt : read depth-mean velocities and elevation along open boundaries 20 19 !!---------------------------------------------------------------------- 21 20 USE oce ! ocean dynamics and tracers … … 37 36 PUBLIC bdy_dta_bt 38 37 39 INTEGER :: numbdyt, numbdyu, numbdyv ! :logical units for T-, U-, & V-points data file, resp.40 INTEGER :: ntimes_bdy ! :exact number of time dumps in data files41 INTEGER :: nbdy_b, nbdy_a ! : record of bdy data file for before and after modeltime step42 INTEGER :: numbdyt_bt, numbdyu_bt, numbdyv_bt ! :logical unit for T-, U- & V-points data file, resp.43 INTEGER :: ntimes_bdy_bt ! :exact number of time dumps in data files44 INTEGER :: nbdy_b_bt, nbdy_a_bt ! : record of bdy data file for before and after modeltime step45 46 INTEGER, DIMENSION (jpbtime) :: istep, istep_bt ! :time array in seconds in each data file47 48 REAL(wp) :: zoffset ! :time offset between time origin in file & start time of model run49 50 REAL(wp), DIMENSION(jpbdim,jpk,2) :: tbdydta, sbdydta ! :time interpolated values of T and S bdy data51 REAL(wp), DIMENSION(jpbdim,jpk,2) :: ubdydta, vbdydta ! :time interpolated values of U and V bdy data52 REAL(wp), DIMENSION(jpbdim,2) :: ubtbdydta, vbtbdydta ! :Arrays used for time interpolation of bdy data53 REAL(wp), DIMENSION(jpbdim,2) :: sshbdydta ! :bdy data of ssh38 INTEGER :: numbdyt, numbdyu, numbdyv ! logical units for T-, U-, & V-points data file, resp. 39 INTEGER :: ntimes_bdy ! exact number of time dumps in data files 40 INTEGER :: nbdy_b, nbdy_a ! record of bdy data file for before and after time step 41 INTEGER :: numbdyt_bt, numbdyu_bt, numbdyv_bt ! logical unit for T-, U- & V-points data file, resp. 42 INTEGER :: ntimes_bdy_bt ! exact number of time dumps in data files 43 INTEGER :: nbdy_b_bt, nbdy_a_bt ! record of bdy data file for before and after time step 44 45 INTEGER, DIMENSION (jpbtime) :: istep, istep_bt ! time array in seconds in each data file 46 47 REAL(wp) :: zoffset ! time offset between time origin in file & start time of model run 48 49 REAL(wp), DIMENSION(jpbdim,jpk,2) :: tbdydta, sbdydta ! time interpolated values of T and S bdy data 50 REAL(wp), DIMENSION(jpbdim,jpk,2) :: ubdydta, vbdydta ! time interpolated values of U and V bdy data 51 REAL(wp), DIMENSION(jpbdim,2) :: ubtbdydta, vbtbdydta ! Arrays used for time interpolation of bdy data 52 REAL(wp), DIMENSION(jpbdim,2) :: sshbdydta ! bdy data of ssh 54 53 55 54 #if defined key_lim2 56 REAL(wp), DIMENSION(jpbdim,2) :: frld_bdydta ! :}57 REAL(wp), DIMENSION(jpbdim,2) :: hicif_bdydta ! : } Arrays used for time interpolation of bdy data for ice variables58 REAL(wp), DIMENSION(jpbdim,2) :: hsnif_bdydta ! :}55 REAL(wp), DIMENSION(jpbdim,2) :: frld_bdydta ! } 56 REAL(wp), DIMENSION(jpbdim,2) :: hicif_bdydta ! } Arrays used for time interp. of ice bdy data 57 REAL(wp), DIMENSION(jpbdim,2) :: hsnif_bdydta ! } 59 58 #endif 60 59 61 60 !!---------------------------------------------------------------------- 62 !! NEMO/OPA 3. 0 , LOCEAN-IPSL (2008)61 !! NEMO/OPA 3.3 , NEMO Consortium (2010) 63 62 !! $Id$ 64 63 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 65 64 !!---------------------------------------------------------------------- 66 67 65 CONTAINS 68 66 … … 78 76 !! the file. If so read it in. Time interpolate. 79 77 !!---------------------------------------------------------------------- 80 INTEGER, INTENT( in ) :: kt 78 INTEGER, INTENT( in ) :: kt ! ocean time-step index (for timesplitting option, otherwise zero) 81 79 !! 82 80 CHARACTER(LEN=80), DIMENSION(3) :: clfile ! names of input files … … 90 88 INTEGER :: itimer, totime 91 89 INTEGER :: ii, ij ! array addresses 92 INTEGER :: ipi, ipj, ipk, inum ! temporaryintegers (NetCDF read)90 INTEGER :: ipi, ipj, ipk, inum ! local integers (NetCDF read) 93 91 INTEGER :: iyear0, imonth0, iday0 94 92 INTEGER :: ihours0, iminutes0, isec0 … … 102 100 !!--------------------------------------------------------------------------- 103 101 104 IF( ln_bdy_dyn_frs .OR. ln_bdy_tra_frs ) THEN ! If these are both false then this routine 105 ! does nothing. 102 103 IF( ln_bdy_dyn_frs .OR. ln_bdy_tra_frs & 104 & .OR. ln_bdy_ice_frs ) THEN ! If these are both false then this routine does nothing 106 105 107 106 ! -------------------- ! … … 113 112 ! Some time variables for monthly climatological forcing: 114 113 ! ******************************************************* 115 !!gm here use directely daymod variables 114 115 !!gm here use directely daymod calendar variables 116 116 117 117 iman = INT( raamo ) ! Number of months in a year … … 132 132 ! !-------------------! 133 133 istep(:) = 0 134 nbdy_b 135 nbdy_a 134 nbdy_b = 0 135 nbdy_a = 0 136 136 137 137 ! Get time information from bdy data file … … 162 162 igrd_start = 1 163 163 igrd_end = 3 164 IF(.NOT. ln_bdy_tra_frs .AND. .NOT. ln_bdy_ice_frs) THEN 165 ! No T-grid file. 164 IF(.NOT. ln_bdy_tra_frs .AND. .NOT. ln_bdy_ice_frs) THEN ! No T-grid file. 166 165 igrd_start = 2 167 ELSEIF ( .NOT. ln_bdy_dyn_frs ) THEN 168 ! No U-grid or V-grid file. 166 ELSEIF ( .NOT. ln_bdy_dyn_frs ) THEN ! No U-grid or V-grid file. 169 167 igrd_end = 1 170 168 ENDIF … … 176 174 177 175 SELECT CASE( igrd ) 178 CASE (1) 179 numbdyt = inum 180 CASE (2) 181 numbdyu = inum 182 CASE (3) 183 numbdyv = inum 176 CASE (1) ; numbdyt = inum 177 CASE (2) ; numbdyu = inum 178 CASE (3) ; numbdyv = inum 184 179 END SELECT 185 180 … … 216 211 217 212 ! Check that time array increases: 218 219 213 it = 1 220 DO WHILE( zstepr(it+1) > zstepr(it) .AND. it /= ntimes_bdy - 1 ) 221 it = it + 1214 DO WHILE( zstepr(it+1) > zstepr(it) .AND. it /= ntimes_bdy - 1 ) 215 it = it + 1 222 216 END DO 223 224 IF( it .NE.ntimes_bdy-1 .AND. ntimes_bdy > 1 ) THEN217 ! 218 IF( it /= ntimes_bdy-1 .AND. ntimes_bdy > 1 ) THEN 225 219 WRITE(ctmp1,*) 'Check file: ', clfile(igrd) 226 220 CALL ctl_stop( 'Time array in unstructured boundary data files', & … … 274 268 ENDIF 275 269 276 IF( igrd_start == 1 ) THEN 277 istep(:) = istept(:) 278 ELSE 279 istep(:) = istepu(:) 270 IF( igrd_start == 1 ) THEN ; istep(:) = istept(:) 271 ELSE ; istep(:) = istepu(:) 280 272 ENDIF 281 273 … … 302 294 it = 1 303 295 DO WHILE( istep(it+1) <= 0 .AND. it <= ntimes_bdy - 1 ) 304 it = it + 1296 it = it + 1 305 297 END DO 306 298 nbdy_b = it … … 315 307 ! ***************************************************************** 316 308 317 IF( nbdy_dta == 0 ) THEN ! boundary data arrays are filled with initial conditions309 IF( nbdy_dta == 0 ) THEN ! boundary data arrays are filled with initial conditions 318 310 ! 319 311 IF (ln_bdy_tra_frs) THEN 320 igrd = 1 ! T-points data321 DO ib = 1, nblen(igrd)322 ii = nbi(ib,igrd)323 ij = nbj(ib,igrd)324 DO ik = 1, jpkm1325 tbdy(ib,ik) = tn(ii, ij,ik)326 sbdy(ib,ik) = sn(ii, ij,ik)327 ENDDO328 END DO312 igrd = 1 ! T-points data 313 DO ib = 1, nblen(igrd) 314 ii = nbi(ib,igrd) 315 ij = nbj(ib,igrd) 316 DO ik = 1, jpkm1 317 tbdy(ib,ik) = tn(ii,ij,ik) 318 sbdy(ib,ik) = sn(ii,ij,ik) 319 END DO 320 END DO 329 321 ENDIF 330 322 331 323 IF(ln_bdy_dyn_frs) THEN 332 igrd = 2 ! U-points data333 DO ib = 1, nblen(igrd)334 ii = nbi(ib,igrd)335 ij = nbj(ib,igrd)336 DO ik = 1, jpkm1337 ubdy(ib,ik) = un(ii, ij, ik)338 ENDDO339 END DO340 341 igrd = 3 ! V-points data342 DO ib = 1, nblen(igrd)343 ii = nbi(ib,igrd)344 ij = nbj(ib,igrd)345 DO ik = 1, jpkm1346 vbdy(ib,ik) = vn(ii, ij, ik)347 ENDDO348 END DO324 igrd = 2 ! U-points data 325 DO ib = 1, nblen(igrd) 326 ii = nbi(ib,igrd) 327 ij = nbj(ib,igrd) 328 DO ik = 1, jpkm1 329 ubdy(ib,ik) = un(ii, ij, ik) 330 END DO 331 END DO 332 ! 333 igrd = 3 ! V-points data 334 DO ib = 1, nblen(igrd) 335 ii = nbi(ib,igrd) 336 ij = nbj(ib,igrd) 337 DO ik = 1, jpkm1 338 vbdy(ib,ik) = vn(ii, ij, ik) 339 END DO 340 END DO 349 341 ENDIF 350 342 ! 351 343 #if defined key_lim2 352 IF (ln_bdy_ice_frs) THEN344 IF( ln_bdy_ice_frs ) THEN 353 345 igrd = 1 ! T-points data 354 346 DO ib = 1, nblen(igrd) 355 frld_bdy (ib)= frld(nbi(ib,igrd), nbj(ib,igrd))347 frld_bdy (ib) = frld(nbi(ib,igrd), nbj(ib,igrd)) 356 348 hicif_bdy(ib) = hicif(nbi(ib,igrd), nbj(ib,igrd)) 357 349 hsnif_bdy(ib) = hsnif(nbi(ib,igrd), nbj(ib,igrd)) … … 377 369 378 370 IF(ln_bdy_tra_frs) THEN 371 ! 379 372 igrd = 1 ! Temperature 380 373 IF( nblendta(igrd) <= 0 ) THEN … … 385 378 ipi = nblendta(igrd) 386 379 CALL iom_get ( numbdyt, jpdom_unknown, 'votemper', zdta(1:ipi,1:ipj,1:ipk), nbdy_a ) 387 380 ! 388 381 DO ib = 1, nblen(igrd) 389 382 DO ik = 1, jpkm1 … … 400 393 ipi = nblendta(igrd) 401 394 CALL iom_get ( numbdyt, jpdom_unknown, 'vosaline', zdta(1:ipi,1:ipj,1:ipk), nbdy_a ) 402 395 ! 403 396 DO ib = 1, nblen(igrd) 404 397 DO ik = 1, jpkm1 … … 408 401 ENDIF ! ln_bdy_tra_frs 409 402 410 IF( ln_bdy_dyn_frs) THEN411 403 IF( ln_bdy_dyn_frs ) THEN 404 ! 412 405 igrd = 2 ! u-velocity 413 406 IF ( nblendta(igrd) .le. 0 ) THEN … … 440 433 441 434 #if defined key_lim2 442 IF( ln_bdy_ice_frs) THEN435 IF( ln_bdy_ice_frs ) THEN 443 436 ! 444 437 igrd=1 ! leads fraction … … 468 461 #endif 469 462 470 IF ((.NOT.ln_bdy_clim) .AND. (istep(1) > 0)) THEN 471 ! First data time is after start of run 472 ! Put first value in both time levels 463 IF( .NOT.ln_bdy_clim .AND. istep(1) > 0 ) THEN ! First data time is after start of run 464 nbdy_b = nbdy_a ! Put first value in both time levels 465 IF( ln_bdy_tra_frs ) THEN 466 tbdydta(:,:,1) = tbdydta(:,:,2) 467 sbdydta(:,:,1) = sbdydta(:,:,2) 468 ENDIF 469 IF( ln_bdy_dyn_frs ) THEN 470 ubdydta(:,:,1) = ubdydta(:,:,2) 471 vbdydta(:,:,1) = vbdydta(:,:,2) 472 ENDIF 473 #if defined key_lim2 474 IF( ln_bdy_ice_frs ) THEN 475 frld_bdydta (:,1) = frld_bdydta(:,2) 476 hicif_bdydta(:,1) = hicif_bdydta(:,2) 477 hsnif_bdydta(:,1) = hsnif_bdydta(:,2) 478 ENDIF 479 #endif 480 END IF 481 ! 482 END IF ! nbdy_dta == 0/1 483 484 ! In the case of constant boundary forcing fill bdy arrays once for all 485 IF( ln_bdy_clim .AND. ntimes_bdy == 1 ) THEN 486 IF( ln_bdy_tra_frs ) THEN 487 tbdy (:,:) = tbdydta (:,:,2) 488 sbdy (:,:) = sbdydta (:,:,2) 489 ENDIF 490 IF( ln_bdy_dyn_frs) THEN 491 ubdy (:,:) = ubdydta (:,:,2) 492 vbdy (:,:) = vbdydta (:,:,2) 493 ENDIF 494 #if defined key_lim2 495 IF( ln_bdy_ice_frs ) THEN 496 frld_bdy (:) = frld_bdydta (:,2) 497 hicif_bdy(:) = hicif_bdydta(:,2) 498 hsnif_bdy(:) = hsnif_bdydta(:,2) 499 ENDIF 500 #endif 501 502 IF( ln_bdy_tra_frs .OR. ln_bdy_ice_frs) CALL iom_close( numbdyt ) 503 IF( ln_bdy_dyn_frs ) CALL iom_close( numbdyu ) 504 IF( ln_bdy_dyn_frs ) CALL iom_close( numbdyv ) 505 END IF 506 ! 507 ENDIF ! End if nit000 508 509 510 ! !---------------------! 511 IF( nbdy_dta == 1 .AND. ntimes_bdy > 1 ) THEN ! at each time step ! 512 ! !---------------------! 513 ! Read one more record if necessary 514 !********************************** 515 516 IF( ln_bdy_clim .AND. imois /= nbdy_b ) THEN ! remember that nbdy_b=0 for kt=nit000 517 nbdy_b = imois 518 nbdy_a = imois + 1 519 nbdy_b = MOD( nbdy_b, iman ) ; IF( nbdy_b == 0 ) nbdy_b = iman 520 nbdy_a = MOD( nbdy_a, iman ) ; IF( nbdy_a == 0 ) nbdy_a = iman 521 lect=.true. 522 ELSEIF( .NOT.ln_bdy_clim .AND. itimer >= istep(nbdy_a) ) THEN 523 524 IF( nbdy_a < ntimes_bdy ) THEN 525 nbdy_b = nbdy_a 526 nbdy_a = nbdy_a + 1 527 lect =.true. 528 ELSE 529 ! We have reached the end of the file 530 ! put the last data time into both time levels 473 531 nbdy_b = nbdy_a 474 532 IF(ln_bdy_tra_frs) THEN 475 tbdydta(:,:,1) =tbdydta(:,:,2)476 sbdydta(:,:,1) =sbdydta(:,:,2)533 tbdydta(:,:,1) = tbdydta(:,:,2) 534 sbdydta(:,:,1) = sbdydta(:,:,2) 477 535 ENDIF 478 536 IF(ln_bdy_dyn_frs) THEN 479 ubdydta(:,:,1) =ubdydta(:,:,2)480 vbdydta(:,:,1) =vbdydta(:,:,2)537 ubdydta(:,:,1) = ubdydta(:,:,2) 538 vbdydta(:,:,1) = vbdydta(:,:,2) 481 539 ENDIF 482 540 #if defined key_lim2 483 IF( ln_bdy_ice_frs ) THEN 484 frld_bdydta (:,1) = frld_bdydta(:,2) 485 hicif_bdydta(:,1) = hicif_bdydta(:,2) 486 hsnif_bdydta(:,1) = hsnif_bdydta(:,2) 487 ENDIF 488 #endif 489 END IF 490 491 END IF ! nbdy_dta == 0/1 492 493 ! In the case of constant boundary forcing fill bdy arrays once for all 494 IF ((ln_bdy_clim).AND.(ntimes_bdy==1)) THEN 495 IF(ln_bdy_tra_frs) THEN 496 tbdy (:,:) = tbdydta (:,:,2) 497 sbdy (:,:) = sbdydta (:,:,2) 498 ENDIF 499 IF(ln_bdy_dyn_frs) THEN 500 ubdy (:,:) = ubdydta (:,:,2) 501 vbdy (:,:) = vbdydta (:,:,2) 502 ENDIF 503 #if defined key_lim2 504 IF(ln_bdy_ice_frs) THEN 505 frld_bdy (:) = frld_bdydta (:,2) 506 hicif_bdy(:) = hicif_bdydta(:,2) 507 hsnif_bdy(:) = hsnif_bdydta(:,2) 508 ENDIF 509 #endif 510 511 IF(ln_bdy_tra_frs .or. ln_bdy_ice_frs) CALL iom_close( numbdyt ) 512 IF(ln_bdy_dyn_frs) CALL iom_close( numbdyu ) 513 IF(ln_bdy_dyn_frs) CALL iom_close( numbdyv ) 514 END IF 515 516 ENDIF ! End if nit000 517 518 519 ! !---------------------! 520 ! ! at each time step ! 521 ! !---------------------! 522 523 IF( nbdy_dta == 1 .AND. ntimes_bdy > 1 ) THEN 524 ! 525 ! Read one more record if necessary 526 !********************************** 527 528 IF( ln_bdy_clim .AND. imois /= nbdy_b ) THEN ! remember that nbdy_b=0 for kt=nit000 529 nbdy_b = imois 530 nbdy_a = imois + 1 531 nbdy_b = MOD( nbdy_b, iman ) ; IF( nbdy_b == 0 ) nbdy_b = iman 532 nbdy_a = MOD( nbdy_a, iman ) ; IF( nbdy_a == 0 ) nbdy_a = iman 533 lect=.true. 534 ELSEIF( .NOT.ln_bdy_clim .AND. itimer >= istep(nbdy_a) ) THEN 535 536 IF ( nbdy_a < ntimes_bdy ) THEN 537 nbdy_b = nbdy_a 538 nbdy_a = nbdy_a + 1 539 lect =.true. 540 ELSE 541 ! We have reached the end of the file 542 ! put the last data time into both time levels 543 nbdy_b = nbdy_a 544 IF(ln_bdy_tra_frs) THEN 545 tbdydta(:,:,1) = tbdydta(:,:,2) 546 sbdydta(:,:,1) = sbdydta(:,:,2) 547 ENDIF 548 IF(ln_bdy_dyn_frs) THEN 549 ubdydta(:,:,1) = ubdydta(:,:,2) 550 vbdydta(:,:,1) = vbdydta(:,:,2) 551 ENDIF 552 #if defined key_lim2 553 IF(ln_bdy_ice_frs) THEN 554 frld_bdydta (:,1) = frld_bdydta (:,2) 555 hicif_bdydta(:,1) = hicif_bdydta(:,2) 556 hsnif_bdydta(:,1) = hsnif_bdydta(:,2) 557 ENDIF 541 IF(ln_bdy_ice_frs) THEN 542 frld_bdydta (:,1) = frld_bdydta (:,2) 543 hicif_bdydta(:,1) = hicif_bdydta(:,2) 544 hsnif_bdydta(:,1) = hsnif_bdydta(:,2) 545 ENDIF 558 546 #endif 559 547 END IF ! nbdy_a < ntimes_bdy 560 548 ! 561 549 END IF 562 550 563 IF( lect ) THEN 564 ! Swap arrays 565 IF(ln_bdy_tra_frs) THEN 551 IF( lect ) THEN ! Swap arrays 552 IF( ln_bdy_tra_frs ) THEN 566 553 tbdydta(:,:,1) = tbdydta(:,:,2) 567 554 sbdydta(:,:,1) = sbdydta(:,:,2) 568 555 ENDIF 569 IF( ln_bdy_dyn_frs) THEN556 IF( ln_bdy_dyn_frs ) THEN 570 557 ubdydta(:,:,1) = ubdydta(:,:,2) 571 558 vbdydta(:,:,1) = vbdydta(:,:,2) 572 559 ENDIF 573 560 #if defined key_lim2 574 IF( ln_bdy_ice_frs) THEN561 IF( ln_bdy_ice_frs ) THEN 575 562 frld_bdydta (:,1) = frld_bdydta (:,2) 576 563 hicif_bdydta(:,1) = hicif_bdydta(:,2) … … 582 569 ipk = jpk 583 570 584 IF( ln_bdy_tra_frs) THEN571 IF( ln_bdy_tra_frs ) THEN 585 572 ! 586 573 igrd = 1 ! temperature … … 720 707 ! 721 708 ENDIF ! ln_bdy_dyn_frs .OR. ln_bdy_tra_frs 722 709 ! 723 710 END SUBROUTINE bdy_dta 724 711
Note: See TracChangeset
for help on using the changeset viewer.