Changeset 329
- Timestamp:
- 01/26/21 11:47:38 (3 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SOURCES/lake_rsl_mod.f90
r327 r329 172 172 !~ write(*,*) "Start Initialization step" 173 173 174 !* The routing code (i=1, j=2) 175 inc(1,1) = 0 176 inc(1,2) = 1 177 inc(2,1) = 1 178 inc(2,2) = 1 179 inc(3,1) = 1 180 inc(3,2) = 0 181 inc(4,1) = 1 182 inc(4,2) = -1 183 inc(5,1) = 0 184 inc(5,2) = -1 185 inc(6,1) = -1 186 inc(6,2) = -1 187 inc(7,1) = -1 188 inc(7,2) = 0 189 inc(8,1) = -1 190 inc(8,2) = 1 174 !* The routing code (1er indice : k=1,8, 2eme indice i=1, j=2) 175 inc(1,1) = 0 ! indice i N 176 inc(1,2) = 1 ! indice j N 177 inc(2,1) = 1 ! indice i NE 178 inc(2,2) = 1 ! indice j NE 179 inc(3,1) = 1 ! indice i E 180 inc(3,2) = 0 ! indice j E 181 inc(4,1) = 1 ! indice i SE 182 inc(4,2) = -1 ! indice j SE 183 inc(5,1) = 0 ! indice i S 184 inc(5,2) = -1 ! indice j S 185 inc(6,1) = -1 ! indice i SW 186 inc(6,2) = -1 ! indice j SW 187 inc(7,1) = -1 ! indice i W 188 inc(7,2) = 0 ! indice j W 189 inc(8,1) = -1 ! indice i NW 190 inc(8,2) = 1 ! indice j NW 191 192 !~ print* 193 !~ print*,'rtm directions :' 194 !~ print*,'1 : N' 195 !~ print*,'2 : NE' 196 !~ print*,'3 : E' 197 !~ print*,'4 : SE' 198 !~ print*,'5 : S' 199 !~ print*,'6 : SW' 200 !~ print*,'7 : W' 201 !~ print*,'8 : NW' 202 !~ print* 191 203 192 204 … … 230 242 231 243 ! calcul de la matrice de passage de 40km => hi_res (10km) 232 !do j=5,ny-4233 ! do i=5,nx-4234 244 do j=1,nyhi 235 245 do i=1,nxhi 236 !j=5237 !i=5238 ! do k=1,ninterpo239 ! low_2_hi(i,j,k) = nint((i-1)/4)240 ! enddo241 246 low_2_hi_i(i,j,1) = max(nint((i-1)/4.),1) 242 247 low_2_hi_i(i,j,2) = min(low_2_hi_i(i,j,1) + 1,nx) … … 280 285 endif 281 286 282 !~ print*,'Input RSL'283 !~ print*,'65,166 S0 H0 Bsoc0 ',S0(65,166), H0(65,166), Bsoc0(65,166)284 !~ print*,'260,664 S0 H0 Bsoc0 ',S0_hi(260,664), H0_hi(260,664), Bsoc0_hi(260,664)285 !~ print*,'65,166 S H Bsoc ',S(65,166), H(65,166), Bsoc(65,166)286 !~ print*,'260,664 Shi Hhi Bsochi ',S_hi(260,664), H_hi(260,664), Bsoc_hi(260,664)287 !~ print*,'260,664 anom Shi Hhi Bsochi ',anom_S_hi(260,664), anom_H_hi(260,664), anom_Bsoc_hi(260,664)288 289 290 !print*, 'input_rsl poids', poids(5,5,:)291 !print*,low_2_hi_i(i,j,:)292 !print*,low_2_hi_j(i,j,:)293 !print*,dist_i(:)294 !print*,dist_j(:)295 !print*,dist_ij(:)296 !print*,sum(dist_ij(:))297 !print*,xcc(1,1),xcc(2,2),ycc(1,1),ycc(2,2),xcc(nx,ny),ycc(nx,ny)298 !print*,xcc_hi(1,1),ycc_hi(1,1)299 !print*,xcc_hi(5,5),xcc_hi(6,6),ycc_hi(5,5),ycc_hi(6,6),xcc_hi(nxhi,nyhi),ycc_hi(nxhi,nyhi)300 !print*, xcc(low_2_hi_i(i,j,1),low_2_hi_j(i,j,1))-xcc_hi(i,j)301 !~ print*,'Fin input_rsl'302 303 287 end subroutine input_rsl 304 288 … … 318 302 character(len=100) :: ncfilecont, ncfilernff, ncfiletopoout,ncfilecmsk ! nom fichier netcdf de sortie 319 303 character(len=1),dimension(2) :: dimname ! nom des dimensions du fichier netcdf de sortie 320 integer :: ncid, xdimid, ydimid, S_hivarid, H_hivarid, Bsoc_hivarid, rtm_hivarid, cont_hivarid, ocean_hivarid, cmsk_hivarid, orog_lake_hivarid 304 integer :: ncid, xdimid, ydimid, S_hivarid, H_hivarid, Bsoc_hivarid, rtm_hivarid, cont_hivarid, ocean_hivarid, cmsk_hivarid, orog_lake_hivarid, lake_hivarid 321 305 integer :: status ! erreur operations netcdf 322 306 … … 370 354 enddo 371 355 372 Bsoc_hi(:,:) = Bsoc_hi(:,:) + anom_Bsoc_hi(:,:) 373 where ((Bsoc_hi(:,:).GT.S_interp_hi(:,:)).and.(H_interp_hi(:,:).GT.1.)) 374 S_hi(:,:) = Bsoc_hi(:,:) 356 Bsoc_hi(:,:) = Bsoc0_hi(:,:) + anom_Bsoc_hi(:,:) 357 358 where (H_interp_hi(:,:).GT.1.) ! zones englacees 359 where (Bsoc_hi(:,:).GT.S_interp_hi(:,:)) ! socle qui sort de la glace 360 S_hi(:,:) = Bsoc_hi(:,:) 361 H_hi(:,:) = 0. 362 elsewhere ! socle sous la glace 363 S_hi(:,:) = S_interp_hi(:,:) 364 H_hi(:,:) = S_interp_hi(:,:) - Bsoc_hi(:,:) 365 endwhere 366 elsewhere ! zones non englacees 367 S_hi(:,:) = max(Bsoc_hi(:,:),sealevel) 375 368 H_hi(:,:) = 0. 376 elsewhere ((Bsoc_hi(:,:) + H_interp_hi(:,:)).GT.S_interp_hi(:,:))377 S_hi(:,:) = S_interp_hi(:,:)378 H_hi(:,:) = S_interp_hi(:,:) - Bsoc_hi(:,:)379 elsewhere (H_interp_hi(:,:).GT.1.)380 S_hi(:,:) = S_interp_hi(:,:)381 H_hi(:,:) = max(0., S_interp_hi(:,:) - Bsoc_hi(:,:))382 369 endwhere 383 384 385 386 !~ where ((H_interp_hi(:,:).GT.10.).and.(Bsoc_hi(:,:)+) ! zone englacee => topo S_interp_hi (pas en anomalie pour eviter topo bruitee)387 !~ S_hi(:,:) = S_interp_hi(:,:)388 !~ H_hi(:,:) = max(0., S_interp_hi(:,:) - Bsoc_hi(:,:))389 !~ elsewhere390 !~ S_hi(:,:) = S_hi(:,:) + anom_S_hi(:,:)391 !~ H_hi(:,:) = 0.392 !~ endwhere393 394 370 395 371 ! orography sur grille hi_res : … … 407 383 omsk_hi(:,:) = 0 408 384 endwhere 409 410 !~ print*,'RSL Hi_res'411 !~ print*,'65,166 S0 H0 Bsoc0 ',S0(65,166), H0(65,166), Bsoc0(65,166)412 !~ print*,'260,664 S0 H0 Bsoc0 ',S0_hi(260,664), H0_hi(260,664), Bsoc0_hi(260,664)413 !~ print*,'65,166 S H Bsoc ',S(65,166), H(65,166), Bsoc(65,166)414 !~ print*,'260,664 Shi Hhi Bsochi ',S_hi(260,664), H_hi(260,664), Bsoc_hi(260,664)415 !~ print*,'260,664 anom Shi Hhi Bsochi ',anom_S_hi(260,664), anom_H_hi(260,664), anom_Bsoc_hi(260,664)416 !~ print*,'low_2_hi_i', low_2_hi_i(260,664,:)417 !~ print*,'low_2_hi_i', low_2_hi_j(260,664,:)418 !~ print*, 'poids',poids(260,664,:)419 !~ print*,'low_2_hi_i', low_2_hi_i(1,1,:)420 !~ print*,'low_2_hi_i', low_2_hi_j(1,1,:)421 !~ print*, 'poids',poids(1,1,:)422 !~ print*,'low_2_hi_i', low_2_hi_i(964,964,:)423 !~ print*,'low_2_hi_i', low_2_hi_j(964,964,:)424 !~ print*, 'poids',poids(964,964,:)425 385 426 386 endif … … 458 418 !~ print*,'4/ rsl' 459 419 460 !print*, '39,63 pot_lake',lake_level(39,63),orog_lake(39,63),pot_lake(39,63) 461 462 463 !~ print* 464 !~ print*,'rtm directions :' 465 !~ print*,'1 : N' 466 !~ print*,'2 : NE' 467 !~ print*,'3 : E' 468 !~ print*,'4 : SE' 469 !~ print*,'5 : S' 470 !~ print*,'6 : SW' 471 !~ print*,'7 : W' 472 !~ print*,'8 : NW' 473 !~ print* 420 sealevel_2D_loc(:,:) = sealevel_2D(:,:) ! pour debug : A SUPPRIMER QUAND ON REPASSERA SUR SEALEVEL_2D 421 where (lake(:,:).eq.1) 422 sealevel_2D_loc(:,:)=orog_lake(:,:) 423 elsewhere 424 sealevel_2D_loc(:,:)=sealevel 425 endwhere 426 427 where ((mask_extlake.LT.9999).AND.(ice.EQ.1).AND.(mk.EQ.0).AND.(lake.EQ.0).AND.(BSOC.LT.orog_extlake)) 428 sealevel_2D_loc(:,:) = orog_extlake(:,:) 429 endwhere 430 474 431 if (hi_res_runoff.eq.1) then 475 !~ print*,'AVANT SAVE NETCDF'476 !~ print*,'S_hi',S_hi(1,1),S_hi(65,166)477 432 478 433 !* Save mode … … 489 444 status = nf90_def_var(ncid, "cmsk_hi", nf90_float, (/ xdimid, ydimid /), cmsk_hivarid) 490 445 status = nf90_def_var(ncid, "orog_lake_hi", nf90_float, (/ xdimid, ydimid /), orog_lake_hivarid) 446 status = nf90_def_var(ncid, "lake_hi", nf90_float, (/ xdimid, ydimid /), lake_hivarid) 491 447 492 448 status = nf90_enddef(ncid) … … 500 456 status = nf90_put_var(ncid, cmsk_hivarid, cmsk_hi) 501 457 status = nf90_put_var(ncid, orog_lake_hivarid, orog_lake_hi) 458 status = nf90_put_var(ncid, lake_hivarid, lake_hi) 502 459 503 460 status = nf90_close(ncid) 504 461 endif 505 ! call write_ncdf_dim('x',trim(ncfilecont),nxhi) 506 ! call write_ncdf_dim('y',trim(ncfilecont),nyhi) 507 ! tab(:,:)=S_hi(:,:) 508 ! call Write_Ncdf_var('S_hi',dimname,TRIM(ncfilecont),tab,1,0,'double') 509 !~ tab(:,:)=H_hi(:,:) 510 !~ call Write_Ncdf_var('H_hi',dimname,TRIM(ncfilecont),tab,'double') 511 !~ tab(:,:)=Bsoc_hi(:,:) 512 !~ call Write_Ncdf_var('Bsoc_hi',dimname,TRIM(ncfilecont),tab,'double') 513 !~ tab(:,:)=rtm(:,:) 514 !~ call Write_Ncdf_var('rtm',dimname,TRIM(ncfilecont),tab,'double') 515 !~ tab(:,:)=orog(:,:) 516 !~ call Write_Ncdf_var('cont',dimname,TRIM(ncfilecont),tab,'double') 517 !~ tab(:,:)=cmsk(:,:) 518 !~ call Write_Ncdf_var('cmsk',dimname,TRIM(ncfilecont),tab,'double') 519 !~ tab(:,:)=orog_lake(:,:) 520 !~ call Write_Ncdf_var('orog_lake',dimname,TRIM(ncfilecont),tab,'double') 521 522 !~ status = nf90_create(trim(ncfilecont),and(nf90_write,nf90_64bit_offset),ncid) 523 !~ status = nf90_close(ncid) 524 !~ call write_ncdf_dim('x',trim(ncfilecont),nx) 525 !~ call write_ncdf_dim('y',trim(ncfilecont),ny) 526 !~ tab(:,:)=S(:,:) 527 !~ call Write_Ncdf_var('S',dimname,TRIM(ncfilecont),tab,'double') 528 529 530 !~ print*, '50,138 lake,sealevel_2D,ice,mk,clake,mask_extlake,orog_extlake ' 531 !~ print*,S(50,138),H(50,138),BSOC(50,138) 532 !~ print*,lake(50,138),sealevel_2D(50,138),ice(50,138),mk(50,138),mask_extlake(50,138),orog_extlake(50,138) 533 !~ print*,'65,166' 534 !~ print*,S(65,166),H(65,166),BSOC(65,166) 535 !~ print*,lake(65,166),sealevel_2D(65,166),ice(65,166),mk(65,166),mask_extlake(65,166),orog_extlake(65,166) 536 537 538 !~ print*,'153,41' 539 !~ print*,S(153,41),H(153,41),BSOC(153,41) 540 !~ print*,lake(153,41),sealevel_2D(153,41),ice(153,41),mk(153,41),clake(153,41),mask_extlake(153,41),orog_extlake(153,41) 541 542 !where (orog_lake(:,:).gt.orog(:,:)) ! pose pb lorsque topo evolue => test devient faux 543 sealevel_2D_loc(:,:) = sealevel_2D(:,:) ! pour debug : A SUPPRIMER QUAND ON REPASSERA SUR SEALEVEL_2D 544 where (lake(:,:).eq.1) 545 sealevel_2D_loc(:,:)=orog_lake(:,:) 546 elsewhere 547 sealevel_2D_loc(:,:)=sealevel 548 endwhere 549 550 !where ((mask_extlake.EQ.1).AND.(ice.EQ.1).AND.(mk.EQ.0).AND.(lake.EQ.0).AND.(BSOC.LT.orog_extlake)) 551 where ((mask_extlake.LT.9999).AND.(ice.EQ.1).AND.(mk.EQ.0).AND.(lake.EQ.0).AND.(BSOC.LT.orog_extlake)) 552 sealevel_2D_loc(:,:) = orog_extlake(:,:) 553 ! sealevel_2D(:,:) = sealevel + (orog_extlake(:,:)-sealevel) / mask_extlake(:,:) 554 endwhere 462 555 463 556 464 endif 557 465 558 466 sealevel_2D(:,:) = sealevel_2D_loc(:,:) 559 560 561 562 !~ print*,'56,125',S(56,125),H(56,125),BSOC(56,125),MK(56,125),ice(56,125),omsk(56,125),orog(56,125),orog_lake(56,125)563 467 564 468 debug_3d(:,:,126)=sealevel_2D_loc(:,:) 565 469 debug_3d(:,:,127)=cont(:,:) 566 470 debug_3d(:,:,128)=lake(:,:) 567 568 !print*,'lake_rsl print*,'Debut rsl time = ', time59,119', time, sealevel_2D_loc(59,119),orog_lake(59,119),orog(59,119),sealevel,orog_extlake(59,119)569 570 !print*,'lake_rsl 6,112'571 !print('(6(f8.1,1x),5(i4,1x),1(f8.1))'),time, sealevel_2D_loc(6,112),orog_lake(6,112),orog(6,112),sealevel,orog_extlake(6,112),cont(6,112),lake(6,112),mask_extlake(6,112),ice(6,112),mk(6,112),bsoc(6,112)572 471 573 472 !~ print*,'Fin rsl' … … 621 520 cmsk_loc = 0 622 521 !~ print*,'1/ mask_orog_ocean' 623 !~ print*,'mask_orog_ocean inc = ', inc(1,1), inc(1,2) 624 !~ print*,'RSL : update lakes and runoff routing', time 625 626 !print*,'2/ Point (182,110) orog, omsk, cmsk, cont', orog(182,110), omsk(182,110), cmsk(182,110), cont(182,110) 522 627 523 !* Discriminate continents 628 524 !~ write(*,*) "Number the different continents" … … 653 549 sumcont = sumcont + cont_loc(ipinctab(k),jpinctab(k)) 654 550 enddo 655 !print*,'ii jj loccont',ii,jj,loccont 656 !print*,'sumcont',sumcont 551 657 552 if (sumcont.GT.0) then 658 553 cont_loc(ii,jj)=minval(loccont,mask=loccont>0) 659 554 do while (maxval(loccont,mask=loccont>0).GT.cont_loc(ii,jj).and.maxloop.lt.8) ! test si dans les 8 voisins certains ont un loccont > minval 660 555 maxcont=maxval(loccont,mask=loccont>0) 661 ! print*,'ii,jj maxval,cont,maxcont,minval', ii,jj, maxval(loccont,mask=loccont>0), cont(ii,jj),maxcont662 ! write(6,*),'loccont',loccont663 ! where (cont(:,:).EQ.maxval(loccont,mask=loccont>0))664 556 where (cont_loc(:,:).EQ.maxcont) cont_loc(:,:) = cont_loc(ii,jj) 665 557 where (loccont(:).EQ.maxcont) loccont(:) = cont_loc(ii,jj) 666 ! print*,'cont voisin(358,10) :',cont(358,10)667 558 maxloop = maxloop + 1 668 559 enddo … … 675 566 enddo 676 567 enddo 677 !~ print*,'2/ mask_orog_ocean' 678 !print*,'3/ Point (182,110) orog, omsk, cmsk, cont', orog(182,110), omsk(182,110), cmsk(182,110), cont(182,110) 679 680 681 682 568 !~ print*,'2/ mask_orog_ocean' 683 569 684 570 !* Reordering to get an incremental list … … 705 591 do j = 1, ny_loc 706 592 do i = 1, nx_loc 707 !do j = 110,111708 ! do i = 182,183709 710 593 !* Locate current grid point 711 594 ii = i; jj = j … … 725 608 sumocean = sumocean + ocean_loc(ipinctab(k),jpinctab(k)) 726 609 enddo 727 !print*,'ii jj loccont',ii,jj,loccont 728 !print*,'sumcont',sumcont 610 729 611 if (sumocean.GT.0) then 730 612 ocean_loc(ii,jj)=minval(lococean,mask=lococean>0) 731 613 do while (maxval(lococean,mask=lococean>0).GT.ocean_loc(ii,jj).and.maxloop.lt.8) ! test si dans les 8 voisins certains ont un lococean > minval 732 614 maxocean=maxval(lococean,mask=lococean>0) 733 ! print*,'ii,jj maxval,cont,maxcont,minval', ii,jj, maxval(loccont,mask=loccont>0), cont(ii,jj),maxcont734 ! write(6,*),'loccont',loccont735 ! where (cont(:,:).EQ.maxval(loccont,mask=loccont>0))736 615 where (ocean_loc(:,:).EQ.maxocean) ocean_loc(:,:) = ocean_loc(ii,jj) 737 616 where (lococean(:).EQ.maxocean) lococean(:) = ocean_loc(ii,jj) 738 ! print*,'cont voisin(358,10) :',cont(358,10)739 617 maxloop = maxloop + 1 740 618 enddo … … 795 673 stop_lake = .true. 796 674 ij_lake=minloc(pot_lake_loc(:,:),mask=(pot_lake_loc.EQ.l)) 797 ! print*,'lake, i, j : ',l, ij_lake(:)798 675 do while (stop_lake) 799 676 do k=1,8 … … 808 685 enddo 809 686 if (maxval(loccont).GT.0) then ! voisin point terre 810 ! print*,'maxval(loccont)',maxval(loccont)811 687 ! le lac appartient a ce continent 812 688 kloc=maxloc(loccont,dim=1) … … 815 691 omsk_loc(:,:)=1 816 692 endwhere 817 ! print*,'lake => cont ',l, cont(ij_lake(1),ij_lake(2))818 693 stop_lake=.false. 819 694 else … … 906 781 do while (minval(runoff_msk(:,:),mask=mask_search(:,:).EQ.1).EQ.0) ! test si il reste des points a scanner 907 782 ijcoord(:)=minloc(orog_lake_loc,mask=(mask_search(:,:).EQ.1)) ! position du point le plus bas etudié 908 !debug909 ! if (ijcoord(1).EQ.286.and.ijcoord(2).eq.26) then910 ! print*,'POINT 286 26', ijcoord, orog_lake(ijcoord(1),ijcoord(2))911 ! do j=1,ny912 ! do i=1,nx913 ! if (mask_search(i,j).EQ.1) then914 ! print*,'POINT 286 26 mask_search', i,j,mask_search(i,j),orog_lake(i,j)915 ! endif916 ! enddo917 ! enddo918 ! endif919 !fin debug920 783 921 784 if (count(mask=((mask_search.eq.1).and.(cmsk_loc.eq.1))).GT.0) then! il reste des points cotiers non traités … … 924 787 ! si altitude egale entre 2 points on traite en priorité le point cotier 925 788 if (orog_lake_loc(ijcoord(1),ijcoord(2)).EQ.orog_lake_loc(ijcoord_cmsk(1),ijcoord_cmsk(2))) then 926 ! print*,'point cotier prio : ',ijcoord_cmsk, orog_lake(ijcoord_cmsk(1),ijcoord_cmsk(2))927 ! print*,'point ijcoord remplace : ',ijcoord, orog_lake(ijcoord(1),ijcoord(2))928 789 ijcoord(:) = ijcoord_cmsk(:) 929 ! pause930 790 endif 931 791 endif 932 ! print*,'ijcoord, orog ',ijcoord(:), orog(ijcoord(1),ijcoord(2))933 ! orog des 8 points voisins => locorog934 792 contexut = 0 935 793 do k=1,8 … … 944 802 if ((omsk_loc(ipinctab(k),jpinctab(k)).EQ.1).AND.(mask_search(ipinctab(k),jpinctab(k)).EQ.0)) then 945 803 mask_search(ipinctab(k),jpinctab(k))=1 946 ! mask_search(ipinctab(k),jpinctab(k))=min(omsk(ipinctab(k),jpinctab(k)),1) ! => si on est sur un point ocean omsk=0947 804 ! cas des depressions : 948 805 ! si l'un des points est plus bas que le point de base et n'est pas cotier => on remonte son orog => orog_lake_loc … … 952 809 lake_loc(ipinctab(k),jpinctab(k)) = 1 953 810 contexut= contexut + 1 954 ! print*, '!!!!! LAKE !!!!! ', orog(ipinctab(k),jpinctab(k)), orog_lake_loc(ipinctab(k),jpinctab(k))955 811 endif 956 812 endif 957 813 locorog(k) = orog_lake_loc(ipinctab(k),jpinctab(k)) 958 ! locmsk(k) = runoff_msk(ipinctab(k),jpinctab(k))959 ! loclake(k) = lake(ipinctab(k),jpinctab(k))960 ! locmsk_search = mask_search(ipinctab(k),jpinctab(k))961 814 locexut(k) = exut(ipinctab(k),jpinctab(k)) 962 815 enddo … … 966 819 if (lake_loc(ijcoord(1),ijcoord(2)).eq.1) then 967 820 exut(ijcoord(1),ijcoord(2)) = maxval(locexut) + 1 968 ! print*,'1/ lake ij', ijcoord(1),ijcoord(2), orog_lake_loc(ijcoord(1),ijcoord(2))969 ! print*,'2/ locorog ',locorog970 ! print*,'3/ locexut ',locexut971 821 ! ecoulement vers l'exutoire du lac 972 822 if (maxval(locexut).GT.0) then 973 823 rtm_loc(ijcoord(1),ijcoord(2))=minloc(locexut,dim=1,mask=(locexut.ge.1)) ! ecoulement vers l'exutoire 974 975 ! if (maxval(locexut).EQ.1) then976 ! rtm(ijcoord(1),ijcoord(2))=maxloc(locexut,dim=1) ! ecoulement vers l'exutoire977 ! else ! pas de voisin exutoire978 ! ecoulement idem que voisin lac :979 ! rtm(ijcoord(1),ijcoord(2))=maxloc(locmsk,mask=loclake.EQ.1,dim=1) ! localisation du voisin deja traite (locmsk=1) qui est lac (loclake=1)980 824 endif 981 ! print*,'4/ rtm ',rtm(ijcoord(1),ijcoord(2))982 ! print*,'5/ locmsk ',locmsk983 ! else984 ! print*,'point std traite: ',ijcoord, orog_lake_loc(ijcoord(1),ijcoord(2))985 ! print*,'rtm ', rtm(ijcoord(1),ijcoord(2))986 ! print*,'locorog ', locorog987 ! print*,'cmsk ', cmsk(ijcoord(1),ijcoord(2))988 ! print*,'lake ', lake(ijcoord(1),ijcoord(2))989 ! print*990 991 825 endif 992 826 ! on supprime le point attribué de mask_search : … … 994 828 ! le point a ete traité : 995 829 runoff_msk(ijcoord(1),ijcoord(2))=1 996 ! minloc(locorog,mask=((locorog.gt.0).and.(locmsk.eq.0)))997 ! print*, rtm(ijcoord(1),ijcoord(2))998 ! contprint = contprint + 1999 ! if (contprint.eq.20) goto 20201000 830 enddo 1001 831 enddo … … 1004 834 lake_level_loc(:,:)=-9999. ! initialisation 1005 835 do l=1,countpot_lake 1006 !print*, 'pot_lake :',l1007 836 where (pot_lake_loc(:,:).EQ.l) 1008 837 lake_level_loc(:,:)=orog_lake_loc(:,:) … … 1010 839 enddo 1011 840 1012 1013 1014 841 end subroutine runoff 1015 842 … … 1020 847 subroutine extlake(nx_loc,ny_loc,lake_loc,ice_loc,mk_loc,orog_lake_loc,inclake_loc,mask_extlake_loc,orog_extlake_loc) 1021 848 1022 implicit none1023 1024 integer, intent(in) :: nx_loc, ny_loc1025 integer,dimension(nx_loc,ny_loc), intent(in) :: lake_loc ! 1 si lac, 0 sinon1026 integer,dimension(nx_loc,ny_loc), intent(in) :: ice_loc ! 1 si glace, 0 sinon1027 integer,dimension(nx_loc,ny_loc), intent(in) :: mk_loc ! 0 si terre, 1 sinon1028 real,dimension(nx_loc,ny_loc), intent(in) :: orog_lake_loc ! orographie a la surface des lacs1029 integer,dimension(80,2),intent(in) :: inclake_loc ! 80 voisins (+4 -4) en i,j1030 integer, dimension(nx_loc,ny_loc),intent(out) :: mask_extlake_loc ! extension du lac sous la glace1031 real, dimension(nx_loc,ny_loc),intent(out) :: orog_extlake_loc ! niveau du lac sur les zones glace a proximité (rayon de 4 pts de grille)1032 1033 integer, dimension(8) :: ipinctab,jpinctab ! indice des points a scanner autour du point ii jj1034 integer, dimension(nx_loc,ny_loc) :: clake ! point lac avec voisin point englace1035 integer :: i,j,k849 implicit none 850 851 integer, intent(in) :: nx_loc, ny_loc 852 integer,dimension(nx_loc,ny_loc), intent(in) :: lake_loc ! 1 si lac, 0 sinon 853 integer,dimension(nx_loc,ny_loc), intent(in) :: ice_loc ! 1 si glace, 0 sinon 854 integer,dimension(nx_loc,ny_loc), intent(in) :: mk_loc ! 0 si terre, 1 sinon 855 real,dimension(nx_loc,ny_loc), intent(in) :: orog_lake_loc ! orographie a la surface des lacs 856 integer,dimension(80,2),intent(in) :: inclake_loc ! 80 voisins (+4 -4) en i,j 857 integer, dimension(nx_loc,ny_loc),intent(out) :: mask_extlake_loc ! extension du lac sous la glace 858 real, dimension(nx_loc,ny_loc),intent(out) :: orog_extlake_loc ! niveau du lac sur les zones glace a proximité (rayon de 4 pts de grille) 859 860 integer, dimension(8) :: ipinctab,jpinctab ! indice des points a scanner autour du point ii jj 861 integer, dimension(nx_loc,ny_loc) :: clake ! point lac avec voisin point englace 862 integer :: i,j,k 1036 863 1037 864 ! initialisation 1038 clake(:,:)=01039 orog_extlake_loc(:,:)=0.1040 mask_extlake_loc(:,:)=9999865 clake(:,:)=0 866 orog_extlake_loc(:,:)=0. 867 mask_extlake_loc(:,:)=9999 1041 868 1042 869 ! recherche des points lacs en bordure de calotte => voisin pas lac englace et terre 1043 where ((lake_loc(:,:).EQ.1).AND.(((eoshift(lake_loc,shift=-1,dim=1).EQ.0).AND.(eoshift(ice_loc,shift=-1,dim=1).EQ.1).AND.(eoshift(mk_loc,shift=-1,dim=1).EQ.0)) .OR. &1044 ((eoshift(lake_loc,shift=1,dim=1).EQ.0).AND.(eoshift(ice_loc,shift=1,dim=1).EQ.1).AND.(eoshift(mk_loc,shift=1,dim=1).EQ.0)) .OR. &1045 ((eoshift(lake_loc,shift=-1,dim=2).EQ.0).AND.(eoshift(ice_loc,shift=-1,dim=2).EQ.1).AND.(eoshift(mk_loc,shift=-1,dim=2).EQ.0)) .OR. &1046 ((eoshift(lake_loc,shift=1,dim=2).EQ.0).AND.(eoshift(ice_loc,shift=1,dim=2).EQ.1).AND.(eoshift(mk_loc,shift=1,dim=2).EQ.0))))1047 clake(:,:) = 11048 endwhere870 where ((lake_loc(:,:).EQ.1).AND.(((eoshift(lake_loc,shift=-1,dim=1).EQ.0).AND.(eoshift(ice_loc,shift=-1,dim=1).EQ.1).AND.(eoshift(mk_loc,shift=-1,dim=1).EQ.0)) .OR. & 871 ((eoshift(lake_loc,shift=1,dim=1).EQ.0).AND.(eoshift(ice_loc,shift=1,dim=1).EQ.1).AND.(eoshift(mk_loc,shift=1,dim=1).EQ.0)) .OR. & 872 ((eoshift(lake_loc,shift=-1,dim=2).EQ.0).AND.(eoshift(ice_loc,shift=-1,dim=2).EQ.1).AND.(eoshift(mk_loc,shift=-1,dim=2).EQ.0)) .OR. & 873 ((eoshift(lake_loc,shift=1,dim=2).EQ.0).AND.(eoshift(ice_loc,shift=1,dim=2).EQ.1).AND.(eoshift(mk_loc,shift=1,dim=2).EQ.0)))) 874 clake(:,:) = 1 875 endwhere 1049 876 1050 877 1051 878 1052 879 ! point terre et englace : mk=0 et H>0 1053 do j=1,ny 1054 do i=1,nx 1055 if (clake(i,j).EQ.1) then 1056 do k=1,80 1057 ipinctab(k) = max(1,min(nx,i + inclake_loc(k,1))) 1058 jpinctab(k) = max(1,min(ny,j + inclake_loc(k,2))) 1059 mask_extlake_loc(ipinctab(k),jpinctab(k)) = 1 1060 ! mask_extlake(ipinctab(k),jpinctab(k))=min(abs(inclake(k,1)),abs(inclake(k,2)),mask_extlake(ipinctab(k),jpinctab(k))) 1061 ! mask_extlake(ipinctab(k),jpinctab(k))=min(minval(abs(inclake(k,:),mask=inclake(k,:).GT.0)),mask_extlake(ipinctab(k),jpinctab(k))) 1062 orog_extlake_loc(ipinctab(k),jpinctab(k))=orog_lake_loc(i,j) 1063 enddo 1064 endif 1065 enddo 1066 enddo 1067 1068 !~ print*,'!!!!!!! extlake !!!!!!' 1069 !~ print*, '50,138 lake,sealevel_2D,ice,mk,clake,mask_extlake,orog_extlake ' 1070 !~ print*,lake_loc(50,138),ice_loc(50,138),mk_loc(50,138),mask_extlake_loc(50,138),orog_extlake_loc(50,138),clake(50,138) 1071 !~ print*,'65,166' 1072 !~ print*,lake_loc(65,166),ice_loc(65,166),mk_loc(65,166),mask_extlake_loc(65,166),orog_extlake_loc(65,166),clake(65,166) 1073 !~ print*,'64,166' 1074 !~ print*,lake_loc(64,166),ice_loc(64,166),mk_loc(64,166),mask_extlake_loc(64,166),orog_extlake_loc(64,166),clake(64,166) 1075 !~ print*,'66,166' 1076 !~ print*,lake_loc(66,166),ice_loc(66,166),mk_loc(66,166),mask_extlake_loc(66,166),orog_extlake_loc(66,166),clake(66,166) 1077 !~ print*,'65,165' 1078 !~ print*,lake_loc(65,165),ice_loc(65,165),mk_loc(65,165),mask_extlake_loc(65,165),orog_extlake_loc(65,165),clake(65,165) 1079 !~ print*,'65,167' 1080 !~ print*,lake_loc(65,167),ice_loc(65,167),mk_loc(65,167),mask_extlake_loc(65,167),orog_extlake_loc(65,167),clake(65,167) 880 do j=1,ny 881 do i=1,nx 882 if (clake(i,j).EQ.1) then 883 do k=1,80 884 ipinctab(k) = max(1,min(nx,i + inclake_loc(k,1))) 885 jpinctab(k) = max(1,min(ny,j + inclake_loc(k,2))) 886 mask_extlake_loc(ipinctab(k),jpinctab(k)) = 1 887 orog_extlake_loc(ipinctab(k),jpinctab(k))=orog_lake_loc(i,j) 888 enddo 889 endif 890 enddo 891 enddo 892 1081 893 end subroutine extlake 1082 894
Note: See TracChangeset
for help on using the changeset viewer.