- Timestamp:
- 2013-06-26T09:54:16+02:00 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2013/dev_r3406_CNRS_LIM3/NEMOGCM/NEMO/OPA_SRC/BDY/bdydta.F90
r3294 r3938 11 11 !! 3.3 ! 2010-09 (D.Storkey) add ice boundary conditions 12 12 !! 3.4 ! 2011 (D. Storkey) rewrite in preparation for OBC-BDY merge 13 !! - ! 2012-01 (C. Rousset) add ice boundary conditions for lim3 13 14 !!---------------------------------------------------------------------- 14 15 #if defined key_bdy … … 31 32 #if defined key_lim2 32 33 USE ice_2 34 #elif defined key_lim3 35 USE par_ice 36 USE ice 37 USE limcat_1D ! redistribute ice input into categories 33 38 #endif 34 39 … … 48 53 49 54 TYPE(MAP_POINTER), ALLOCATABLE, DIMENSION(:) :: nbmap_ptr ! array of pointers to nbmap 55 56 #if defined key_lim3 57 LOGICAL :: ll_bdylim3 ! determine whether ice input is lim2 (F) or lim3 (T) type 58 INTEGER :: jfld_hti, jfld_hts, jfld_ai ! indices of ice thickness, snow thickness and concentration in bf structure 59 #endif 50 60 51 61 # include "domzgr_substitute.h90" … … 76 86 ! etc. 77 87 !! 78 INTEGER :: ib_bdy, jfld, jstart, jend, ib, ii, ij, ik, igrd ! local indices88 INTEGER :: ib_bdy, jfld, jstart, jend, ib, ii, ij, ik, igrd, jl ! local indices 79 89 INTEGER, DIMENSION(jpbgrd) :: ilen1 80 90 INTEGER, POINTER, DIMENSION(:) :: nblen, nblenrim ! short cuts … … 175 185 176 186 #if defined key_lim2 177 IF( nn_ice_lim 2(ib_bdy) .gt. 0 .and. nn_ice_lim2_dta(ib_bdy) .eq. 0 ) THEN178 IF( nn_ice_lim 2(ib_bdy) .eq. jp_frs ) THEN187 IF( nn_ice_lim(ib_bdy) .gt. 0 .and. nn_ice_lim_dta(ib_bdy) .eq. 0 ) THEN 188 IF( nn_ice_lim(ib_bdy) .eq. jp_frs ) THEN 179 189 ilen1(:) = nblen(:) 180 190 ELSE … … 185 195 ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 186 196 ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 187 dta_bdy(ib_bdy)%frld (ib) =frld(ii,ij) * tmask(ii,ij,1)197 dta_bdy(ib_bdy)%frld (ib) = frld(ii,ij) * tmask(ii,ij,1) 188 198 dta_bdy(ib_bdy)%hicif(ib) = hicif(ii,ij) * tmask(ii,ij,1) 189 199 dta_bdy(ib_bdy)%hsnif(ib) = hsnif(ii,ij) * tmask(ii,ij,1) 190 200 END DO 201 ENDIF 202 #elif defined key_lim3 203 IF( nn_ice_lim(ib_bdy) .gt. 0 .and. nn_ice_lim_dta(ib_bdy) .eq. 0 ) THEN 204 IF( nn_ice_lim(ib_bdy) .eq. jp_frs ) THEN 205 ilen1(:) = nblen(:) 206 ELSE 207 ilen1(:) = nblenrim(:) 208 ENDIF 209 igrd = 1 ! Everything is at T-points here 210 DO jl = 1, jpl 211 DO ib = 1, ilen1(igrd) 212 ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 213 ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 214 dta_bdy(ib_bdy)%a_i (ib,jl) = a_i(ii,ij,jl) * tmask(ii,ij,1) 215 dta_bdy(ib_bdy)%ht_i(ib,jl) = ht_i(ii,ij,jl) * tmask(ii,ij,1) 216 dta_bdy(ib_bdy)%ht_s(ib,jl) = ht_s(ii,ij,jl) * tmask(ii,ij,1) 217 END DO 218 END DO 191 219 ENDIF 192 220 #endif … … 237 265 CALL tide_update( kt=kt, idx=idx_bdy(ib_bdy), dta=dta_bdy(ib_bdy), td=tides(ib_bdy), time_offset=time_offset ) 238 266 ENDIF 267 268 #if defined key_lim3 269 IF( nn_ice_lim(ib_bdy) .gt. 0 .and. nn_ice_lim_dta(ib_bdy) .eq. 1 ) THEN ! bdy ice input 270 IF ( .NOT. ll_bdylim3 ) THEN ! case input is lim2 type 271 CALL lim_cat_1D ( bf(jfld_hti)%fnow(:,1,1), bf(jfld_hts)%fnow(:,1,1), bf(jfld_ai)%fnow(:,1,1), & 272 & dta_bdy(ib_bdy)%ht_i, dta_bdy(ib_bdy)%ht_s, dta_bdy(ib_bdy)%a_i ) 273 ENDIF 274 ENDIF 275 #endif 276 239 277 ENDIF 240 278 jstart = jend+1 … … 311 349 INTEGER, ALLOCATABLE, DIMENSION(:) :: igrid ! index for grid type (1,2,3 = T,U,V) 312 350 INTEGER, POINTER, DIMENSION(:) :: nblen, nblenrim ! short cuts 351 #if defined key_lim3 352 INTEGER, DIMENSION(3) :: zdimsz ! number of elements in each of the 4 dimensions (i.e. i,j,t,ice-cat) for an array 353 INTEGER :: zndims ! number of dimensions in an array (i.e. 3 = wo ice cat; 4 = w ice cat) 354 INTEGER :: inum,id1 ! local integer 355 #endif 313 356 TYPE(FLD_N), ALLOCATABLE, DIMENSION(:) :: blf_i ! array of namelist information structures 314 357 TYPE(FLD_N) :: bn_tem, bn_sal, bn_u3d, bn_v3d ! 315 358 TYPE(FLD_N) :: bn_ssh, bn_u2d, bn_v2d ! informations about the fields to be read 316 359 #if defined key_lim2 317 TYPE(FLD_N) :: bn_frld, bn_hicif, bn_hsnif ! 360 TYPE(FLD_N) :: bn_frld, bn_hicif, bn_hsnif 361 #elif defined key_lim3 362 TYPE(FLD_N) :: bn_a_i, bn_ht_i, bn_ht_s 318 363 #endif 319 364 NAMELIST/nambdy_dta/ cn_dir, bn_tem, bn_sal, bn_u3d, bn_v3d, bn_ssh, bn_u2d, bn_v2d 320 365 #if defined key_lim2 321 366 NAMELIST/nambdy_dta/ bn_frld, bn_hicif, bn_hsnif 367 #elif defined key_lim3 368 NAMELIST/nambdy_dta/ bn_a_i, bn_ht_i, bn_ht_s 322 369 #endif 323 370 NAMELIST/nambdy_dta/ ln_full_vel … … 326 373 IF( nn_timing == 1 ) CALL timing_start('bdy_dta_init') 327 374 328 ! Set nn_dta 375 ! Set nn_dta to 0 or 1 329 376 DO ib_bdy = 1, nb_bdy 330 nn_dta(ib_bdy) = MAX( 331 332 333 #if defined key_lim2334 ,nn_ice_lim2_dta(ib_bdy) &377 nn_dta(ib_bdy) = MAX( nn_dyn2d_dta(ib_bdy) & 378 ,nn_dyn3d_dta(ib_bdy) & 379 ,nn_tra_dta(ib_bdy) & 380 #if ( defined key_lim2 || defined key_lim3 ) 381 ,nn_ice_lim_dta(ib_bdy) & 335 382 #endif 336 383 ) … … 352 399 nb_bdy_fld(ib_bdy) = nb_bdy_fld(ib_bdy) + 2 353 400 ENDIF 354 #if defined key_lim2355 IF( nn_ice_lim 2(ib_bdy) .gt. 0 .and. nn_ice_lim2_dta(ib_bdy) .eq. 1 ) THEN401 #if ( defined key_lim2 || defined key_lim3 ) 402 IF( nn_ice_lim(ib_bdy) .gt. 0 .and. nn_ice_lim_dta(ib_bdy) .eq. 1 ) THEN 356 403 nb_bdy_fld(ib_bdy) = nb_bdy_fld(ib_bdy) + 3 357 404 ENDIF … … 377 424 ALLOCATE( igrid(nb_bdy_fld_sum) ) 378 425 379 426 ! Read namelists 380 427 ! -------------- 381 428 REWIND(numnam) … … 387 434 ln_full_vel = .false. 388 435 ! ... default values (NB: frequency positive => hours, negative => months) 389 ! ! file ! frequency ! variable! time intep ! clim ! 'yearly' or ! weights ! rotation !390 ! ! name ! hours ! name ! (T/F)! (T/F) ! 'monthly' ! filename ! pairs !391 bn_ssh = FLD_N( 'bdy_ssh' , 24 , 'sossheig' , .false., .false. , 'yearly' , '' , '' )392 bn_u2d = FLD_N( 'bdy_vel2d_u' , 24 , 'vobtcrtx' , .false., .false. , 'yearly' , '' , '' )393 bn_v2d = FLD_N( 'bdy_vel2d_v' , 24 , 'vobtcrty' , .false., .false. , 'yearly' , '' , '' )394 bn_u3d = FLD_N( 'bdy_vel3d_u' , 24 , 'vozocrtx' , .false., .false. , 'yearly' , '' , '' )395 bn_v3d = FLD_N( 'bdy_vel3d_v' , 24 , 'vomecrty' , .false., .false. , 'yearly' , '' , '' )396 bn_tem = FLD_N( 'bdy_tem' , 24 , 'votemper' , .false., .false. , 'yearly' , '' , '' )397 bn_sal = FLD_N( 'bdy_sal' , 24 , 'vosaline' , .false., .false. , 'yearly' , '' , '' )436 ! ! file ! frequency ! variable ! time intep ! clim ! 'yearly' or ! weights ! rotation ! 437 ! ! name ! hours ! name ! (T/F) ! (T/F) ! 'monthly' ! filename ! pairs ! 438 bn_ssh = FLD_N( 'bdy_ssh' , 24 , 'sossheig' , .false. , .false. , 'yearly' , '' , '' ) 439 bn_u2d = FLD_N( 'bdy_vel2d_u' , 24 , 'vobtcrtx' , .false. , .false. , 'yearly' , '' , '' ) 440 bn_v2d = FLD_N( 'bdy_vel2d_v' , 24 , 'vobtcrty' , .false. , .false. , 'yearly' , '' , '' ) 441 bn_u3d = FLD_N( 'bdy_vel3d_u' , 24 , 'vozocrtx' , .false. , .false. , 'yearly' , '' , '' ) 442 bn_v3d = FLD_N( 'bdy_vel3d_v' , 24 , 'vomecrty' , .false. , .false. , 'yearly' , '' , '' ) 443 bn_tem = FLD_N( 'bdy_tem' , 24 , 'votemper' , .false. , .false. , 'yearly' , '' , '' ) 444 bn_sal = FLD_N( 'bdy_sal' , 24 , 'vosaline' , .false. , .false. , 'yearly' , '' , '' ) 398 445 #if defined key_lim2 399 bn_frld = FLD_N( 'bdy_frld' , 24 , 'ildsconc' , .false. , .false. , 'yearly' , '' , '' ) 400 bn_hicif = FLD_N( 'bdy_hicif' , 24 , 'iicethic' , .false. , .false. , 'yearly' , '' , '' ) 401 bn_hsnif = FLD_N( 'bdy_hsnif' , 24 , 'isnothic' , .false. , .false. , 'yearly' , '' , '' ) 446 bn_frld = FLD_N( 'bdy_frld' , 24 , 'ildsconc' , .false. , .false. , 'yearly' , '' , '' ) 447 bn_hicif = FLD_N( 'bdy_hicif' , 24 , 'iicethic' , .false. , .false. , 'yearly' , '' , '' ) 448 bn_hsnif = FLD_N( 'bdy_hsnif' , 24 , 'isnothic' , .false. , .false. , 'yearly' , '' , '' ) 449 #elif defined key_lim3 450 bn_a_i = FLD_N( 'bdy_a_i' , 24 , 'ileadfra' , .false. , .false. , 'yearly' , '' , '' ) 451 bn_ht_i = FLD_N( 'bdy_ht_i' , 24 , 'iicethic' , .false. , .false. , 'yearly' , '' , '' ) 452 bn_ht_s = FLD_N( 'bdy_ht_s' , 24 , 'isnowthi' , .false. , .false. , 'yearly' , '' , '' ) 402 453 #endif 403 454 … … 515 566 #if defined key_lim2 516 567 ! sea ice 517 IF( nn_ice_lim 2(ib_bdy) .gt. 0 .and. nn_ice_lim2_dta(ib_bdy) .eq. 1 ) THEN568 IF( nn_ice_lim(ib_bdy) .gt. 0 .and. nn_ice_lim_dta(ib_bdy) .eq. 1 ) THEN 518 569 519 570 jfld = jfld + 1 … … 521 572 ibdy(jfld) = ib_bdy 522 573 igrid(jfld) = 1 523 IF( nn_ice_lim 2(ib_bdy) .eq. jp_frs ) THEN574 IF( nn_ice_lim(ib_bdy) .eq. jp_frs ) THEN 524 575 ilen1(jfld) = nblen(igrid(jfld)) 525 576 ELSE … … 532 583 ibdy(jfld) = ib_bdy 533 584 igrid(jfld) = 1 534 IF( nn_ice_lim 2(ib_bdy) .eq. jp_frs ) THEN585 IF( nn_ice_lim(ib_bdy) .eq. jp_frs ) THEN 535 586 ilen1(jfld) = nblen(igrid(jfld)) 536 587 ELSE … … 543 594 ibdy(jfld) = ib_bdy 544 595 igrid(jfld) = 1 545 IF( nn_ice_lim 2(ib_bdy) .eq. jp_frs ) THEN596 IF( nn_ice_lim(ib_bdy) .eq. jp_frs ) THEN 546 597 ilen1(jfld) = nblen(igrid(jfld)) 547 598 ELSE … … 549 600 ENDIF 550 601 ilen3(jfld) = 1 602 603 ENDIF 604 #elif defined key_lim3 605 ! sea ice 606 IF( nn_ice_lim(ib_bdy) .gt. 0 .and. nn_ice_lim_dta(ib_bdy) .eq. 1 ) THEN 607 608 ! Test for types of ice input (lim2 or lim3) 609 CALL iom_open ( bn_a_i%clname, inum ) 610 id1 = iom_varid ( inum, bn_a_i%clvar, kdimsz=zdimsz, kndims=zndims, ldstop = .FALSE. ) 611 CALL iom_close ( inum ) 612 !CALL fld_clopn ( bn_a_i, nyear, nmonth, nday, ldstop=.TRUE. ) 613 !CALL iom_open ( bn_a_i%clname, inum ) 614 !id1 = iom_varid ( bn_a_i%num, bn_a_i%clvar, kdimsz=zdimsz, kndims=zndims, ldstop = .FALSE. ) 615 IF ( zndims == 4 ) THEN 616 ll_bdylim3 = .TRUE. 617 ELSE 618 ll_bdylim3 = .FALSE. 619 ENDIF 620 ! End test 621 622 jfld = jfld + 1 623 blf_i(jfld) = bn_a_i 624 ibdy(jfld) = ib_bdy 625 igrid(jfld) = 1 626 IF( nn_ice_lim(ib_bdy) .eq. jp_frs ) THEN 627 ilen1(jfld) = nblen(igrid(jfld)) 628 ELSE 629 ilen1(jfld) = nblenrim(igrid(jfld)) 630 ENDIF 631 IF ( ll_bdylim3 ) THEN ; ilen3(jfld)=jpl ; ELSE ; ilen3(jfld)=1 ; ENDIF 632 633 jfld = jfld + 1 634 blf_i(jfld) = bn_ht_i 635 ibdy(jfld) = ib_bdy 636 igrid(jfld) = 1 637 IF( nn_ice_lim(ib_bdy) .eq. jp_frs ) THEN 638 ilen1(jfld) = nblen(igrid(jfld)) 639 ELSE 640 ilen1(jfld) = nblenrim(igrid(jfld)) 641 ENDIF 642 IF ( ll_bdylim3 ) THEN ; ilen3(jfld)=jpl ; ELSE ; ilen3(jfld)=1 ; ENDIF 643 644 jfld = jfld + 1 645 blf_i(jfld) = bn_ht_s 646 ibdy(jfld) = ib_bdy 647 igrid(jfld) = 1 648 IF( nn_ice_lim(ib_bdy) .eq. jp_frs ) THEN 649 ilen1(jfld) = nblen(igrid(jfld)) 650 ELSE 651 ilen1(jfld) = nblenrim(igrid(jfld)) 652 ENDIF 653 IF ( ll_bdylim3 ) THEN ; ilen3(jfld)=jpl ; ELSE ; ilen3(jfld)=1 ; ENDIF 551 654 552 655 ENDIF … … 652 755 653 756 #if defined key_lim2 654 IF (nn_ice_lim 2(ib_bdy) .gt. 0) THEN655 IF( nn_ice_lim 2_dta(ib_bdy) .eq. 0 ) THEN656 IF( nn_ice_lim 2(ib_bdy) .eq. jp_frs ) THEN757 IF (nn_ice_lim(ib_bdy) .gt. 0) THEN 758 IF( nn_ice_lim_dta(ib_bdy) .eq. 0 ) THEN 759 IF( nn_ice_lim(ib_bdy) .eq. jp_frs ) THEN 657 760 ilen0(1:3) = nblen(1:3) 658 761 ELSE … … 669 772 jfld = jfld + 1 670 773 dta_bdy(ib_bdy)%hsnif => bf(jfld)%fnow(:,1,1) 774 ENDIF 775 ENDIF 776 #elif defined key_lim3 777 IF (nn_ice_lim(ib_bdy) .gt. 0) THEN 778 IF( nn_ice_lim(ib_bdy) .eq. jp_frs ) THEN 779 ilen0(1:3) = nblen(1:3) 780 ELSE 781 ilen0(1:3) = nblenrim(1:3) 782 ENDIF 783 IF( nn_ice_lim_dta(ib_bdy) .eq. 0 ) THEN 784 ALLOCATE( dta_bdy(ib_bdy)%a_i (ilen0(1),jpl) ) 785 ALLOCATE( dta_bdy(ib_bdy)%ht_i(ilen0(1),jpl) ) 786 ALLOCATE( dta_bdy(ib_bdy)%ht_s(ilen0(1),jpl) ) 787 ELSE 788 IF ( ll_bdylim3 ) THEN 789 jfld = jfld + 1 790 dta_bdy(ib_bdy)%a_i => bf(jfld)%fnow(:,1,:) 791 jfld = jfld + 1 792 dta_bdy(ib_bdy)%ht_i => bf(jfld)%fnow(:,1,:) 793 jfld = jfld + 1 794 dta_bdy(ib_bdy)%ht_s => bf(jfld)%fnow(:,1,:) 795 ELSE 796 jfld = jfld + 1 797 jfld_ai = jfld 798 ALLOCATE( dta_bdy(ib_bdy)%a_i (ilen0(1),jpl) ) 799 dta_bdy(ib_bdy)%a_i(:,:) = 0.0 800 jfld = jfld + 1 801 jfld_hti = jfld 802 ALLOCATE( dta_bdy(ib_bdy)%ht_i(ilen0(1),jpl) ) 803 dta_bdy(ib_bdy)%ht_i(:,:) = 0.0 804 jfld = jfld + 1 805 jfld_hts = jfld 806 ALLOCATE( dta_bdy(ib_bdy)%ht_s(ilen0(1),jpl) ) 807 dta_bdy(ib_bdy)%ht_s(:,:) = 0.0 808 ENDIF 809 671 810 ENDIF 672 811 ENDIF
Note: See TracChangeset
for help on using the changeset viewer.