Changeset 2128 for branches/devukmo2010/NEMO/OPA_SRC/BDY/bdydta.F90
- Timestamp:
- 2010-09-28T14:29:51+02:00 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/devukmo2010/NEMO/OPA_SRC/BDY/bdydta.F90
r1715 r2128 8 8 !! - ! 2007-07 (D. Storkey) add bdy_dta_bt 9 9 !! 3.0 ! 2008-04 (NEMO team) add in the reference version 10 !! 3.3 ! 2010-09 (E.O'Dea) modifications for Shelf configurations 11 !! 3.3 ! 2010-09 (D.Storkey) add ice boundary conditions 10 12 !!---------------------------------------------------------------------- 11 13 #if defined key_bdy … … 25 27 USE ioipsl 26 28 USE in_out_manager ! I/O logical units 29 #if defined key_lim2 30 USE ice_2 31 #endif 27 32 28 33 IMPLICIT NONE … … 47 52 REAL(wp), DIMENSION(jpbdim,2) :: ubtbdydta, vbtbdydta !: Arrays used for time interpolation of bdy data 48 53 REAL(wp), DIMENSION(jpbdim,2) :: sshbdydta !: bdy data of ssh 54 55 #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 variables 58 REAL(wp), DIMENSION(jpbdim,2) :: hsnif_bdydta !: } 59 #endif 49 60 50 61 !!---------------------------------------------------------------------- … … 196 207 IF(lwp) WRITE(numout,*) 'offset: ',zoffset 197 208 IF(lwp) WRITE(numout,*) 'totime: ',totime 198 IF(lwp) WRITE(numout,*) 'zstepr: ',zstepr 209 IF(lwp) WRITE(numout,*) 'zstepr: ',zstepr(1:ntimes_bdy) 199 210 200 211 ! Check that there are not too many times in the file. … … 227 238 END IF 228 239 ! 229 IF ( igrd == 1 ) THEN 230 ntimes_bdyt = ntimes_bdy 231 zoffsett = zoffset 232 istept(:) = INT( zstepr(:) + zoffset ) 233 ELSEIF(igrd == 2 ) THEN 234 ntimes_bdyu = ntimes_bdy 235 zoffsetu = zoffset 236 istepu(:) = INT( zstepr(:) + zoffset ) 237 ELSEIF(igrd == 3 ) THEN 238 ntimes_bdyv = ntimes_bdy 239 zoffsetv = zoffset 240 istepv(:) = INT( zstepr(:) + zoffset ) 241 ENDIF 240 SELECT CASE( igrd ) 241 CASE (1) 242 ntimes_bdyt = ntimes_bdy 243 zoffsett = zoffset 244 istept(:) = INT( zstepr(:) + zoffset ) 245 numbdyt = inum 246 CASE (2) 247 ntimes_bdyu = ntimes_bdy 248 zoffsetu = zoffset 249 istepu(:) = INT( zstepr(:) + zoffset ) 250 numbdyu = inum 251 CASE (3) 252 ntimes_bdyv = ntimes_bdy 253 zoffsetv = zoffset 254 istepv(:) = INT( zstepr(:) + zoffset ) 255 numbdyv = inum 256 END SELECT 242 257 ! 243 258 END DO ! end loop over T, U & V grid … … 291 306 nbdy_b = it 292 307 ! 293 WRITE(numout,*) 'Time offset is ',zoffset294 WRITE(numout,*) 'First record to read is ',nbdy_b308 IF(lwp) WRITE(numout,*) 'Time offset is ',zoffset 309 IF(lwp) WRITE(numout,*) 'First record to read is ',nbdy_b 295 310 296 311 ENDIF ! endif (nbdy_dta == 1) … … 334 349 ENDIF 335 350 ! 351 #if defined key_lim2 352 IF (ln_bdy_ice_frs) THEN 353 igrd = 1 ! T-points data 354 DO ib = 1, nblen(igrd) 355 frld_bdy(ib) = frld(nbi(ib,igrd), nbj(ib,igrd)) 356 hicif_bdy(ib) = hicif(nbi(ib,igrd), nbj(ib,igrd)) 357 hsnif_bdy(ib) = hsnif(nbi(ib,igrd), nbj(ib,igrd)) 358 END DO 359 ENDIF 360 #endif 336 361 ELSEIF( nbdy_dta == 1 ) THEN ! Set first record in the climatological case: 337 362 ! … … 357 382 nblendta(igrd) = iom_file(numbdyt)%dimsz(1,idvar) 358 383 ENDIF 359 WRITE(numout,*) 'Dim size for votemper is ', nblendta(igrd)384 IF(lwp) WRITE(numout,*) 'Dim size for votemper is ', nblendta(igrd) 360 385 ipi = nblendta(igrd) 361 386 CALL iom_get ( numbdyt, jpdom_unknown, 'votemper', zdta(1:ipi,1:ipj,1:ipk), nbdy_a ) … … 372 397 nblendta(igrd) = iom_file(numbdyt)%dimsz(1,idvar) 373 398 ENDIF 374 WRITE(numout,*) 'Dim size for vosaline is ', nblendta(igrd)399 IF(lwp) WRITE(numout,*) 'Dim size for vosaline is ', nblendta(igrd) 375 400 ipi = nblendta(igrd) 376 401 CALL iom_get ( numbdyt, jpdom_unknown, 'vosaline', zdta(1:ipi,1:ipj,1:ipk), nbdy_a ) … … 390 415 nblendta(igrd) = iom_file(numbdyu)%dimsz(1,idvar) 391 416 ENDIF 392 WRITE(numout,*) 'Dim size for vozocrtx is ', nblendta(igrd)417 IF(lwp) WRITE(numout,*) 'Dim size for vozocrtx is ', nblendta(igrd) 393 418 ipi = nblendta(igrd) 394 419 CALL iom_get ( numbdyu, jpdom_unknown,'vozocrtx',zdta(1:ipi,1:ipj,1:ipk),nbdy_a ) … … 404 429 nblendta(igrd) = iom_file(numbdyv)%dimsz(1,idvar) 405 430 ENDIF 406 WRITE(numout,*) 'Dim size for vomecrty is ', nblendta(igrd)431 IF(lwp) WRITE(numout,*) 'Dim size for vomecrty is ', nblendta(igrd) 407 432 ipi = nblendta(igrd) 408 433 CALL iom_get ( numbdyv, jpdom_unknown,'vomecrty',zdta(1:ipi,1:ipj,1:ipk),nbdy_a ) … … 414 439 ENDIF ! ln_bdy_dyn_frs 415 440 441 #if defined key_lim2 442 IF(ln_bdy_ice_frs) THEN 443 ! 444 igrd=1 ! leads fraction 445 IF(lwp) WRITE(numout,*) 'Dim size for ildsconc is ',nblendta(igrd) 446 ipi=nblendta(igrd) 447 CALL iom_get ( numbdyt, jpdom_unknown,'ildsconc',zdta(1:ipi,:,1),nbdy_a ) 448 DO ib=1, nblen(igrd) 449 frld_bdydta(ib,2) = zdta(nbmap(ib,igrd),1,1) 450 END DO 451 ! 452 igrd=1 ! ice thickness 453 IF(lwp) WRITE(numout,*) 'Dim size for iicethic is ',nblendta(igrd) 454 ipi=nblendta(igrd) 455 CALL iom_get ( numbdyt, jpdom_unknown,'iicethic',zdta(1:ipi,:,1),nbdy_a ) 456 DO ib=1, nblen(igrd) 457 hicif_bdydta(ib,2) = zdta(nbmap(ib,igrd),1,1) 458 END DO 459 ! 460 igrd=1 ! snow thickness 461 IF(lwp) WRITE(numout,*) 'Dim size for isnowthi is ',nblendta(igrd) 462 ipi=nblendta(igrd) 463 CALL iom_get ( numbdyt, jpdom_unknown,'isnowthi',zdta(1:ipi,:,1),nbdy_a ) 464 DO ib=1, nblen(igrd) 465 hsnif_bdydta(ib,2) = zdta(nbmap(ib,igrd),1,1) 466 END DO 467 ENDIF ! just if ln_bdy_ice_frs is set 468 #endif 416 469 417 470 IF ((.NOT.ln_bdy_clim) .AND. (istep(1) > 0)) THEN … … 427 480 vbdydta(:,:,1) = vbdydta(:,:,2) 428 481 ENDIF 482 #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 429 489 END IF 430 490 … … 441 501 vbdy (:,:) = vbdydta (:,:,2) 442 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 443 510 444 511 IF(ln_bdy_tra_frs .or. ln_bdy_ice_frs) CALL iom_close( numbdyt ) … … 483 550 vbdydta(:,:,1) = vbdydta(:,:,2) 484 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 558 #endif 485 559 END IF ! nbdy_a < ntimes_bdy 486 560 … … 497 571 vbdydta(:,:,1) = vbdydta(:,:,2) 498 572 ENDIF 499 573 #if defined key_lim2 574 IF(ln_bdy_ice_frs) THEN 575 frld_bdydta (:,1) = frld_bdydta (:,2) 576 hicif_bdydta(:,1) = hicif_bdydta(:,2) 577 hsnif_bdydta(:,1) = hsnif_bdydta(:,2) 578 ENDIF 579 #endif 500 580 ! read another set 501 581 ipj = 1 … … 543 623 END DO 544 624 ENDIF ! ln_bdy_dyn_frs 545 625 ! 626 #if defined key_lim2 627 IF(ln_bdy_ice_frs) THEN 628 ! 629 igrd = 1 ! ice concentration 630 ipi=nblendta(igrd) 631 CALL iom_get ( numbdyt, jpdom_unknown,'ildsconc',zdta(1:ipi,:,1),nbdy_a ) 632 DO ib=1, nblen(igrd) 633 frld_bdydta(ib,2) = zdta( nbmap(ib,igrd), 1, 1 ) 634 END DO 635 ! 636 igrd=1 ! ice thickness 637 ipi=nblendta(igrd) 638 CALL iom_get ( numbdyt, jpdom_unknown,'iicethic',zdta(1:ipi,:,1),nbdy_a ) 639 DO ib=1, nblen(igrd) 640 hicif_bdydta(ib,2) = zdta( nbmap(ib,igrd), 1, 1 ) 641 END DO 642 ! 643 igrd=1 ! snow thickness 644 ipi=nblendta(igrd) 645 CALL iom_get ( numbdyt, jpdom_unknown,'isnowthi',zdta(1:ipi,:,1),nbdy_a ) 646 DO ib=1, nblen(igrd) 647 hsnif_bdydta(ib,2) = zdta( nbmap(ib,igrd), 1, 1 ) 648 END DO 649 ENDIF ! ln_bdy_ice_frs 650 #endif 546 651 ! 547 652 IF(lwp) WRITE(numout,*) 'bdy_dta : first record file used nbdy_b ',nbdy_b … … 559 664 ! ******************** 560 665 ! 561 IF( ln_bdy_clim ) THEN ; zxy = REAL( nday , wp ) / REAL( nmonth_len(nbdy_b), wp ) + 0.5 - i15 562 ELSE ; zxy = REAL( istep(nbdy_b) - itimer, wp ) / REAL( istep(nbdy_b) - istep(nbdy_a), wp ) 666 IF( ln_bdy_clim ) THEN ; zxy = REAL( nday ) / REAL( nmonth_len(nbdy_b) ) + 0.5 - i15 667 ELSEIF( istep(nbdy_b) == istep(nbdy_a) ) THEN 668 zxy = 0.0_wp 669 ELSE ; zxy = REAL( istep(nbdy_b) - itimer ) / REAL( istep(nbdy_b) - istep(nbdy_a) ) 563 670 END IF 564 671 … … 589 696 ENDIF 590 697 698 #if defined key_lim2 699 IF(ln_bdy_ice_frs) THEN 700 igrd=1 701 DO ib=1, nblen(igrd) 702 frld_bdy(ib) = zxy * frld_bdydta(ib,2) + (1.-zxy) * frld_bdydta(ib,1) 703 hicif_bdy(ib) = zxy * hicif_bdydta(ib,2) + (1.-zxy) * hicif_bdydta(ib,1) 704 hsnif_bdy(ib) = zxy * hsnif_bdydta(ib,2) + (1.-zxy) * hsnif_bdydta(ib,1) 705 END DO 706 ENDIF ! just if ln_bdy_ice_frs is true 707 #endif 708 591 709 END IF !end if ((nbdy_dta==1).AND.(ntimes_bdy>1)) 592 710 … … 606 724 607 725 608 SUBROUTINE bdy_dta_bt( kt, jit )726 SUBROUTINE bdy_dta_bt( kt, jit, icycl ) 609 727 !!--------------------------------------------------------------------------- 610 728 !! *** SUBROUTINE bdy_dta_bt *** … … 620 738 INTEGER, INTENT( in ) :: kt ! ocean time-step index 621 739 INTEGER, INTENT( in ) :: jit ! barotropic time step index 740 INTEGER, INTENT( in ) :: icycl ! number of cycles need for final file close 622 741 ! ! (for timesplitting option, otherwise zero) 623 742 !! … … 639 758 REAL(wp), DIMENSION(jpbtime) :: zstepr ! REAL time array from data files 640 759 REAL(wp), DIMENSION(jpbdta,1) :: zdta ! temporary array for data fields 641 CHARACTER(LEN=80), DIMENSION( 3) :: clfile760 CHARACTER(LEN=80), DIMENSION(6) :: clfile 642 761 CHARACTER(LEN=70 ) :: clunits ! units attribute of time coordinate 643 762 !!--------------------------------------------------------------------------- … … 688 807 689 808 ! !-------------------! 690 IF( kt == nit000 ) THEN! First call only !809 IF( kt == nit000 .and. jit ==2 ) THEN ! First call only ! 691 810 ! !-------------------! 692 811 istep_bt(:) = 0 … … 712 831 ! necessary time dumps in file are included 713 832 714 clfile( 1) = filbdy_data_bt_T715 clfile( 2) = filbdy_data_bt_U716 clfile( 3) = filbdy_data_bt_V717 718 DO igrd = 1,3833 clfile(4) = filbdy_data_bt_T 834 clfile(5) = filbdy_data_bt_U 835 clfile(6) = filbdy_data_bt_V 836 837 DO igrd = 4,6 719 838 720 839 CALL iom_open( clfile(igrd), inum ) 721 CALL iom_gettime( inum, zstepr, kntime=ntimes_bdy , cdunits=clunits )840 CALL iom_gettime( inum, zstepr, kntime=ntimes_bdy_bt, cdunits=clunits ) 722 841 723 842 SELECT CASE( igrd ) 724 CASE ( 1)725 numbdyt = inum726 CASE ( 2)727 numbdyu = inum728 CASE ( 3)729 numbdyv = inum843 CASE (4) 844 numbdyt_bt = inum 845 CASE (5) 846 numbdyu_bt = inum 847 CASE (6) 848 numbdyv_bt = inum 730 849 END SELECT 731 850 … … 757 876 758 877 ! Check that time array increases (or interp will fail): 759 DO it = 2, ntimes_bdy 878 DO it = 2, ntimes_bdy_bt 760 879 IF ( zstepr(it-1) >= zstepr(it) ) THEN 761 880 CALL ctl_stop('Time array in unstructured boundary data file', & … … 778 897 ! The same applies to the last time level: see setting of lect below. 779 898 780 IF ( ntimes_bdy == 1 ) CALL ctl_stop( &899 IF ( ntimes_bdy_bt == 1 ) CALL ctl_stop( & 781 900 'There is only one time dump in data files', & 782 901 'Set ln_bdy_clim=.true. in namelist for constant bdy forcing.' ) 783 902 784 903 zinterval_s = zstepr(2) - zstepr(1) 785 zinterval_e = zstepr(ntimes_bdy) - zstepr(ntimes_bdy-1) 786 787 IF ( zstepr(1) - zinterval_s / 2.0 > 0 ) THEN 788 IF(lwp) WRITE(numout,*) 'First bdy time relative to nit000:', zstepr(1) 789 IF(lwp) WRITE(numout,*) 'Interval between first two times: ', zinterval_s 790 CALL ctl_stop( 'First data time is after start of run', & 791 'by more than half a meaning period', & 792 'Check file: ' // TRIM(clfile(igrd)) ) 904 zinterval_e = zstepr(ntimes_bdy_bt) - zstepr(ntimes_bdy_bt-1) 905 906 IF( zstepr(1) + zoffset > 0 ) THEN 907 WRITE(ctmp1,*) 'Check file: ', clfile(igrd) 908 CALL ctl_stop( 'First time dump in bdy file is after model initial time', ctmp1 ) 793 909 END IF 794 795 IF ( zstepr(ntimes_bdy) + zinterval_e / 2.0 < totime ) THEN 796 IF(lwp) WRITE(numout,*) 'Last bdy time relative to nit000:', zstepr(ntimes_bdy) 797 IF(lwp) WRITE(numout,*) 'Interval between last two times: ', zinterval_e 798 CALL ctl_stop( 'Last data time is before end of run', & 799 'by more than half a meaning period', & 800 'Check file: ' // TRIM(clfile(igrd)) ) 910 IF( zstepr(ntimes_bdy_bt) + zoffset < totime ) THEN 911 WRITE(ctmp1,*) 'Check file: ', clfile(igrd) 912 CALL ctl_stop( 'Last time dump in bdy file is before model final time', ctmp1 ) 801 913 END IF 802 803 914 END IF ! .NOT. ln_bdy_clim 804 915 805 IF ( igrd .EQ. 1) THEN916 IF ( igrd .EQ. 4) THEN 806 917 ntimes_bdyt = ntimes_bdy_bt 807 918 zoffsett = zoffset 808 919 istept(:) = INT( zstepr(:) + zoffset ) 809 ELSE IF (igrd .EQ. 2) THEN920 ELSE IF (igrd .EQ. 5) THEN 810 921 ntimes_bdyu = ntimes_bdy_bt 811 922 zoffsetu = zoffset 812 923 istepu(:) = INT( zstepr(:) + zoffset ) 813 ELSE IF (igrd .EQ. 3) THEN924 ELSE IF (igrd .EQ. 6) THEN 814 925 ntimes_bdyv = ntimes_bdy_bt 815 926 zoffsetv = zoffset … … 865 976 nbdy_b_bt = it 866 977 867 WRITE(numout,*) 'Time offset is ',zoffset868 WRITE(numout,*) 'First record to read is ',nbdy_b_bt978 IF(lwp) WRITE(numout,*) 'Time offset is ',zoffset 979 IF(lwp) WRITE(numout,*) 'First record to read is ',nbdy_b_bt 869 980 870 981 ENDIF ! endif (nbdy_dta == 1) … … 875 986 IF ( nbdy_dta == 0) THEN 876 987 ! boundary data arrays are filled with initial conditions 877 igrd = 2! U-points data988 igrd = 5 ! U-points data 878 989 DO ib = 1, nblen(igrd) 879 990 ubtbdy(ib) = un(nbi(ib,igrd), nbj(ib,igrd), 1) 880 991 END DO 881 992 882 igrd = 3! V-points data993 igrd = 6 ! V-points data 883 994 DO ib = 1, nblen(igrd) 884 995 vbtbdy(ib) = vn(nbi(ib,igrd), nbj(ib,igrd), 1) 885 996 END DO 886 997 887 igrd = 1! T-points data998 igrd = 4 ! T-points data 888 999 DO ib = 1, nblen(igrd) 889 1000 sshbdy(ib) = sshn(nbi(ib,igrd), nbj(ib,igrd)) … … 910 1021 ! Read first record: 911 1022 ipj=1 912 igrd= 11023 igrd=4 913 1024 ipi=nblendta(igrd) 914 1025 915 1026 ! ssh 916 igrd= 11027 igrd=4 917 1028 IF ( nblendta(igrd) .le. 0 ) THEN 918 1029 idvar = iom_varid( numbdyt_bt,'sossheig' ) … … 929 1040 930 1041 ! u-velocity 931 igrd= 21042 igrd=5 932 1043 IF ( nblendta(igrd) .le. 0 ) THEN 933 1044 idvar = iom_varid( numbdyu_bt,'vobtcrtx' ) … … 944 1055 945 1056 ! v-velocity 946 igrd= 31057 igrd=6 947 1058 IF ( nblendta(igrd) .le. 0 ) THEN 948 1059 idvar = iom_varid( numbdyv_bt,'vobtcrty' ) … … 1010 1121 ipj=1 1011 1122 ipk=jpk 1012 igrd= 11123 igrd=4 1013 1124 ipi=nblendta(igrd) 1014 1125 1015 1126 1016 1127 ! ssh 1017 igrd= 11128 igrd=4 1018 1129 ipi=nblendta(igrd) 1019 1130 … … 1025 1136 1026 1137 ! u-velocity 1027 igrd= 21138 igrd=5 1028 1139 ipi=nblendta(igrd) 1029 1140 … … 1035 1146 1036 1147 ! v-velocity 1037 igrd= 31148 igrd=6 1038 1149 ipi=nblendta(igrd) 1039 1150 … … 1064 1175 END IF 1065 1176 1066 igrd= 11177 igrd=4 1067 1178 DO ib=1, nblen(igrd) 1068 1179 sshbdy(ib) = zxy * sshbdydta(ib,2) + & … … 1070 1181 END DO 1071 1182 1072 igrd= 21183 igrd=5 1073 1184 DO ib=1, nblen(igrd) 1074 1185 ubtbdy(ib) = zxy * ubtbdydta(ib,2) + & … … 1076 1187 END DO 1077 1188 1078 igrd= 31189 igrd=6 1079 1190 DO ib=1, nblen(igrd) 1080 1191 vbtbdy(ib) = zxy * vbtbdydta(ib,2) + & … … 1090 1201 1091 1202 ! Closing of the 3 files 1092 IF( kt == nitend ) THEN1203 IF( kt == nitend .and. jit == icycl ) THEN 1093 1204 CALL iom_close( numbdyt_bt ) 1094 1205 CALL iom_close( numbdyu_bt ) … … 1109 1220 WRITE(*,*) 'bdy_dta: You should not have seen this print! error?', kt 1110 1221 END SUBROUTINE bdy_dta 1111 SUBROUTINE bdy_dta_bt( kt, kit ) ! Empty routine1222 SUBROUTINE bdy_dta_bt( kt, kit, icycle ) ! Empty routine 1112 1223 WRITE(*,*) 'bdy_dta: You should not have seen this print! error?', kt, kit 1113 1224 END SUBROUTINE bdy_dta_bt
Note: See TracChangeset
for help on using the changeset viewer.