Changeset 5942 for LMDZ6/trunk/libf/phylmd/surf_ocean_mod.F90
- Timestamp:
- Dec 17, 2025, 7:33:39 PM (3 weeks ago)
- File:
-
- 1 edited
-
LMDZ6/trunk/libf/phylmd/surf_ocean_mod.F90 (modified) (11 diffs)
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/trunk/libf/phylmd/surf_ocean_mod.F90
r5662 r5942 50 50 USE limit_read_mod 51 51 USE config_ocean_skin_m, ONLY: activate_ocean_skin 52 USE lmdz_checksum 52 53 ! 53 54 ! This subroutine will make a call to ocean_XXX_noice according to the ocean mode (force, … … 63 64 !****************************************************************************** 64 65 INTEGER, INTENT(IN) :: itime, jour, knon 65 INTEGER, DIMENSION(k lon), INTENT(IN) :: knindex66 INTEGER, DIMENSION(knon), INTENT(IN) :: knindex 66 67 REAL, INTENT(IN) :: dtime 67 68 REAL, DIMENSION(klon), INTENT(IN) :: rlon, rlat 68 REAL, DIMENSION(k lon), INTENT(IN) :: swnet ! net shortwave radiation at surface69 REAL, DIMENSION(k lon), INTENT(IN) :: lwnet ! net longwave radiation at surface70 REAL, DIMENSION(k lon), INTENT(IN) :: alb1 ! albedo in visible SW interval71 REAL, DIMENSION(k lon), INTENT(IN) :: windsp ! wind at 10 m, in m s-169 REAL, DIMENSION(knon), INTENT(IN) :: swnet ! net shortwave radiation at surface 70 REAL, DIMENSION(knon), INTENT(IN) :: lwnet ! net longwave radiation at surface 71 REAL, DIMENSION(knon), INTENT(IN) :: alb1 ! albedo in visible SW interval 72 REAL, DIMENSION(knon), INTENT(IN) :: windsp ! wind at 10 m, in m s-1 72 73 REAL, DIMENSION(klon), INTENT(IN) :: rmu0 73 REAL, DIMENSION(k lon), INTENT(IN) :: fder74 REAL, DIMENSION(k lon), INTENT(IN) :: tsurf_in ! defined only for subscripts 1:knon75 REAL, DIMENSION(k lon), INTENT(IN) :: p1lay,z1lay ! pression (Pa) et altitude (m) du premier niveau76 REAL, DIMENSION(k lon), INTENT(IN) :: cdragh77 REAL, DIMENSION(k lon), INTENT(IN) :: cdragm78 REAL, DIMENSION(k lon), INTENT(IN) :: precip_rain, precip_snow, precip_bs79 REAL, DIMENSION(k lon), INTENT(IN) :: temp_air, spechum80 REAL, DIMENSION(k lon), INTENT(IN) :: AcoefH, AcoefQ, BcoefH, BcoefQ81 REAL, DIMENSION(k lon), INTENT(IN) :: AcoefU, AcoefV, BcoefU, BcoefV82 REAL, DIMENSION(k lon), INTENT(IN) :: ps83 REAL, DIMENSION(k lon), INTENT(IN) :: u1, v1, gustiness84 REAL, DIMENSION(k lon), INTENT(IN) :: rugoro74 REAL, DIMENSION(knon), INTENT(IN) :: fder 75 REAL, DIMENSION(knon), INTENT(IN) :: tsurf_in ! defined only for subscripts 1:knon 76 REAL, DIMENSION(knon), INTENT(IN) :: p1lay,z1lay ! pression (Pa) et altitude (m) du premier niveau 77 REAL, DIMENSION(knon), INTENT(IN) :: cdragh 78 REAL, DIMENSION(knon), INTENT(IN) :: cdragm 79 REAL, DIMENSION(knon), INTENT(IN) :: precip_rain, precip_snow, precip_bs 80 REAL, DIMENSION(knon), INTENT(IN) :: temp_air, spechum 81 REAL, DIMENSION(knon), INTENT(IN) :: AcoefH, AcoefQ, BcoefH, BcoefQ 82 REAL, DIMENSION(knon), INTENT(IN) :: AcoefU, AcoefV, BcoefU, BcoefV 83 REAL, DIMENSION(knon), INTENT(IN) :: ps 84 REAL, DIMENSION(knon), INTENT(IN) :: u1, v1, gustiness 85 REAL, DIMENSION(knon), INTENT(IN) :: rugoro 85 86 REAL, DIMENSION(klon,nbsrf), INTENT(IN) :: pctsrf 86 87 #ifdef ISO 87 REAL, DIMENSION(ntraciso,k lon), INTENT(IN) :: xtprecip_rain, xtprecip_snow88 REAL, DIMENSION(ntraciso,k lon), INTENT(IN) :: xtspechum88 REAL, DIMENSION(ntraciso,knon), INTENT(IN) :: xtprecip_rain, xtprecip_snow 89 REAL, DIMENSION(ntraciso,knon), INTENT(IN) :: xtspechum 89 90 #endif 90 91 91 92 ! In/Output variables 92 93 !****************************************************************************** 93 REAL, DIMENSION(k lon), INTENT(INOUT) :: snow94 REAL, DIMENSION(k lon), INTENT(INOUT) :: qsurf95 REAL, DIMENSION(k lon), INTENT(INOUT) :: agesno96 REAL, DIMENSION(k lon), INTENT(inOUT) :: z0h97 #ifdef ISO 98 REAL, DIMENSION(niso,k lon), INTENT(IN) :: xtsnow99 REAL, DIMENSION(niso,k lon), INTENT(INOUT):: Roce100 #endif 101 102 REAL, intent(inout):: delta_sst( :) ! (knon)94 REAL, DIMENSION(knon), INTENT(INOUT) :: snow 95 REAL, DIMENSION(knon), INTENT(INOUT) :: qsurf 96 REAL, DIMENSION(knon), INTENT(INOUT) :: agesno 97 REAL, DIMENSION(knon), INTENT(inOUT) :: z0h 98 #ifdef ISO 99 REAL, DIMENSION(niso,knon), INTENT(IN) :: xtsnow 100 REAL, DIMENSION(niso,knon), INTENT(INOUT):: Roce 101 #endif 102 103 REAL, intent(inout):: delta_sst(knon) ! (knon) 103 104 ! Ocean-air interface temperature minus bulk SST, in K. Defined 104 105 ! only if activate_ocean_skin >= 1. 105 106 106 real, intent(inout):: delta_sal( :) ! (knon)107 real, intent(inout):: delta_sal(knon) ! (knon) 107 108 ! Ocean-air interface salinity minus bulk salinity, in ppt. Defined 108 109 ! only if activate_ocean_skin >= 1. 109 110 110 REAL, intent(inout):: ds_ns( :) ! (knon)111 REAL, intent(inout):: ds_ns(knon) ! (knon) 111 112 ! "delta salinity near surface". Salinity variation in the 112 113 ! near-surface turbulent layer. That is subskin salinity minus 113 114 ! foundation salinity. In ppt. 114 115 115 REAL, intent(inout):: dt_ns( :) ! (knon)116 REAL, intent(inout):: dt_ns(knon) ! (knon) 116 117 ! "delta temperature near surface". Temperature variation in the 117 118 ! near-surface turbulent layer. That is subskin temperature 118 119 ! minus foundation temperature. (Can be negative.) In K. 119 120 120 REAL, intent(inout):: dter( :) ! (knon)121 REAL, intent(inout):: dter(knon) ! (knon) 121 122 ! Temperature variation in the diffusive microlayer, that is 122 123 ! ocean-air interface temperature minus subskin temperature. In 123 124 ! K. 124 125 125 REAL, intent(inout):: dser( :) ! (knon)126 REAL, intent(inout):: dser(knon) ! (knon) 126 127 ! Salinity variation in the diffusive microlayer, that is 127 128 ! ocean-air interface salinity minus subskin salinity. In ppt. 128 129 129 real, intent(inout):: dt_ds( :) ! (knon)130 real, intent(inout):: dt_ds(knon) ! (knon) 130 131 ! (tks / tkt) * dTer, in K 131 132 132 133 !GG 133 REAL, DIMENSION(k lon), INTENT(IN) :: dthetadz300134 REAL, DIMENSION(k lon), INTENT(OUT) :: Ampl134 REAL, DIMENSION(knon), INTENT(IN) :: dthetadz300 135 REAL, DIMENSION(knon), INTENT(OUT) :: Ampl 135 136 ! 136 137 137 138 ! Output variables 138 139 !************************************************************************** 139 REAL, DIMENSION(k lon), INTENT(OUT) :: z0m140 REAL, DIMENSION(knon), INTENT(OUT) :: z0m 140 141 !albedo SB >>> 141 142 ! REAL, DIMENSION(klon), INTENT(OUT) :: alb1_new ! new albedo in visible SW interval 142 143 ! REAL, DIMENSION(klon), INTENT(OUT) :: alb2_new ! new albedo in near IR interval 143 144 REAL, DIMENSION(6), INTENT(IN) :: SFRWL 144 REAL, DIMENSION(k lon,nsw), INTENT(OUT) :: alb_dir_new,alb_dif_new145 REAL, DIMENSION(knon,nsw), INTENT(OUT) :: alb_dir_new,alb_dif_new 145 146 !albedo SB <<< 146 REAL, DIMENSION(k lon), INTENT(OUT) :: evap, fluxsens, fluxlat147 REAL, DIMENSION(k lon), INTENT(OUT) :: tsurf_new ! sea surface temperature, in K148 REAL, DIMENSION(k lon), INTENT(OUT) :: dflux_s, dflux_l149 REAL, DIMENSION(klon), INTENT(OUT) :: lmt_bils 150 REAL, DIMENSION(k lon), INTENT(OUT) :: flux_u1, flux_v1151 152 REAL, intent(out):: tkt( :) ! (knon)147 REAL, DIMENSION(knon), INTENT(OUT) :: evap, fluxsens, fluxlat 148 REAL, DIMENSION(knon), INTENT(OUT) :: tsurf_new ! sea surface temperature, in K 149 REAL, DIMENSION(knon), INTENT(OUT) :: dflux_s, dflux_l 150 REAL, DIMENSION(klon), INTENT(OUT) :: lmt_bils ! ==> YM : warning variable en klon !!! 151 REAL, DIMENSION(knon), INTENT(OUT) :: flux_u1, flux_v1 152 153 REAL, intent(out):: tkt(knon) ! (knon) 153 154 ! �paisseur (m) de la couche de diffusion thermique (microlayer) 154 155 ! cool skin thickness 155 156 156 REAL, intent(out):: tks( :) ! (knon)157 REAL, intent(out):: tks(knon) ! (knon) 157 158 ! �paisseur (m) de la couche de diffusion de masse (microlayer) 158 159 159 REAL, intent(out):: taur( :) ! (knon)160 REAL, intent(out):: taur(knon) ! (knon) 160 161 ! momentum flux due to rain, in Pa 161 162 162 real, intent(out):: sss( :) ! (klon)163 real, intent(out):: sss(knon) ! (klon) 163 164 ! Bulk salinity of the surface layer of the ocean, in ppt. (Only 164 165 ! defined for subscripts 1:knon, but we have to declare it with … … 166 167 167 168 #ifdef ISO 168 REAL, DIMENSION(ntraciso,k lon), INTENT(out) :: xtevap ! isotopes in surface evaporation flux169 REAL, DIMENSION(k lon), INTENT(out) :: h1 ! just a diagnostic, not useful for the simulation169 REAL, DIMENSION(ntraciso,knon), INTENT(out) :: xtevap ! isotopes in surface evaporation flux 170 REAL, DIMENSION(knon), INTENT(out) :: h1 ! just a diagnostic, not useful for the simulation 170 171 #endif 171 172 … … 175 176 REAL :: tmp 176 177 REAL, PARAMETER :: cepdu2=(0.1)**2 177 REAL, DIMENSION(k lon) :: alb_eau, z0_lim178 REAL, DIMENSION(k lon) :: radsol179 REAL, DIMENSION(k lon) :: cdragq ! Cdrag pour l'evaporation180 REAL, DIMENSION(k lon) :: precip_totsnow178 REAL, DIMENSION(knon) :: alb_eau, z0_lim 179 REAL, DIMENSION(knon) :: radsol 180 REAL, DIMENSION(knon) :: cdragq ! Cdrag pour l'evaporation 181 REAL, DIMENSION(knon) :: precip_totsnow 181 182 CHARACTER(len=20),PARAMETER :: modname="surf_ocean" 182 183 REAL rhoa(knon) ! density of moist air (kg / m3) … … 185 186 REAL t_int(knon) ! ocean-air interface temperature, in K 186 187 REAL s_int(knon) ! ocean-air interface salinity, in ppt 187 188 REAL, DIMENSION(knon) :: yrlat ! compressed latitude 188 189 !************************************************************************** 189 190 … … 207 208 ! 208 209 !****************************************************************************** 209 radsol(1:klon) = 0.0 ! initialisation a priori inutile210 !ym radsol(1:klon) = 0.0 ! initialisation a priori inutile 210 211 radsol(1:knon) = swnet(1:knon) + lwnet(1:knon) 211 212 … … 293 294 !****************************************************************************** 294 295 IF (type_ocean.NE.'slab') THEN 295 lmt_bils(1:klon)=0. 296 !ym warning uncompressed variable ==> klon 297 !ym initialised outside lmt_bils(1:klon)=0. 298 !ym better to do diag outside in future 296 299 DO i=1,knon 297 300 lmt_bils(knindex(i))=(swnet(i)+lwnet(i)+fluxsens(i)+fluxlat(i)) & … … 309 312 IF (iflag_cycle_diurne.GE.1) THEN 310 313 ! 311 CALL alboc_cd( rmu0,alb_eau)314 CALL alboc_cd(knon, rmu0,alb_eau) 312 315 ! 313 316 !--ad-hoc correction for model radiative balance tuning 314 317 !--now outside alboc_cd routine 315 alb_eau(1:k lon) = fmagic*alb_eau(1:klon) + pmagic316 alb_eau(1:k lon)=MIN(MAX(alb_eau(1:klon),0.0),1.0)318 alb_eau(1:knon) = fmagic*alb_eau(1:knon) + pmagic 319 alb_eau(1:knon)=MIN(MAX(alb_eau(1:knon),0.0),1.0) 317 320 ! 318 321 ELSE 319 322 ! 320 CALL alboc(REAL(jour),rlat,alb_eau) 323 DO i =1, knon 324 yrlat(i) = rlat(knindex(i)) 325 ENDDO 326 327 CALL alboc(knon, REAL(jour), yrlat, alb_eau) 321 328 !--ad-hoc correction for model radiative balance tuning 322 329 !--now outside alboc routine 323 alb_eau(1:k lon) = fmagic*alb_eau(1:klon) + pmagic324 alb_eau(1:k lon)=MIN(MAX(alb_eau(1:klon),0.04),0.60)330 alb_eau(1:knon) = fmagic*alb_eau(1:knon) + pmagic 331 alb_eau(1:knon)=MIN(MAX(alb_eau(1:knon),0.04),0.60) 325 332 ! 326 333 ENDIF … … 328 335 DO i =1, knon 329 336 DO k=1,nsw 330 alb_dir_new(i,k) = alb_eau( knindex(i))337 alb_dir_new(i,k) = alb_eau(i) 331 338 ENDDO 332 339 ENDDO … … 340 347 !--albedo for direct and diffuse radiation are different 341 348 ! 349 CALL checksum("yalb_dir_new_ocean",alb_dir_new(1:knon,:)) 342 350 CALL ocean_albedo(knon,rmu0,knindex,windsp,SFRWL,alb_dir_new,alb_dif_new) 351 CALL checksum("yalb_dir_new_ocean",alb_dir_new(1:knon,:)) 352 343 353 ! 344 354 !--ad-hoc correction for model radiative balance tuning … … 391 401 392 402 if (activate_ocean_skin >= 1) then 403 !ym not porting to GPU for now 393 404 if (type_ocean /= 'couple') sss(:knon) = 35. 394 405 call bulk_flux(tkt, tks, taur, dter, dser, t_int, s_int, ds_ns, dt_ns, &
Note: See TracChangeset
for help on using the changeset viewer.
