- Timestamp:
- Nov 17, 2025, 3:50:06 PM (6 weeks ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/branches/PBLSURF_GPUPORT/libf/phylmd/ocean_forced_mod.F90
r5662 r5868 59 59 !**************************************************************************************** 60 60 INTEGER, INTENT(IN) :: itime, jour, knon 61 INTEGER, DIMENSION(k lon), INTENT(IN) :: knindex61 INTEGER, DIMENSION(knon), INTENT(IN) :: knindex 62 62 REAL, INTENT(IN) :: dtime 63 REAL, DIMENSION(k lon), INTENT(IN) :: p1lay64 REAL, DIMENSION(k lon), INTENT(IN) :: cdragh, cdragq, cdragm65 REAL, DIMENSION(k lon), INTENT(IN) :: precip_rain, precip_snow66 REAL, DIMENSION(k lon), INTENT(IN) :: temp_air, spechum67 REAL, DIMENSION(k lon), INTENT(IN) :: AcoefH, AcoefQ, BcoefH, BcoefQ68 REAL, DIMENSION(k lon), INTENT(IN) :: AcoefU, AcoefV, BcoefU, BcoefV69 REAL, DIMENSION(k lon), INTENT(IN) :: ps70 REAL, DIMENSION(k lon), INTENT(IN) :: u1, v1, gustiness71 REAL, DIMENSION(k lon), INTENT(IN) :: tsurf_in72 real, intent(in):: rhoa( :) ! (knon) density of moist air (kg / m3)73 !GG 74 REAL, DIMENSION(k lon), INTENT(IN) :: dthetadz30063 REAL, DIMENSION(knon), INTENT(IN) :: p1lay 64 REAL, DIMENSION(knon), INTENT(IN) :: cdragh, cdragq, cdragm 65 REAL, DIMENSION(knon), INTENT(IN) :: precip_rain, precip_snow 66 REAL, DIMENSION(knon), INTENT(IN) :: temp_air, spechum 67 REAL, DIMENSION(knon), INTENT(IN) :: AcoefH, AcoefQ, BcoefH, BcoefQ 68 REAL, DIMENSION(knon), INTENT(IN) :: AcoefU, AcoefV, BcoefU, BcoefV 69 REAL, DIMENSION(knon), INTENT(IN) :: ps 70 REAL, DIMENSION(knon), INTENT(IN) :: u1, v1, gustiness 71 REAL, DIMENSION(knon), INTENT(IN) :: tsurf_in 72 real, intent(in):: rhoa(knon) ! (knon) density of moist air (kg / m3) 73 !GG 74 REAL, DIMENSION(knon), INTENT(IN) :: dthetadz300 75 75 REAL, DIMENSION(klon,nbsrf), INTENT(IN) :: pctsrf 76 76 ! 77 77 78 78 #ifdef ISO 79 REAL, DIMENSION(ntiso,k lon), INTENT(IN) :: xtprecip_rain, xtprecip_snow80 REAL, DIMENSION(ntiso,k lon), INTENT(IN) :: xtspechum79 REAL, DIMENSION(ntiso,knon), INTENT(IN) :: xtprecip_rain, xtprecip_snow 80 REAL, DIMENSION(ntiso,knon), INTENT(IN) :: xtspechum 81 81 REAL, DIMENSION(klon), INTENT(IN) :: rlat 82 82 #endif … … 84 84 ! In/Output arguments 85 85 !**************************************************************************************** 86 REAL, DIMENSION(k lon), INTENT(INOUT) :: radsol87 REAL, DIMENSION(k lon), INTENT(INOUT) :: snow88 REAL, DIMENSION(k lon), INTENT(INOUT) :: agesno !? put to 0 in ocean86 REAL, DIMENSION(knon), INTENT(INOUT) :: radsol 87 REAL, DIMENSION(knon), INTENT(INOUT) :: snow 88 REAL, DIMENSION(knon), INTENT(INOUT) :: agesno !? put to 0 in ocean 89 89 #ifdef ISO 90 REAL, DIMENSION(niso,k lon), INTENT(IN) :: xtsnow91 REAL, DIMENSION(niso,k lon), INTENT(INOUT):: Roce90 REAL, DIMENSION(niso,knon), INTENT(IN) :: xtsnow 91 REAL, DIMENSION(niso,knon), INTENT(INOUT):: Roce 92 92 #endif 93 93 94 94 ! Output arguments 95 95 !**************************************************************************************** 96 REAL, DIMENSION(k lon), INTENT(OUT) :: qsurf97 REAL, DIMENSION(k lon), INTENT(OUT) :: evap, fluxsens, fluxlat98 REAL, DIMENSION(k lon), INTENT(OUT) :: flux_u1, flux_v199 REAL, DIMENSION(k lon), INTENT(OUT) :: tsurf_new100 REAL, DIMENSION(k lon), INTENT(OUT) :: dflux_s, dflux_l96 REAL, DIMENSION(knon), INTENT(OUT) :: qsurf 97 REAL, DIMENSION(knon), INTENT(OUT) :: evap, fluxsens, fluxlat 98 REAL, DIMENSION(knon), INTENT(OUT) :: flux_u1, flux_v1 99 REAL, DIMENSION(knon), INTENT(OUT) :: tsurf_new 100 REAL, DIMENSION(knon), INTENT(OUT) :: dflux_s, dflux_l 101 101 REAL, INTENT(out):: sens_prec_liq(:) ! (knon) 102 102 !GG 103 REAL, DIMENSION(k lon), INTENT(OUT) :: Ampl103 REAL, DIMENSION(knon), INTENT(OUT) :: Ampl 104 104 ! 105 105 106 106 #ifdef ISO 107 REAL, DIMENSION(ntiso,k lon), INTENT(OUT) :: xtevap ! isotopes in evaporation flux108 REAL, DIMENSION(k lon), INTENT(OUT) :: h1 ! just a diagnostic, not useful for the simulation107 REAL, DIMENSION(ntiso,knon), INTENT(OUT) :: xtevap ! isotopes in evaporation flux 108 REAL, DIMENSION(knon), INTENT(OUT) :: h1 ! just a diagnostic, not useful for the simulation 109 109 #endif 110 110 … … 112 112 !**************************************************************************************** 113 113 INTEGER :: i, j 114 REAL, DIMENSION(k lon) :: cal, beta, dif_grnd115 REAL, DIMENSION(k lon) :: alb_neig, tsurf_lim, zx_sl116 REAL, DIMENSION(k lon) :: u0, v0117 REAL, DIMENSION(k lon) :: u1_lay, v1_lay114 REAL, DIMENSION(knon) :: cal, beta, dif_grnd 115 REAL, DIMENSION(knon) :: alb_neig, tsurf_lim, zx_sl 116 REAL, DIMENSION(knon) :: u0, v0 117 REAL, DIMENSION(knon) :: u1_lay, v1_lay 118 118 LOGICAL :: check=.FALSE. 119 119 REAL, DIMENSION(knon) :: sens_prec_sol 120 REAL, DIMENSION(k lon) :: lat_prec_liq, lat_prec_sol120 REAL, DIMENSION(knon) :: lat_prec_liq, lat_prec_sol 121 121 ! GG 122 REAL, DIMENSION(k lon) :: l_CBL, sicfra122 REAL, DIMENSION(knon) :: l_CBL, sicfra 123 123 ! 124 124 #ifdef ISO … … 198 198 199 199 ! Calcul de tsurf_new, evap, fluxlat, fluxsens, dflux_s, dflux_l and qsurf 200 CALL calcul_fluxs(knon, is_oce, dtime, & 201 merge(tsurf_in, tsurf_lim, activate_ocean_skin == 2), p1lay, cal, & 200 IF (activate_ocean_skin == 2) THEN 201 CALL calcul_fluxs(knon, is_oce, dtime, & 202 tsurf_in, p1lay, cal, & 202 203 beta, cdragh, cdragq, ps, & 203 204 precip_rain, precip_snow, snow, qsurf, & … … 206 207 tsurf_new, evap, fluxlat, fluxsens, dflux_s, dflux_l, & 207 208 sens_prec_liq, sens_prec_sol, lat_prec_liq, lat_prec_sol, rhoa) 208 if (activate_ocean_skin == 2) tsurf_new = tsurf_lim 209 tsurf_new = tsurf_lim 210 ELSE 211 CALL calcul_fluxs(knon, is_oce, dtime, & 212 tsurf_lim, p1lay, cal, & 213 beta, cdragh, cdragq, ps, & 214 precip_rain, precip_snow, snow, qsurf, & 215 radsol, dif_grnd, temp_air, spechum, u1_lay, v1_lay, gustiness, & 216 f_qsat_oce,AcoefH, AcoefQ, BcoefH, BcoefQ, & 217 tsurf_new, evap, fluxlat, fluxsens, dflux_s, dflux_l, & 218 sens_prec_liq, sens_prec_sol, lat_prec_liq, lat_prec_sol, rhoa) 219 ENDIF 209 220 210 221 do j = 1, knon … … 217 228 218 229 !GG 230 219 231 if (iflag_leads == 1) then 220 l_CBL = -52381.*dthetadz300 + 3008.1 221 Ampl = 6.012e-08*l_CBL**2 - 4.036e-04*l_CBL + 1.4979 222 WHERE(Ampl(:)>1.2) Ampl(:)=1.2 223 sicfra(:)=pctsrf(:,is_sic)/(1.-pctsrf(:,is_lic)-pctsrf(:,is_ter)) 224 WHERE(pctsrf(:,is_sic)+pctsrf(:,is_oce)<EPSFRA) sicfra(:)=0. 225 WHERE(sicfra<0.7) Ampl(:)=1. 226 WHERE((sicfra>0.7).and.(sicfra<0.9)) Ampl=((sicfra-0.7)/0.2)*Ampl+((0.9-sicfra)/0.2) 227 fluxsens=Ampl*fluxsens 228 dflux_s=Ampl*dflux_s 232 !ym hyper faux, melange de champ compresse et non compresse, je rétabli... 233 !ym l_CBL = -52381.*dthetadz300 + 3008.1 234 !ym Ampl = 6.012e-08*l_CBL**2 - 4.036e-04*l_CBL + 1.4979 235 !ym WHERE(Ampl(:)>1.2) Ampl(:)=1.2 236 !ym sicfra(:)=pctsrf(:,is_sic)/(1.-pctsrf(:,is_lic)-pctsrf(:,is_ter)) 237 !ym WHERE(pctsrf(:,is_sic)+pctsrf(:,is_oce)<EPSFRA) sicfra(:)=0. 238 !ym WHERE(sicfra<0.7) Ampl(:)=1. 239 !ym WHERE((sicfra>0.7).and.(sicfra<0.9)) Ampl=((sicfra-0.7)/0.2)*Ampl+((0.9-sicfra)/0.2) 240 !ym fluxsens=Ampl*fluxsens 241 !ym dflux_s=Ampl*dflux_s 242 243 do j = 1, knon 244 i = knindex(j) 245 l_CBL(j) = -52381.*dthetadz300(j) + 3008.1 246 Ampl(j) = 6.012e-08*l_CBL(j)**2 - 4.036e-04*l_CBL(j) + 1.4979 247 IF (Ampl(j)>1.2) Ampl(j)=1.2 248 sicfra(j)=pctsrf(i,is_sic)/(1.-pctsrf(i,is_lic)-pctsrf(i,is_ter)) 249 IF (pctsrf(i,is_sic)+pctsrf(i,is_oce)<EPSFRA) sicfra(j)=0. 250 IF (sicfra(j)<0.7) Ampl(j)=1. 251 IF (sicfra(j)>0.7 .and. sicfra(j)<0.9) Ampl(j)=((sicfra(j)-0.7)/0.2)*Ampl(j)+((0.9-sicfra(j))/0.2) 252 fluxsens(j)=Ampl(j)*fluxsens(j) 253 dflux_s(j)=Ampl(j)*dflux_s(j) 254 enddo 229 255 endif 230 256 … … 238 264 239 265 #ifdef ISO 240 CALL calcul_iso_surf_oce_vectall(k lon, knon,t_coup, &266 CALL calcul_iso_surf_oce_vectall(knon, knon,t_coup, & 241 267 & ps,tsurf_new,spechum,u1_lay, v1_lay, xtspechum, & 242 268 & evap, Roce,xtevap,h1 & … … 324 350 !**************************************************************************************** 325 351 INTEGER, INTENT(IN) :: itime, jour, knon 326 INTEGER, DIMENSION(k lon), INTENT(IN) :: knindex352 INTEGER, DIMENSION(knon), INTENT(IN) :: knindex 327 353 REAL, INTENT(IN) :: dtime 328 REAL, DIMENSION(k lon), INTENT(IN) :: tsurf_in329 REAL, DIMENSION(k lon), INTENT(IN) :: p1lay330 REAL, DIMENSION(k lon), INTENT(IN) :: cdragh, cdragm331 REAL, DIMENSION(k lon), INTENT(IN) :: precip_rain, precip_snow332 REAL, DIMENSION(k lon), INTENT(IN) :: temp_air, spechum333 REAL, DIMENSION(k lon), INTENT(IN) :: AcoefH, AcoefQ, BcoefH, BcoefQ334 REAL, DIMENSION(k lon), INTENT(IN) :: AcoefU, AcoefV, BcoefU, BcoefV335 REAL, DIMENSION(k lon), INTENT(IN) :: ps336 REAL, DIMENSION(k lon), INTENT(IN) :: u1, v1, gustiness337 real, intent(in):: rhoa( :) ! (knon) density of moist air (kg / m3)338 !GG 339 REAL, DIMENSION(k lon), INTENT(IN) :: swnet354 REAL, DIMENSION(knon), INTENT(IN) :: tsurf_in 355 REAL, DIMENSION(knon), INTENT(IN) :: p1lay 356 REAL, DIMENSION(knon), INTENT(IN) :: cdragh, cdragm 357 REAL, DIMENSION(knon), INTENT(IN) :: precip_rain, precip_snow 358 REAL, DIMENSION(knon), INTENT(IN) :: temp_air, spechum 359 REAL, DIMENSION(knon), INTENT(IN) :: AcoefH, AcoefQ, BcoefH, BcoefQ 360 REAL, DIMENSION(knon), INTENT(IN) :: AcoefU, AcoefV, BcoefU, BcoefV 361 REAL, DIMENSION(knon), INTENT(IN) :: ps 362 REAL, DIMENSION(knon), INTENT(IN) :: u1, v1, gustiness 363 real, intent(in):: rhoa(knon) ! (knon) density of moist air (kg / m3) 364 !GG 365 REAL, DIMENSION(knon), INTENT(IN) :: swnet 340 366 REAL, DIMENSION(klon,nbsrf), INTENT(IN) :: pctsrf 341 367 !GG 342 368 #ifdef ISO 343 REAL, DIMENSION(ntiso,k lon), INTENT(IN) :: xtprecip_rain, xtprecip_snow344 REAL, DIMENSION(ntiso,k lon), INTENT(IN) :: xtspechum345 REAL, DIMENSION(niso,k lon), INTENT(IN) :: Roce346 REAL, DIMENSION(niso,k lon), INTENT(IN) :: Rland_ice369 REAL, DIMENSION(ntiso,knon), INTENT(IN) :: xtprecip_rain, xtprecip_snow 370 REAL, DIMENSION(ntiso,knon), INTENT(IN) :: xtspechum 371 REAL, DIMENSION(niso,knon), INTENT(IN) :: Roce 372 REAL, DIMENSION(niso,knon), INTENT(IN) :: Rland_ice 347 373 #endif 348 374 349 375 ! In/Output arguments 350 376 !**************************************************************************************** 351 REAL, DIMENSION(k lon), INTENT(INOUT) :: radsol352 REAL, DIMENSION(k lon), INTENT(INOUT) :: snow, qsol353 REAL, DIMENSION(k lon), INTENT(INOUT) :: agesno354 REAL, DIMENSION(k lon, nsoilmx), INTENT(INOUT) :: tsoil355 !GG 356 REAL, DIMENSION(klon), INTENT(INOUT) :: hice 357 REAL, DIMENSION(klon), INTENT(INOUT) :: tice 358 REAL, DIMENSION(klon), INTENT(INOUT) :: bilg_cumul 359 REAL, DIMENSION(klon), INTENT(INOUT) :: fcds 360 REAL, DIMENSION(klon), INTENT(INOUT) :: fcdi 361 REAL, DIMENSION(klon), INTENT(INOUT) :: dh_basal_growth 362 REAL, DIMENSION(klon), INTENT(INOUT) :: dh_basal_melt 363 REAL, DIMENSION(klon), INTENT(INOUT) :: dh_top_melt 364 REAL, DIMENSION(klon), INTENT(INOUT) :: dh_snow2sic 365 REAL, DIMENSION(klon), INTENT(INOUT) :: dtice_melt 366 REAL, DIMENSION(klon), INTENT(INOUT) :: dtice_snow2sic 377 REAL, DIMENSION(knon), INTENT(INOUT) :: radsol 378 REAL, DIMENSION(knon), INTENT(INOUT) :: snow, qsol 379 REAL, DIMENSION(knon), INTENT(INOUT) :: agesno 380 REAL, DIMENSION(knon, nsoilmx), INTENT(INOUT) :: tsoil 381 !GG 382 REAL, DIMENSION(klon), INTENT(INOUT) :: hice !ym WARNING uncompressed 383 REAL, DIMENSION(klon), INTENT(INOUT) :: tice !ym WARNING uncompressed 384 REAL, DIMENSION(klon), INTENT(INOUT) :: bilg_cumul !ym WARNING uncompressed 385 REAL, DIMENSION(klon), INTENT(INOUT) :: fcds !ym WARNING uncompressed 386 REAL, DIMENSION(klon), INTENT(INOUT) :: fcdi !ym WARNING uncompressed 387 REAL, DIMENSION(klon), INTENT(INOUT) :: dh_basal_growth !ym WARNING uncompressed 388 REAL, DIMENSION(klon), INTENT(INOUT) :: dh_basal_melt !ym WARNING uncompressed 389 REAL, DIMENSION(klon), INTENT(INOUT) :: dh_top_melt !ym WARNING uncompressed 390 REAL, DIMENSION(klon), INTENT(INOUT) :: dh_snow2sic !ym WARNING uncompressed 391 REAL, DIMENSION(klon), INTENT(INOUT) :: dtice_melt !ym WARNING uncompressed 392 REAL, DIMENSION(klon), INTENT(INOUT) :: dtice_snow2sic !ym WARNING uncompressed 367 393 !GG 368 394 #ifdef ISO 369 REAL, DIMENSION(niso,k lon), INTENT(INOUT) :: xtsnow370 REAL, DIMENSION(niso,k lon), INTENT(IN) :: xtsol395 REAL, DIMENSION(niso,knon), INTENT(INOUT) :: xtsnow 396 REAL, DIMENSION(niso,knon), INTENT(IN) :: xtsol 371 397 #endif 372 398 373 399 ! Output arguments 374 400 !**************************************************************************************** 375 REAL, DIMENSION(k lon), INTENT(OUT) :: qsurf376 REAL, DIMENSION(k lon), INTENT(OUT) :: alb1_new ! new albedo in visible SW interval377 REAL, DIMENSION(k lon), INTENT(OUT) :: alb2_new ! new albedo in near IR interval378 REAL, DIMENSION(k lon), INTENT(OUT) :: evap, fluxsens, fluxlat379 REAL, DIMENSION(k lon), INTENT(OUT) :: flux_u1, flux_v1380 REAL, DIMENSION(k lon), INTENT(OUT) :: tsurf_new381 REAL, DIMENSION(k lon), INTENT(OUT) :: dflux_s, dflux_l401 REAL, DIMENSION(knon), INTENT(OUT) :: qsurf 402 REAL, DIMENSION(knon), INTENT(OUT) :: alb1_new ! new albedo in visible SW interval 403 REAL, DIMENSION(knon), INTENT(OUT) :: alb2_new ! new albedo in near IR interval 404 REAL, DIMENSION(knon), INTENT(OUT) :: evap, fluxsens, fluxlat 405 REAL, DIMENSION(knon), INTENT(OUT) :: flux_u1, flux_v1 406 REAL, DIMENSION(knon), INTENT(OUT) :: tsurf_new 407 REAL, DIMENSION(knon), INTENT(OUT) :: dflux_s, dflux_l 382 408 #ifdef ISO 383 REAL, DIMENSION(ntiso,k lon), INTENT(OUT) :: xtevap409 REAL, DIMENSION(ntiso,knon), INTENT(OUT) :: xtevap 384 410 #endif 385 411 … … 390 416 REAL :: zfra 391 417 REAL, PARAMETER :: t_grnd=271.35 392 REAL, DIMENSION(k lon) :: cal, beta, dif_grnd, capsol, icesub393 REAL, DIMENSION(k lon) :: alb_neig, tsurf_tmp394 REAL, DIMENSION(k lon) :: soilcap, soilflux395 REAL, DIMENSION(k lon) :: u0, v0396 REAL, DIMENSION(k lon) :: u1_lay, v1_lay418 REAL, DIMENSION(knon) :: cal, beta, dif_grnd, capsol, icesub 419 REAL, DIMENSION(knon) :: alb_neig, tsurf_tmp 420 REAL, DIMENSION(knon) :: soilcap, soilflux 421 REAL, DIMENSION(knon) :: u0, v0 422 REAL, DIMENSION(knon) :: u1_lay, v1_lay 397 423 REAL, DIMENSION(knon) :: sens_prec_liq, sens_prec_sol 398 REAL, DIMENSION(klon) :: lat_prec_liq, lat_prec_sol 424 REAL, DIMENSION(knon) :: lat_prec_liq, lat_prec_sol 425 REAL, DIMENSION(knon) :: yhice ! compressed version of hice 399 426 !GG 400 427 INTEGER :: ki 401 428 INTEGER :: cpl_pas 402 REAL, DIMENSION(klon) :: bilg, fsic, f_bot 429 REAL, DIMENSION(knon) :: bilg 430 REAL, DIMENSION(knon) :: fsic 431 REAL, DIMENSION(knon) :: f_bot 403 432 REAL, PARAMETER :: latent_ice = 334.0e3 404 433 REAL, PARAMETER :: rau_ice = 917.0 … … 471 500 #ifdef ISO 472 501 REAL, PARAMETER :: t_coup = 273.15 473 REAL, DIMENSION(k lon) :: fq_fonte_diag474 REAL, DIMENSION(k lon) :: fqfonte_diag475 REAL, DIMENSION(k lon) :: snow_evap_diag476 REAL, DIMENSION(k lon) :: fqcalving_diag477 REAL, DIMENSION(k lon) :: run_off_lic_diag502 REAL, DIMENSION(knon) :: fq_fonte_diag 503 REAL, DIMENSION(knon) :: fqfonte_diag 504 REAL, DIMENSION(knon) :: snow_evap_diag 505 REAL, DIMENSION(knon) :: fqcalving_diag 506 REAL, DIMENSION(knon) :: run_off_lic_diag 478 507 REAL :: coeff_rel_diag 479 508 REAL :: max_eau_sol_diag 480 REAL, DIMENSION(k lon) :: runoff_diag509 REAL, DIMENSION(knon) :: runoff_diag 481 510 INTEGER IXT 482 REAL, DIMENSION(niso,k lon) :: xtsnow_prec, xtsol_prec483 REAL, DIMENSION(k lon) :: snow_prec, qsol_prec511 REAL, DIMENSION(niso,knon) :: xtsnow_prec, xtsol_prec 512 REAL, DIMENSION(knon) :: snow_prec, qsol_prec 484 513 #endif 485 514 … … 536 565 dif_grnd(:)=0. 537 566 beta(:) = 1. 538 fsic(:) = pctsrf(:,is_sic)539 567 cpl_pas = NINT(86400./dtime * 1.0) ! une fois par jour 540 568 … … 545 573 DO i=1,knon 546 574 ki=knindex(i) 575 fsic(i) = pctsrf(ki,is_sic) 547 576 IF (snow(i).GT.snow_min) THEN 548 577 ! 1 / snow-layer heat capacity … … 566 595 ! GG no conductive flux in this case? 567 596 END IF 568 bilg( ki)=f_swpen-f_cond_s597 bilg(i)=f_swpen-f_cond_s 569 598 END DO 570 599 … … 652 681 ! write(*,*) 'klon,knon=',klon,knon 653 682 !#endif 654 CALL calcul_iso_surf_sic_vectall(k lon,knon, &683 CALL calcul_iso_surf_sic_vectall(knon,knon, & 655 684 & evap,snow_evap_diag,Tsurf_new,Roce,snow, & 656 685 & fq_fonte_diag,fqfonte_diag,dtime,t_coup, & … … 676 705 ! Calculation of albedo at snow (alb_neig) and update the age of snow (agesno) 677 706 ! 678 CALL albsno(k lon, knon, dtime, agesno(:), alb_neig(:), precip_snow(:))707 CALL albsno(knon, knon, dtime, agesno(:), alb_neig(:), precip_snow(:)) 679 708 680 709 WHERE (snow(1:knon) .LT. 0.0001) agesno(1:knon) = 0. … … 719 748 fcdi(ki) = f_cond_i - fsea 720 749 fcds(i) = f_cond_s 721 !bilg( ki) = bilg(ki)+f_cond_i750 !bilg(i) = bilg(i)+f_cond_i 722 751 END DO 723 752 … … 728 757 IF (iflag_seaice==1) THEN 729 758 ! Read from limit 730 CALL limit_read_hice(knon,knindex,hice) 759 !ym totally wrong since "hice" is an uncompressed field (klon) and limit_read_hice return a compressed field (knon) 760 !ym CALL limit_read_hice(knon,knindex,hice) 761 CALL limit_read_hice(knon, knindex, yhice) 762 DO i=1,knon 763 ki=knindex(i) 764 hice(ki) = yhice(i) 765 ENDDO 731 766 ENDIF 732 767 ! Formula Krinner et al. 1997 : h = (0.2 + 3.8(f_min**2))(1 + 2(f- f_min)) … … 736 771 DO i=1,knon 737 772 ki=knindex(i) 773 !ym WARNING : fsic uninitilazed, take initialisation similar to iflag_seaice==2 774 fsic(i) = pctsrf(ki,is_sic) 738 775 IF (precip_snow(i) > 0.) THEN 739 snow(i) = snow(i)+precip_snow(i)*dtime*(1.-snow_wfact*(1.-fsic( ki)))776 snow(i) = snow(i)+precip_snow(i)*dtime*(1.-snow_wfact*(1.-fsic(i))) 740 777 END IF 741 778 ! snow and ice sublimation … … 774 811 / (h_ice_max-h_ice_thick))) 775 812 ! quantity of new ice (formed at mean ice temp) 776 e_melt= -f_bot(i) * dtime * fsic( ki) &813 e_melt= -f_bot(i) * dtime * fsic(i) & 777 814 / (ice_lat+ice_cap/2.*(t_freeze-tice(ki))) 778 815 ! first increase height to h_thick 779 dhsic=MAX(0.,MIN(h_ice_thick-hice(ki),e_melt/(fsic( ki)*ice_den)))816 dhsic=MAX(0.,MIN(h_ice_thick-hice(ki),e_melt/(fsic(i)*ice_den))) 780 817 hice_i=hice(ki) 781 818 hice(ki)=dhsic+hice(ki) 782 e_melt=e_melt-fsic( ki)*dhsic819 e_melt=e_melt-fsic(i)*dhsic 783 820 IF (e_melt.GT.0.) THEN 784 821 ! frac_mf fraction used for lateral increase 785 dfsic=MIN(amax-fsic( ki),e_melt*frac_mf/ (hice(ki)*ice_den) )822 dfsic=MIN(amax-fsic(i),e_melt*frac_mf/ (hice(ki)*ice_den) ) 786 823 ! No lateral growth -> forced ocean 787 824 !fsic(ki)=fsic(ki)+dfsic 788 825 e_melt=e_melt-dfsic*hice(ki)*ice_den 789 826 ! rest used to increase height 790 hice(ki)=MIN(h_ice_max,hice(ki)+e_melt/( fsic( ki) * ice_den ) )827 hice(ki)=MIN(h_ice_max,hice(ki)+e_melt/( fsic(i) * ice_den ) ) 791 828 END IF 792 829 dh_basal_growth(ki)=(hice(ki)-hice_i)/dtime … … 799 836 ! bring ice to freezing and melt from below 800 837 ! quantity of melted ice 801 e_melt= f_bot(i) * dtime * fsic( ki) &838 e_melt= f_bot(i) * dtime * fsic(i) & 802 839 / (ice_lat+ice_cap/2.*(tice(ki)-t_freeze)) 803 840 ! first decrease height to h_thick 804 841 hice_i=hice(ki) 805 dhsic=MAX(0.,MIN(hice(ki)-h_ice_thick,e_melt/(fsic( ki)*ice_den)))842 dhsic=MAX(0.,MIN(hice(ki)-h_ice_thick,e_melt/(fsic(i)*ice_den))) 806 843 hice(ki)=hice(ki)-dhsic 807 e_melt=e_melt-fsic( ki)*dhsic*ice_den844 e_melt=e_melt-fsic(i)*dhsic*ice_den 808 845 809 846 IF (e_melt.GT.0) THEN 810 847 ! frac_mf fraction used for height decrease 811 dhsic=MAX(0.,MIN(hice(ki)-h_ice_min,e_melt/ice_den*frac_mf/fsic( ki)))848 dhsic=MAX(0.,MIN(hice(ki)-h_ice_min,e_melt/ice_den*frac_mf/fsic(i))) 812 849 hice(ki)=hice(ki)-dhsic 813 e_melt=e_melt-fsic( ki)*dhsic*ice_den850 e_melt=e_melt-fsic(i)*dhsic*ice_den 814 851 ! rest used to decrease fraction (up to 0!) 815 dfsic=MIN(fsic( ki),e_melt/(hice(ki)*ice_den))852 dfsic=MIN(fsic(i),e_melt/(hice(ki)*ice_den)) 816 853 ! Remaining heat not used if everything melted 817 854 e_melt=e_melt-dfsic*hice(ki)*ice_den … … 836 873 IF (e_melt.GT.0) THEN 837 874 ! lateral melt if ice too thin 838 dfsic=MAX(fsic( ki)-ice_frac_min,e_melt/(h_ice_min*ice_den)*fsic(ki))875 dfsic=MAX(fsic(i)-ice_frac_min,e_melt/(h_ice_min*ice_den)*fsic(i)) 839 876 ! if all melted do nothing with remaining heat 840 e_melt=MAX(0.,e_melt*fsic( ki)-dfsic*h_ice_min*ice_den)877 e_melt=MAX(0.,e_melt*fsic(i)-dfsic*h_ice_min*ice_den) 841 878 ! slab_bilg(ki) = slab_bilg(ki) + e_melt*ice_lat/dtime 842 879 END IF … … 881 918 !***********************************************o******************************* 882 919 !cumul fluxes. 883 bilg_cumul(:)=bilg_cumul(:)+bilg(:)/float(cpl_pas) 884 IF (MOD(itime,cpl_pas).EQ.0) THEN ! time to update tslab 885 bilg_cumul(:)=0. 886 END IF ! coupling time 920 DO j=i,knon 921 ki=knindex(i) 922 bilg_cumul(ki)=bilg_cumul(ki) + bilg(j)/float(cpl_pas) 923 ENDDO 924 925 !YM Pb for GPU port, done on an compressed field inside a compressed Kernel 926 !YM ==> move outside of subroutine 927 !YM CALL ocean_forced_ice_reset_bilg_cumul() 928 !YM IF (MOD(itime,cpl_pas).EQ.0) THEN ! time to update tslab 929 !YM bilg_cumul(1:klon)=0. 930 !YM END IF ! coupling time 887 931 888 932 ! write(*,*) 'hice 3',hice(1:100) 889 933 ! write(*,*) 'tice 3',tice(1:100) 890 934 !tests ice fraction 891 WHERE (fsic.LT.ice_frac_min) 892 tice=t_melt 893 hice=h_ice_min 894 END WHERE 935 !YM Pb for GPU port : done on uncompressed field inside a compressed kernel 936 !YM update fsic only on compressed index 937 !YM WHERE (fsic.LT.ice_frac_min) 938 !YM tice=t_melt 939 !YM hice=h_ice_min 940 !YM END WHERE 941 942 DO j=i,knon 943 ki=knindex(i) 944 IF (fsic(i).LT.ice_frac_min ) THEN 945 tice(ki)=t_melt 946 hice(ki)=h_ice_min 947 ENDIF 948 ENDDO 895 949 896 950 !write(*,*) 'hice 4',hice(1:100) … … 1003 1057 1004 1058 CASE(3) 1005 CALL albsno(k lon, knon, dtime, agesno(:), alb_neig(:), precip_snow(:))1059 CALL albsno(knon, knon, dtime, agesno(:), alb_neig(:), precip_snow(:)) 1006 1060 WHERE (snow(1:knon) .LT. 0.0001) agesno(1:knon) = 0. 1007 1061 alb1_new(:) = 0.0 … … 1024 1078 END SUBROUTINE ocean_forced_ice 1025 1079 1080 SUBROUTINE ocean_forced_ice_reset_bilg_cumul(itime, dtime, bilg_cumul) 1081 USE dimphy, ONLY : klon 1082 USE surface_data, ONLY : iflag_seaice, type_ocean, version_ocean 1083 IMPLICIT NONE 1084 INTEGER, INTENT(IN) :: itime 1085 REAL, INTENT(IN) :: dtime 1086 REAL, DIMENSION(klon), INTENT(INOUT) :: bilg_cumul 1087 INTEGER :: cpl_pas 1088 1089 IF (iflag_seaice/=0) THEN 1090 cpl_pas = NINT(86400./dtime * 1.0) ! une fois par jour 1091 IF (MOD(itime,cpl_pas).EQ.0) THEN ! time to update tslab 1092 IF ( .NOT. (type_ocean == 'couple' .OR. (type_ocean == 'slab'.AND.version_ocean=='sicINT'))) THEN 1093 bilg_cumul(1:klon)=0. 1094 ENDIF 1095 END IF ! coupling time 1096 ENDIF 1097 1098 END SUBROUTINE ocean_forced_ice_reset_bilg_cumul 1026 1099 !************************************************************************ 1027 1100 ! 1D case
Note: See TracChangeset
for help on using the changeset viewer.
