Changeset 3815


Ignore:
Timestamp:
Feb 1, 2021, 3:30:57 PM (3 years ago)
Author:
lguez
Message:

Merge Ocean_skin branch back into trunk

Location:
LMDZ6/trunk
Files:
23 edited

Legend:

Unmodified
Added
Removed
  • LMDZ6/trunk

  • LMDZ6/trunk/DefLists/field_def_lmdz.xml

    r3791 r3815  
    522522        <field id="flx_co2_ff"     long_name="CO2 flux from ff"               unit="kg CO2/m2/s" />    <!-- Added OB -->
    523523        <field id="flx_co2_bb"     long_name="CO2 flux from bb"               unit="kg CO2/m2/s" />    <!-- Added OB -->
     524        <field id="delta_SST" long_name="ocean-air interface temperature minus bulk SST" unit="K" detect_missing_value=".true." />
     525        <field id="delta_sal"
     526               long_name="ocean-air interface salinity minus bulk salinity"
     527               unit="ppt" detect_missing_value=".true." />
     528        <field id="dS_ns" long_name="delta salinity near surface" unit="ppt" detect_missing_value=".true." />
     529        <field id="dT_ns" long_name="sub-skin temperature minus foundation temperature" unit="K" detect_missing_value=".true." />
     530        <field id="dTer"               long_name="interface temperature minus sub-skin temperature"            unit="K" detect_missing_value=".true." />
     531        <field id="dSer"
     532               long_name="salinity variation in the diffusive microlayer"
     533               unit="ppt" detect_missing_value=".true." />
     534        <field id="tkt" long_name="thickness of thermal microlayer"            unit="m"                detect_missing_value=".true." />
     535        <field id="tks" long_name="thickness of salinity microlayer"           unit="m"                detect_missing_value=".true." />
     536        <field id="taur" long_name="momentum flux due to rain"         unit="Pa"               detect_missing_value=".true." />
     537        <field id="SSS" long_name="bulk sea-surface salinity" unit="ppt" detect_missing_value=".true." />
    524538    </field_group>
    525539
  • LMDZ6/trunk/bld.cfg

    r3796 r3815  
    3838src::cosp    %COSP
    3939src::ext_src %EXT_SRC
     40src::Ocean_skin %SRC_PATH/%PHYS/Ocean_skin
    4041
    4142bld::lib            lmdz
  • LMDZ6/trunk/libf/dynphy_lonlat/phylmd/ce0l.F90

    r2665 r3815  
    2929  USE iniphysiq_mod,  ONLY: iniphysiq
    3030  USE mod_const_mpi,  ONLY: comm_lmdz
     31
    3132#ifdef CPP_PARA
    3233  USE mod_const_mpi,  ONLY: init_const_mpi
    33   USE parallel_lmdz,  ONLY: init_parallel, mpi_rank, omp_rank
     34  USE parallel_lmdz,  ONLY: init_parallel, mpi_rank, omp_rank, using_mpi
    3435  USE bands,          ONLY: read_distrib, distrib_phys
    3536  USE mod_hallo,      ONLY: init_mod_hallo
    3637  USE mod_interface_dyn_phys, ONLY: init_interface_dyn_phys
    37 #endif
     38#ifdef CPP_XIOS
     39  USE xios, only: xios_finalize
     40#endif
     41#endif
     42
    3843  USE comconst_mod, ONLY: cpp, daysec, dtphys, dtvr, g, kappa, omeg, r, rad, &
    3944                          pi, jmp1
     
    5055  include "comgeom2.h"
    5156  include "iniprint.h"
     57#ifdef CPP_MPI
     58  include 'mpif.h'
     59#endif
     60 
    5261  REAL               :: masque(iip1,jjp1)             !--- CONTINENTAL MASK
    5362  REAL               :: phis  (iip1,jjp1)             !--- GROUND GEOPOTENTIAL
     
    6776  REAL, ALLOCATABLE  :: masktmp(:)
    6877
    69 #ifndef CPP_PARA
     78#ifdef CPP_PARA
     79  integer ierr
     80#else
    7081! for iniphysiq in serial mode
    7182  INTEGER,PARAMETER :: mpi_rank=0
     
    168179    ocemask = ocetmp
    169180    IF(dlat_omask(1)<dlat_omask(jml_omask)) THEN
    170       DO j=1,jjp1; ocemask(:,j) = ocetmp(:,jjp1-j+1); END DO
     181       DO j=1,jjp1
     182          ocemask(:,j) = ocetmp(:,jjp1-j+1)
     183       END DO
    171184    END IF
    172185    DEALLOCATE(ocetmp,lon_omask,lat_omask,dlon_omask,dlat_omask)
     
    239252#ifdef CPP_PARA
    240253  END IF
     254#ifdef CPP_XIOS
     255  CALL xios_finalize
     256#endif
     257#ifdef CPP_MPI
     258  IF (using_mpi) call MPI_FINALIZE(ierr)
     259#endif
    241260#endif
    242261
  • LMDZ6/trunk/libf/misc/handle_err_m.F90

    r3435 r3815  
    2727
    2828    if (ncerr /= nf90_noerr) then
     29       print *, "NetCDF95 handle_err:"
    2930       print *, message, ":"
    3031       if (present(varid)) print *, "varid = ", varid
     
    3940          end if
    4041       end if
    41        call abort_physic("NetCDF95 handle_err", "", 1)
     42       call abort_physic("NetCDF95 handle_err", "see above", 1)
    4243    end if
    4344
  • LMDZ6/trunk/libf/phylmd/YOMCST.h

    r3447 r3815  
    2222      REAL RMO3,RMCO2,RMC,RMCH4,RMN2O,RMCFC11,RMCFC12
    2323      REAL R,RMD,RMV,RD,RV,RCPD,RCPV,RCVD,RCVV
    24       REAL RKAPPA,RETV
     24      REAL RKAPPA,RETV, eps_w
    2525! A1.5,6 Thermodynamic liquid,solid phases
    2626      REAL RCW,RCS
     
    3838     &      ,R     ,RMD   ,RMV   ,RD    ,RV    ,RCPD                    &
    3939     &      ,RMO3  ,RMCO2 ,RMC   ,RMCH4 ,RMN2O ,RMCFC11 ,RMCFC12        &
    40      &      ,RCPV  ,RCVD  ,RCVV  ,RKAPPA,RETV                           &
     40     &      ,RCPV  ,RCVD  ,RCVV  ,RKAPPA,RETV, eps_w                    &
    4141     &      ,RCW   ,RCS                                                 &
    4242     &      ,RLVTT ,RLSTT ,RLMLT ,RTT   ,RATM                           &
  • LMDZ6/trunk/libf/phylmd/calcul_fluxs_mod.F90

    r3319 r3815  
    1313       fqsat, petAcoef, peqAcoef, petBcoef, peqBcoef, &
    1414       tsurf_new, evap, fluxlat, fluxsens, dflux_s, dflux_l, &
    15        sens_prec_liq, sens_prec_sol, lat_prec_liq, lat_prec_sol)
     15       sens_prec_liq, sens_prec_sol, lat_prec_liq, lat_prec_sol, rhoa)
    1616 
    1717   
    1818    USE dimphy, ONLY : klon
    1919    USE indice_sol_mod
     20    use sens_heat_rain_m, only: sens_heat_rain
    2021
    2122    INCLUDE "clesphys.h"
     
    7172    REAL, DIMENSION(klon), INTENT(IN)    :: ps, q1lay
    7273    REAL, DIMENSION(klon), INTENT(IN)    :: tsurf, p1lay, cal, beta, cdragh,cdragq
    73     REAL, DIMENSION(klon), INTENT(IN)    :: precip_rain, precip_snow ! pas utiles
     74    REAL, DIMENSION(klon), INTENT(IN)    :: precip_rain, precip_snow
    7475    REAL, DIMENSION(klon), INTENT(IN)    :: radsol, dif_grnd
    7576    REAL, DIMENSION(klon), INTENT(IN)    :: t1lay, u1lay, v1lay,gustiness
    7677    REAL,                  INTENT(IN)    :: fqsat ! correction factor on qsat (generally 0.98 over salty water, 1 everywhere else)
    7778
     79    real, intent(in), optional:: rhoa(:) ! (knon)
     80    ! density of moist air  (kg / m3)
     81
    7882! Parametres entree-sorties
    7983!****************************************************************************************
     
    8589    REAL, DIMENSION(klon), INTENT(OUT)   :: tsurf_new, evap, fluxsens, fluxlat
    8690    REAL, DIMENSION(klon), INTENT(OUT)   :: dflux_s, dflux_l
    87     REAL, DIMENSION(klon), OPTIONAL      :: sens_prec_liq, sens_prec_sol
     91    REAL, intent(out), OPTIONAL:: sens_prec_liq(:), sens_prec_sol(:) ! (knon)
    8892    REAL, DIMENSION(klon), OPTIONAL      :: lat_prec_liq, lat_prec_sol
    8993
     
    140144    dflux_s = 0.
    141145    dflux_l = 0.
    142     if (PRESENT(sens_prec_liq)) sens_prec_liq = 0.
    143     if (PRESENT(sens_prec_sol)) sens_prec_sol = 0.
    144146    if (PRESENT(lat_prec_liq)) lat_prec_liq = 0.
    145147    if (PRESENT(lat_prec_sol)) lat_prec_sol = 0.
     
    259261!
    260262! calcul de l'enthalpie des precipitations liquides et solides
    261 !
    262 !       if (PRESENT(enth_prec_liq))                   &
    263 !       enth_prec_liq(i) = rcw * (t1lay(i) - tsurf(i)) * &
    264 !                          precip_rain(i)
    265 !       if (PRESENT(enth_prec_sol))                  &
    266 !       enth_prec_sol(i) = rcs * (t1lay(i) - tsurf(i)) * &
    267 !                          precip_snow(i)
    268 ! On calcule par rapport a T=0
    269        if (PRESENT(sens_prec_liq))                   &
    270          sens_prec_liq(i) = rcw * (t1lay(i) - RTT) * &
    271                           precip_rain(i)
    272        if (PRESENT(sens_prec_sol))                   &
    273          sens_prec_sol(i) = rcs * (t1lay(i) - RTT) * &
    274                           precip_snow(i)
     263       if (PRESENT(sens_prec_liq)) sens_prec_liq(i) &
     264            = - sens_heat_rain(precip_rain(i) + precip_snow(i), t1lay(i), &
     265            q1lay(i), rhoa(i), rlvtt, tsurf_new(i), ps(i))
     266       if (PRESENT(sens_prec_sol)) sens_prec_sol(i) = 0.
     267       ! On calcule par rapport a T=0
     268       !! sens_prec_liq(i) = rcw * (t1lay(i) - RTT) * precip_rain(i)
     269       !! sens_prec_sol(i) = rcs * (t1lay(i) - RTT) * precip_snow(i)
     270
    275271       if (PRESENT(lat_prec_liq))                    &
    276272         lat_prec_liq(i) =  precip_rain(i) * (RLVTT - RLVTT)
     
    280276
    281277   
    282 !       if (PRESENT(sens_prec_liq))                  &
    283 !          WRITE(*,*)' calculs_fluxs sens_prec_liq (min, max)', &
    284 !          MINVAL(sens_prec_liq(1:knon)), MAXVAL(sens_prec_liq(1:knon))
    285 !       if (PRESENT(sens_prec_sol))                  &
    286 !          WRITE(*,*)' calculs_fluxs sens_prec_sol (min, max)', &
    287 !          MINVAL(sens_prec_sol(1:knon)), MAXVAL(sens_prec_sol(1:knon))
    288  
    289 !
    290 !****************************************************************************************
     278!**************************************************************************
    291279!
    292280  END SUBROUTINE calcul_fluxs
  • LMDZ6/trunk/libf/phylmd/conf_phys_m.F90

    r3792 r3815  
    2929    USE mod_grid_phy_lmdz, ONLY: klon_glo
    3030    USE print_control_mod, ONLY: lunout
     31    use config_ocean_skin_m, only: config_ocean_skin
    3132    USE phys_state_var_mod, ONLY: phys_tstep
    3233
     
    28202821
    28212822    !$OMP END MASTER
    2822 
    2823     RETURN
     2823    call config_ocean_skin
    28242824
    28252825  END SUBROUTINE conf_phys
  • LMDZ6/trunk/libf/phylmd/cpl_mod.F90

    r3790 r3815  
    4848  REAL, ALLOCATABLE, DIMENSION(:,:), SAVE   :: cpl_snow, cpl_evap, cpl_tsol
    4949  !$OMP THREADPRIVATE(cpl_snow,cpl_evap,cpl_tsol)
     50
     51  REAL, ALLOCATABLE, SAVE:: cpl_delta_sst(:), cpl_delta_sal(:)
     52  !$OMP THREADPRIVATE(cpl_delta_sst, cpl_delta_sal)
     53 
    5054  REAL, ALLOCATABLE, DIMENSION(:,:), SAVE   :: cpl_fder, cpl_albe, cpl_taux, cpl_tauy
    5155  !$OMP THREADPRIVATE(cpl_fder,cpl_albe,cpl_taux,cpl_tauy)
     
    6670  REAL, ALLOCATABLE, DIMENSION(:,:), SAVE   :: read_sit     ! sea ice temperature
    6771  !$OMP THREADPRIVATE(read_sit)
     72
     73  REAL, ALLOCATABLE, SAVE:: read_sss(:, :)
     74  ! bulk salinity of the surface layer of the ocean, in ppt
     75  !$OMP THREADPRIVATE(read_sss)
     76
    6877  REAL, ALLOCATABLE, DIMENSION(:,:), SAVE   :: read_sic     ! sea ice fraction
    6978  !$OMP THREADPRIVATE(read_sic)
     
    8493  REAL, ALLOCATABLE, DIMENSION(:,:,:), SAVE :: cpl_snow2D, cpl_evap2D, cpl_tsol2D
    8594  !$OMP THREADPRIVATE(cpl_snow2D, cpl_evap2D, cpl_tsol2D)
     95
     96  REAL, ALLOCATABLE, SAVE:: cpl_delta_sst_2D(:,:), cpl_delta_sal_2D(:,:)
     97  !$OMP THREADPRIVATE(cpl_delta_sst_2D, cpl_delta_sal_2D)
     98
    8699  REAL, ALLOCATABLE, DIMENSION(:,:,:), SAVE :: cpl_fder2D, cpl_albe2D
    87100  !$OMP THREADPRIVATE(cpl_fder2D, cpl_albe2D)
     
    122135    USE geometry_mod, ONLY : longitude_deg, latitude_deg, ind_cell_glo, cell_area
    123136    USE ioipsl_getin_p_mod, ONLY: getin_p
     137    use config_ocean_skin_m, only: activate_ocean_skin
    124138
    125139! Input arguments
     
    218232    ALLOCATE(read_sit(nbp_lon, jj_nb), stat = error)
    219233    sum_error = sum_error + error
     234
     235    if (activate_ocean_skin >= 1) then
     236       ALLOCATE(read_sss(nbp_lon, jj_nb), stat = error)
     237       sum_error = sum_error + error
     238   
     239       if (activate_ocean_skin == 2) then
     240          ALLOCATE(cpl_delta_sst(klon), cpl_delta_sal(klon), stat = error)
     241          sum_error = sum_error + error
     242       end if
     243    end if
     244
    220245    ALLOCATE(read_alb_sic(nbp_lon, jj_nb), stat = error)
    221246    sum_error = sum_error + error
     
    380405    USE time_phylmdz_mod, ONLY: start_time, itau_phy
    381406    USE mod_grid_phy_lmdz, ONLY : nbp_lon, nbp_lat
     407    use config_ocean_skin_m, only: activate_ocean_skin
    382408
    383409    INCLUDE "YOMCST.h"
     
    441467       read_alb_sic(:,:) = tab_read_flds(:,:,idr_icealw)  ! Albedo at sea ice
    442468       read_sit(:,:)     = tab_read_flds(:,:,idr_icetem)  ! Sea ice temperature
     469       if (activate_ocean_skin >= 1) read_sss(:,:) = tab_read_flds(:,:,idr_sss)
    443470!$OMP END MASTER
    444471
     
    498525!
    499526
    500   SUBROUTINE cpl_receive_ocean_fields(knon, knindex, tsurf_new, u0_new, v0_new)
     527  SUBROUTINE cpl_receive_ocean_fields(knon, knindex, tsurf_new, u0_new, &
     528       v0_new, sss)
    501529!
    502530! This routine returns the field for the ocean that has been read from the coupler
     
    506534    USE carbon_cycle_mod, ONLY : carbon_cycle_cpl, fco2_ocn_day
    507535    USE indice_sol_mod
     536    use config_ocean_skin_m, only: activate_ocean_skin
    508537
    509538! Input arguments
     
    515544!*************************************************************************************
    516545    REAL, DIMENSION(klon), INTENT(OUT)      :: tsurf_new
     546
     547    REAL, INTENT(OUT):: sss(:) ! (klon)
     548    ! bulk salinity of the surface layer of the ocean, in ppt
     549
    517550    REAL, DIMENSION(klon), INTENT(OUT)      :: u0_new
    518551    REAL, DIMENSION(klon), INTENT(OUT)      :: v0_new
     
    529562!*************************************************************************************
    530563    CALL cpl2gath(read_sst, tsurf_new, knon, knindex)
     564    if (activate_ocean_skin >= 1) CALL cpl2gath(read_sss, sss, knon, knindex)
    531565    CALL cpl2gath(read_sic, sic_new, knon, knindex)
    532566    CALL cpl2gath(read_u0, u0_new, knon, knindex)
     
    615649       swdown, lwdown, fluxlat, fluxsens, &
    616650       precip_rain, precip_snow, evap, tsurf, fder, albsol, taux, tauy, windsp,&
    617        sens_prec_liq, sens_prec_sol, lat_prec_liq, lat_prec_sol)
    618 !
    619 ! This subroutine cumulates some fields for each time-step during a coupling
    620 ! period. At last time-step in a coupling period the fields are transformed to the
    621 ! grid accepted by the coupler. No sending to the coupler will be done from here
    622 ! (it is done in cpl_send_seaice_fields).
    623 !
     651       sens_prec_liq, sens_prec_sol, lat_prec_liq, lat_prec_sol, delta_sst, &
     652       delta_sal)
     653
     654    ! This subroutine cumulates some fields for each time-step during
     655    ! a coupling period. At last time-step in a coupling period the
     656    ! fields are transformed to the grid accepted by the coupler. No
     657    ! sending to the coupler will be done from here (it is done in
     658    ! cpl_send_seaice_fields). Crucial hypothesis is that the surface
     659    ! fractions do not change between coupling time-steps.
     660
    624661    USE carbon_cycle_mod, ONLY : carbon_cycle_cpl, co2_send
    625662    USE indice_sol_mod
    626663    USE mod_grid_phy_lmdz, ONLY : nbp_lon, nbp_lat
     664    use config_ocean_skin_m, only: activate_ocean_skin
    627665
    628666! Input arguments
     
    636674    REAL, DIMENSION(klon), INTENT(IN)       :: evap, tsurf, fder, albsol
    637675    REAL, DIMENSION(klon), INTENT(IN)       :: taux, tauy, windsp
    638     REAL, DIMENSION(klon), INTENT(IN)       :: sens_prec_liq, sens_prec_sol
     676    REAL, INTENT(IN):: sens_prec_liq(:), sens_prec_sol(:) ! (knon)
    639677    REAL, DIMENSION(klon), INTENT(IN)       :: lat_prec_liq, lat_prec_sol
     678   
     679    REAL, intent(in):: delta_sst(:) ! (knon)
     680    ! Ocean-air interface temperature minus bulk SST, in
     681    ! K. Defined only if activate_ocean_skin >= 1.
     682
     683    real, intent(in):: delta_sal(:) ! (knon)
     684    ! Ocean-air interface salinity minus bulk salinity, in ppt.
    640685
    641686! Local variables
     
    673718       cpl_taumod(1:knon,cpl_index) = 0.0
    674719       IF (carbon_cycle_cpl) cpl_atm_co2(1:knon,cpl_index) = 0.0
     720
     721       if (activate_ocean_skin == 2) then
     722          cpl_delta_sst = 0.
     723          cpl_delta_sal = 0.
     724       end if
    675725    ENDIF
    676726       
     
    714764!!---OB: this is correct but why knindex ??
    715765       ENDIF
     766
     767       if (activate_ocean_skin == 2) then
     768          cpl_delta_sst(ig) = cpl_delta_sst(ig) + delta_sst(ig) / REAL(nexca)
     769          cpl_delta_sal(ig) = cpl_delta_sal(ig) + delta_sal(ig) / REAL(nexca)
     770       end if
    716771     ENDDO
    717772
     
    759814             sum_error = sum_error + error
    760815          ENDIF
     816
     817          if (activate_ocean_skin == 2) then
     818             ALLOCATE(cpl_delta_sst_2D(nbp_lon, jj_nb), &
     819                  cpl_delta_sal_2D(nbp_lon, jj_nb), stat = error)
     820             sum_error = sum_error + error
     821          end if
    761822
    762823          IF (sum_error /= 0) THEN
     
    814875       IF (carbon_cycle_cpl) &
    815876            CALL gath2cpl(cpl_atm_co2(:,cpl_index), cpl_atm_co22D(:,:), knon, knindex)
    816    ENDIF
     877       if (activate_ocean_skin == 2) then
     878          CALL gath2cpl(cpl_delta_sst, cpl_delta_sst_2D, knon, knindex)
     879          CALL gath2cpl(cpl_delta_sal, cpl_delta_sal_2D, knon, knindex)
     880       end if
     881    ENDIF
    817882
    818883  END SUBROUTINE cpl_send_ocean_fields
     
    850915    REAL, DIMENSION(klon), INTENT(IN)       :: albsol, taux, tauy
    851916    REAL, DIMENSION(klon,nbsrf), INTENT(IN) :: pctsrf
    852     REAL, DIMENSION(klon), INTENT(IN)       :: sens_prec_liq, sens_prec_sol
     917    REAL, INTENT(IN):: sens_prec_liq(:), sens_prec_sol(:) ! (knon)
    853918    REAL, DIMENSION(klon), INTENT(IN)       :: lat_prec_liq, lat_prec_sol
    854919    LOGICAL, INTENT(IN)                     :: lafin
     
    11491214    USE mod_grid_phy_lmdz, ONLY : nbp_lon, nbp_lat
    11501215    USE time_phylmdz_mod, ONLY: start_time, itau_phy
     1216    use config_ocean_skin_m, only: activate_ocean_skin
    11511217! Some includes
    11521218!   
     
    12061272    tab_flds(:,:,ids_qraiic) = cpl_sens_rain2D(:,:,2)
    12071273    tab_flds(:,:,ids_qsnoic) = cpl_sens_snow2D(:,:,2)
     1274
     1275    if (activate_ocean_skin == 2) then
     1276       tab_flds(:, :, ids_delta_sst) = cpl_delta_sst_2D
     1277       tab_flds(:, :, ids_delta_sal) = cpl_delta_sal_2D
     1278    end if
    12081279   
    12091280    IF (version_ocean=='nemo') THEN
     
    14421513    ENDIF
    14431514
     1515    if (activate_ocean_skin == 2) deallocate(cpl_delta_sst_2d, cpl_delta_sal_2d)
     1516
    14441517    IF (sum_error /= 0) THEN
    14451518       abort_message='Pb in deallocation of cpl_xxxx2D coupling variables'
  • LMDZ6/trunk/libf/phylmd/oasis.F90

    r3465 r3815  
    5959  INTEGER, PARAMETER :: ids_qraiic = 28
    6060  INTEGER, PARAMETER :: ids_qsnoic = 29
    61   INTEGER, PARAMETER :: maxsend    = 29  ! Maximum number of fields to send
     61  INTEGER, PARAMETER :: ids_delta_sst = 30, ids_delta_sal = 31
     62 
     63  INTEGER, PARAMETER :: maxsend    = 31  ! Maximum number of fields to send
    6264 
    6365  ! Id for fields received from ocean
     66
    6467  INTEGER, PARAMETER :: idr_sisutw = 1
    6568  INTEGER, PARAMETER :: idr_icecov = 2
     
    7073  INTEGER, PARAMETER :: idr_curenz = 7
    7174  INTEGER, PARAMETER :: idr_oceco2 = 8
    72   INTEGER, PARAMETER :: maxrecv    = 8  ! Maximum number of fields to receive
     75
     76  INTEGER, PARAMETER :: idr_sss = 9
     77  ! bulk salinity of the surface layer of the ocean, in ppt
     78
     79  INTEGER, PARAMETER :: maxrecv    = 9  ! Maximum number of fields to receive
    7380 
    7481
     
    110117    USE geometry_mod, ONLY: ind_cell_glo                   
    111118    USE mod_phys_lmdz_mpi_data, ONLY: klon_mpi_para_nb
    112    
    113 
     119    use config_ocean_skin_m, only: activate_ocean_skin
    114120
    115121! Local variables
     
    183189    infosend(ids_calvin)%action = .TRUE. ; infosend(ids_calvin)%name = 'COCALVIN'
    184190   
     191    if (activate_ocean_skin == 2) then
     192       infosend(ids_delta_sst)%action = .TRUE.
     193       infosend(ids_delta_sst)%name = 'CODELSST'
     194       infosend(ids_delta_sal)%action = .TRUE.
     195       infosend(ids_delta_sal)%name = 'CODELSSS'
     196    end if
     197           
    185198    IF (version_ocean=='nemo') THEN
    186199        infosend(ids_shftot)%action = .TRUE. ; infosend(ids_shftot)%name = 'COQSRMIX'
     
    219232   inforecv(idr_icealw)%action = .TRUE. ; inforecv(idr_icealw)%name = 'SIICEALW'
    220233   inforecv(idr_icetem)%action = .TRUE. ; inforecv(idr_icetem)%name = 'SIICTEMW'
     234
     235   if (activate_ocean_skin >= 1) then
     236      inforecv(idr_sss)%action = .TRUE.
     237      inforecv(idr_sss)%name = 'SISUSALW'
     238   end if
    221239   
    222240   IF (cpl_current ) THEN
  • LMDZ6/trunk/libf/phylmd/ocean_cpl_mod.F90

    r3102 r3815  
    5252       AcoefH, AcoefQ, BcoefH, BcoefQ, &
    5353       AcoefU, AcoefV, BcoefU, BcoefV, &
    54        ps, u1, v1, gustiness, &
     54       ps, u1, v1, gustiness, tsurf_in, &
    5555       radsol, snow, agesno, &
    5656       qsurf, evap, fluxsens, fluxlat, flux_u1, flux_v1, &
    57        tsurf_new, dflux_s, dflux_l)
     57       tsurf_new, dflux_s, dflux_l, sens_prec_liq, sss, delta_sal, rhoa, &
     58       delta_sst)
    5859
    5960!
     
    6364!
    6465    USE dimphy,           ONLY : klon
    65     USE cpl_mod
    6666    USE calcul_fluxs_mod
    6767    USE indice_sol_mod
    6868    USE phys_output_var_mod, ONLY : sens_prec_liq_o, sens_prec_sol_o, lat_prec_liq_o, lat_prec_sol_o
    69     USE cpl_mod,             ONLY : gath2cpl
     69    USE cpl_mod, ONLY : gath2cpl, cpl_receive_ocean_fields, &
     70         cpl_send_ocean_fields
     71    use config_ocean_skin_m, only: activate_ocean_skin
    7072
    7173    INCLUDE "YOMCST.h"
     
    9092    REAL, DIMENSION(klon), INTENT(IN)        :: ps
    9193    REAL, DIMENSION(klon), INTENT(IN)        :: u1, v1, gustiness
     94    REAL, INTENT(IN) :: tsurf_in(:) ! (klon)
     95
     96    real, intent(in):: delta_sal(:) ! (knon)
     97    ! ocean-air interface salinity minus bulk salinity, in ppt
     98
     99    real, intent(in):: rhoa(:) ! (knon) density of moist air  (kg / m3)
     100
     101    REAL, intent(in):: delta_sst(:) ! (knon)
     102    ! Ocean-air interface temperature minus bulk SST, in K. Defined
     103    ! only if activate_ocean_skin >= 1.
    92104
    93105! In/Output arguments
     
    104116    REAL, DIMENSION(klon), INTENT(OUT)       :: tsurf_new
    105117    REAL, DIMENSION(klon), INTENT(OUT)       :: dflux_s, dflux_l     
     118    REAL, intent(out):: sens_prec_liq(:) ! (knon)
     119
     120    REAL, INTENT(OUT):: sss(:) ! (klon)
     121    ! bulk salinity of the surface layer of the ocean, in ppt
    106122 
    107123
     
    116132    REAL, DIMENSION(klon) :: u1_lay, v1_lay
    117133    LOGICAL               :: check=.FALSE.
    118     REAL, DIMENSION(klon) :: sens_prec_liq, sens_prec_sol   
     134    REAL sens_prec_sol(knon) 
    119135    REAL, DIMENSION(klon) :: lat_prec_liq, lat_prec_sol   
    120136
     
    128144!
    129145!****************************************************************************************
    130     CALL cpl_receive_ocean_fields(knon, knindex, tsurf_cpl, u0_cpl, v0_cpl)
     146    CALL cpl_receive_ocean_fields(knon, knindex, tsurf_cpl, u0_cpl, v0_cpl, &
     147         sss)
    131148
    132149!****************************************************************************************
     
    138155    dif_grnd = 0.
    139156    agesno(:) = 0.
    140     sens_prec_liq = 0.; sens_prec_sol = 0.; lat_prec_liq = 0.; lat_prec_sol = 0.
     157    lat_prec_liq = 0.; lat_prec_sol = 0.
    141158   
    142159
     
    147164
    148165    CALL calcul_fluxs(knon, is_oce, dtime, &
    149          tsurf_cpl, p1lay, cal, beta, cdragh, cdragq, ps, &
     166         merge(tsurf_in, tsurf_cpl, activate_ocean_skin == 2), p1lay, cal, &
     167         beta, cdragh, cdragq, ps, &
    150168         precip_rain, precip_snow, snow, qsurf,  &
    151169         radsol, dif_grnd, temp_air, spechum, u1_lay, v1_lay, gustiness, &
    152170         f_qsat_oce,AcoefH, AcoefQ, BcoefH, BcoefQ, &
    153171         tsurf_new, evap, fluxlat, fluxsens, dflux_s, dflux_l, &
    154          sens_prec_liq, sens_prec_sol, lat_prec_liq, lat_prec_sol)
     172         sens_prec_liq, sens_prec_sol, lat_prec_liq, lat_prec_sol, rhoa)
     173
     174    if (activate_ocean_skin == 2) then
     175       ! tsurf_new was set to tsurf_in in calcul_flux, correct it to
     176       ! the new bulk SST tsurf_cpl:
     177       tsurf_new = tsurf_cpl
     178    end if
     179
     180    ! assertion: tsurf_new == tsurf_cpl
     181   
    155182    do j = 1, knon
    156183      i = knindex(j)
     
    189216!****************************************************************************************
    190217
    191     CALL cpl_send_ocean_fields(itime, knon, knindex, &
    192          swnet, lwnet, fluxlat, fluxsens, &
    193          precip_rain, precip_snow, evap, tsurf_new, fder_new, alb1, flux_u1, flux_v1, windsp,&
    194          sens_prec_liq, sens_prec_sol, lat_prec_liq, lat_prec_sol)
    195    
     218    CALL cpl_send_ocean_fields(itime, knon, knindex, swnet, lwnet, fluxlat, &
     219         fluxsens, precip_rain, precip_snow, evap, tsurf_new, fder_new, alb1, &
     220         flux_u1, flux_v1, windsp, sens_prec_liq, sens_prec_sol, lat_prec_liq, &
     221         lat_prec_sol, delta_sst, delta_sal)
    196222
    197223  END SUBROUTINE ocean_cpl_noice
     
    210236       radsol, snow, qsurf, &
    211237       alb1_new, alb2_new, evap, fluxsens, fluxlat, flux_u1, flux_v1, &
    212        tsurf_new, dflux_s, dflux_l)
     238       tsurf_new, dflux_s, dflux_l, rhoa)
    213239!
    214240! This subroutine treats the ocean where there is ice. The subroutine first receives
     
    245271    REAL, DIMENSION(klon), INTENT(IN)        :: u1, v1, gustiness
    246272    REAL, DIMENSION(klon,nbsrf), INTENT(IN)  :: pctsrf
     273    real, intent(in):: rhoa(:) ! (knon) density of moist air  (kg / m3)
    247274
    248275! In/output arguments
     
    272299    REAL, DIMENSION(klon)   :: u0, v0
    273300    REAL, DIMENSION(klon)   :: u1_lay, v1_lay
    274     REAL, DIMENSION(klon) :: sens_prec_liq, sens_prec_sol    
     301    REAL sens_prec_liq(knon), sens_prec_sol(knon)   
    275302    REAL, DIMENSION(klon) :: lat_prec_liq, lat_prec_sol   
    276303
     
    280307    IF (check) WRITE(*,*)'Entering surface_seaice, knon=',knon
    281308
    282     sens_prec_liq = 0.; sens_prec_sol = 0.; lat_prec_liq = 0.; lat_prec_sol = 0.
     309    lat_prec_liq = 0.; lat_prec_sol = 0.
    283310
    284311!****************************************************************************************
     
    313340         f_qsat_oce,AcoefH, AcoefQ, BcoefH, BcoefQ, &
    314341         tsurf_new, evap, fluxlat, fluxsens, dflux_s, dflux_l, &
    315          sens_prec_liq, sens_prec_sol, lat_prec_liq, lat_prec_sol)
     342         sens_prec_liq, sens_prec_sol, lat_prec_liq, lat_prec_sol, rhoa)
    316343    do j = 1, knon
    317344      i = knindex(j)
  • LMDZ6/trunk/libf/phylmd/ocean_forced_mod.F90

    r3784 r3815  
    1919       AcoefH, AcoefQ, BcoefH, BcoefQ, &
    2020       AcoefU, AcoefV, BcoefU, BcoefV, &
    21        ps, u1, v1, gustiness, &
     21       ps, u1, v1, gustiness, tsurf_in, &
    2222       radsol, snow, agesno, &
    2323       qsurf, evap, fluxsens, fluxlat, flux_u1, flux_v1, &
    24        tsurf_new, dflux_s, dflux_l)
     24       tsurf_new, dflux_s, dflux_l, sens_prec_liq, rhoa)
    2525!
    2626! This subroutine treats the "open ocean", all grid points that are not entierly covered
     
    3535    USE indice_sol_mod
    3636    USE phys_output_var_mod, ONLY : sens_prec_liq_o, sens_prec_sol_o, lat_prec_liq_o, lat_prec_sol_o
     37    use config_ocean_skin_m, only: activate_ocean_skin
    3738
    3839    INCLUDE "YOMCST.h"
     
    5354    REAL, DIMENSION(klon), INTENT(IN)        :: ps
    5455    REAL, DIMENSION(klon), INTENT(IN)        :: u1, v1, gustiness
     56    REAL, DIMENSION(klon), INTENT(IN)        :: tsurf_in
     57    real, intent(in):: rhoa(:) ! (knon) density of moist air  (kg / m3)
    5558
    5659! In/Output arguments
     
    6770    REAL, DIMENSION(klon), INTENT(OUT)       :: tsurf_new
    6871    REAL, DIMENSION(klon), INTENT(OUT)       :: dflux_s, dflux_l
     72    REAL, intent(out):: sens_prec_liq(:) ! (knon)
    6973
    7074! Local variables
     
    7680    REAL, DIMENSION(klon)       :: u1_lay, v1_lay
    7781    LOGICAL                     :: check=.FALSE.
    78     REAL, DIMENSION(klon) :: sens_prec_liq, sens_prec_sol   
     82    REAL sens_prec_sol(knon)
    7983    REAL, DIMENSION(klon) :: lat_prec_liq, lat_prec_sol   
    8084
     
    122126    alb_neig(:) = 0.
    123127    agesno(:) = 0.
    124     sens_prec_liq = 0.; sens_prec_sol = 0.; lat_prec_liq = 0.; lat_prec_sol = 0.
     128    lat_prec_liq = 0.; lat_prec_sol = 0.
    125129
    126130! Suppose zero surface speed
     
    132136! Calcul de tsurf_new, evap, fluxlat, fluxsens, dflux_s, dflux_l and qsurf
    133137    CALL calcul_fluxs(knon, is_oce, dtime, &
    134          tsurf_lim, p1lay, cal, beta, cdragh, cdragq, ps, &
     138         merge(tsurf_in, tsurf_lim, activate_ocean_skin == 2), p1lay, cal, &
     139         beta, cdragh, cdragq, ps, &
    135140         precip_rain, precip_snow, snow, qsurf,  &
    136141         radsol, dif_grnd, temp_air, spechum, u1_lay, v1_lay, gustiness, &
    137142         f_qsat_oce,AcoefH, AcoefQ, BcoefH, BcoefQ, &
    138143         tsurf_new, evap, fluxlat, fluxsens, dflux_s, dflux_l, &
    139          sens_prec_liq, sens_prec_sol, lat_prec_liq, lat_prec_sol)
     144         sens_prec_liq, sens_prec_sol, lat_prec_liq, lat_prec_sol, rhoa)
     145    if (activate_ocean_skin == 2) tsurf_new = tsurf_lim
    140146
    141147    do j = 1, knon
     
    167173       radsol, snow, qsol, agesno, tsoil, &
    168174       qsurf, alb1_new, alb2_new, evap, fluxsens, fluxlat, flux_u1, flux_v1, &
    169        tsurf_new, dflux_s, dflux_l)
     175       tsurf_new, dflux_s, dflux_l, rhoa)
    170176!
    171177! This subroutine treats the ocean where there is ice.
     
    201207    REAL, DIMENSION(klon), INTENT(IN)    :: ps
    202208    REAL, DIMENSION(klon), INTENT(IN)    :: u1, v1, gustiness
     209    real, intent(in):: rhoa(:) ! (knon) density of moist air  (kg / m3)
    203210
    204211! In/Output arguments
     
    230237    REAL, DIMENSION(klon)       :: u0, v0
    231238    REAL, DIMENSION(klon)       :: u1_lay, v1_lay
    232     REAL, DIMENSION(klon)       :: sens_prec_liq, sens_prec_sol    
     239    REAL sens_prec_liq(knon), sens_prec_sol (knon)   
    233240    REAL, DIMENSION(klon)       :: lat_prec_liq, lat_prec_sol   
    234241
     
    264271
    265272!    beta = 1.0
    266     sens_prec_liq = 0.; sens_prec_sol = 0.; lat_prec_liq = 0.; lat_prec_sol = 0.
     273    lat_prec_liq = 0.; lat_prec_sol = 0.
    267274
    268275! Suppose zero surface speed
     
    277284         f_qsat_oce,AcoefH, AcoefQ, BcoefH, BcoefQ, &
    278285         tsurf_new, evap, fluxlat, fluxsens, dflux_s, dflux_l, &
    279          sens_prec_liq, sens_prec_sol, lat_prec_liq, lat_prec_sol)
     286         sens_prec_liq, sens_prec_sol, lat_prec_liq, lat_prec_sol, rhoa)
    280287    do j = 1, knon
    281288      i = knindex(j)
  • LMDZ6/trunk/libf/phylmd/pbl_surface_mod.F90

    r3784 r3815  
    2727!!                                  wx_pbl_fuse, wx_pbl_split
    2828                                  wx_pbl0_fuse, wx_pbl0_split
     29  use config_ocean_skin_m, only: activate_ocean_skin
    2930
    3031  IMPLICIT NONE
     
    292293    USE print_control_mod,  ONLY : prt_level,lunout
    293294    USE ioipsl_getin_p_mod, ONLY : getin_p
     295    use phys_state_var_mod, only: ds_ns, dt_ns, delta_sst, delta_sal
     296    use phys_output_var_mod, only: dter, dser, tkt, tks, taur, sss
     297#ifdef CPP_XIOS
     298    USE wxios, ONLY: missing_val
     299#else
     300    use netcdf, only: missing_val => nf90_fill_real
     301#endif
    294302
    295303    IMPLICIT NONE
     
    824832    ! Martin
    825833
     834    real, DIMENSION(klon):: ydelta_sst, ydelta_sal, yds_ns, ydt_ns, ydter, ydser, &
     835         ytkt, ytks, ytaur, ysss
     836    ! compression of delta_sst, delta_sal, ds_ns, dt_ns, dter, dser, tkt, tks,
     837    ! taur, sss on ocean points
     838
    826839!****************************************************************************************
    827840! End of declarations
     
    959972!!! jyg le 10/02/2012
    960973    rh2m_x(:) = 0. ; qsat2m_x(:) = 0. ; rh2m_w(:) = 0. ; qsat2m_w(:) = 0.
    961 !!!
    962974
    963975! 2b) Initialization of all local variables that will be compressed later
     
    14261438          ENDDO
    14271439       ENDIF
     1440
     1441       if (nsrf == is_oce .and. activate_ocean_skin >= 1) then
     1442          if (activate_ocean_skin == 2 .and. type_ocean == "couple") then
     1443             ydelta_sal(:knon) = delta_sal(ni(:knon))
     1444             ydelta_sst(:knon) = delta_sst(ni(:knon))
     1445          end if
     1446         
     1447          yds_ns(:knon) = ds_ns(ni(:knon))
     1448          ydt_ns(:knon) = dt_ns(ni(:knon))
     1449       end if
    14281450       
    14291451!****************************************************************************************
     
    19491971               yz0m, yz0h, SFRWL,yalb_dir_new, yalb_dif_new, yevap, yfluxsens,yfluxlat,&
    19501972               ytsurf_new, y_dflux_t, y_dflux_q, slab_wfbils, &
    1951                y_flux_u1, y_flux_v1)
     1973               y_flux_u1, y_flux_v1, ydelta_sst(:knon), ydelta_sal(:knon), &
     1974               yds_ns(:knon), ydt_ns(:knon), ydter(:knon), ydser(:knon), &
     1975               ytkt(:knon), ytks(:knon), ytaur(:knon), ysss)
    19521976      IF (prt_level >=10) THEN
    19531977          print *,'arg de surf_ocean: ycdragh ',ycdragh
     
    25632587       ENDIF
    25642588
     2589       if (nsrf == is_oce .and. activate_ocean_skin >= 1) then
     2590          delta_sal = missing_val
     2591          ds_ns = missing_val
     2592          dt_ns = missing_val
     2593          delta_sst = missing_val
     2594          dter = missing_val
     2595          dser = missing_val
     2596          tkt = missing_val
     2597          tks = missing_val
     2598          taur = missing_val
     2599          sss = missing_val
     2600         
     2601          delta_sal(ni(:knon)) = ydelta_sal(:knon)
     2602          ds_ns(ni(:knon)) = yds_ns(:knon)
     2603          dt_ns(ni(:knon)) = ydt_ns(:knon)
     2604          delta_sst(ni(:knon)) = ydelta_sst(:knon)
     2605          dter(ni(:knon)) = ydter(:knon)
     2606          dser(ni(:knon)) = ydser(:knon)
     2607          tkt(ni(:knon)) = ytkt(:knon)
     2608          tks(ni(:knon)) = ytks(:knon)
     2609          taur(ni(:knon)) = ytaur(:knon)
     2610          sss(ni(:knon)) = ysss(:knon)
     2611       end if
     2612
    25652613!****************************************************************************************
    25662614! 14) Calculate the temperature and relative humidity at 2m and the wind at 10m
     
    31663214
    31673215!albedo SB >>>
    3168 SUBROUTINE pbl_surface_newfrac(itime, pctsrf_new, pctsrf_old, &
    3169      evap, z0m, z0h, agesno,                                  &
    3170      tsurf,alb_dir,alb_dif, ustar, u10m, v10m, tke) 
    3171 !albedo SB <<<
     3216  SUBROUTINE pbl_surface_newfrac(itime, pctsrf_new, pctsrf_old, &
     3217       evap, z0m, z0h, agesno,                                  &
     3218       tsurf,alb_dir,alb_dif, ustar, u10m, v10m, tke) 
     3219    !albedo SB <<<
    31723220    ! Give default values where new fraction has appread
    31733221
    31743222    USE indice_sol_mod
     3223    use phys_state_var_mod, only: delta_sal, ds_ns, dt_ns, delta_sst
     3224    use config_ocean_skin_m, only: activate_ocean_skin
    31753225
    31763226    INCLUDE "dimsoil.h"
     
    32593309                      alb_dif(i,k,nsrf) = 0.06
    32603310                   ENDDO
     3311                   if (activate_ocean_skin >= 1) then
     3312                      if (activate_ocean_skin == 2 &
     3313                           .and. type_ocean == "couple") then
     3314                         delta_sal(i) = 0.
     3315                         delta_sst(i) = 0.
     3316                      end if
     3317                     
     3318                      ds_ns(i) = 0.
     3319                      dt_ns(i) = 0.
     3320                   end if
    32613321                ELSE IF (nsrf.EQ.is_sic) THEN
    32623322                   tsurf(i,nsrf) = 271.35
  • LMDZ6/trunk/libf/phylmd/phyetat0.F90

    r3756 r3815  
    1919       wake_s, wake_dens, zgam, zmax0, zmea, zpic, zsig, &
    2020       zstd, zthe, zval, ale_bl, ale_bl_trig, alp_bl, u10m, v10m, treedrg, &
    21        ale_wake, ale_bl_stat
     21       ale_wake, ale_bl_stat, ds_ns, dt_ns, delta_sst, delta_sal
    2222!FC
    2323  USE geometry_mod, ONLY : longitude_deg, latitude_deg
     
    2929  USE ocean_slab_mod, ONLY: nslay, tslab, seaice, tice, ocean_slab_init
    3030  USE time_phylmdz_mod, ONLY: init_iteration, pdtphys, itau_phy
     31#ifdef CPP_XIOS
     32  USE wxios, ONLY: missing_val
     33#else
     34  use netcdf, only: missing_val => nf90_fill_real
     35#endif
     36  use config_ocean_skin_m, only: activate_ocean_skin
    3137
    3238  IMPLICIT none
     
    3541  ! Objet: Lecture de l'etat initial pour la physique
    3642  !======================================================================
    37   include "netcdf.inc"
    3843  include "dimsoil.h"
    3944  include "clesphys.h"
     
    519524  ENDIF ! Slab       
    520525
     526  if (activate_ocean_skin >= 1) then
     527     if (activate_ocean_skin == 2 .and. type_ocean == 'couple') then
     528        found = phyetat0_get(1, delta_sal, "delta_sal", &
     529             "ocean-air interface salinity minus bulk salinity", 0.)
     530        found = phyetat0_get(1, delta_sst, "delta_SST", &
     531             "ocean-air interface temperature minus bulk SST", 0.)
     532     end if
     533     
     534     found = phyetat0_get(1, ds_ns, "dS_ns", "delta salinity near surface", 0.)
     535     found = phyetat0_get(1, dt_ns, "dT_ns", "delta temperature near surface", &
     536          0.)
     537
     538     where (pctsrf(:, is_oce) == 0.)
     539        ds_ns = missing_val
     540        dt_ns = missing_val
     541        delta_sst = missing_val
     542        delta_sal = missing_val
     543     end where
     544  end if
     545
    521546  ! on ferme le fichier
    522547  CALL close_startphy
  • LMDZ6/trunk/libf/phylmd/phyredem.F90

    r3756 r3815  
    2626                                detr_therm, ale_bl, ale_bl_trig, alp_bl,     &
    2727                                ale_wake, ale_bl_stat,                       &
    28                                 du_gwd_rando, du_gwd_front, u10m, v10m,      &
    29                                 treedrg, solswfdiff
     28                                du_gwd_rando, du_gwd_front, u10m, v10m, &
     29                                treedrg, solswfdiff, delta_sal, ds_ns, dt_ns, &
     30                                delta_sst
     31
    3032  USE geometry_mod, ONLY : longitude_deg, latitude_deg
    3133  USE iostart, ONLY: open_restartphy, close_restartphy, enddef_restartphy, put_field, put_var
     
    3739  USE ocean_slab_mod, ONLY : nslay, tslab, seaice, tice, fsic
    3840  USE time_phylmdz_mod, ONLY: annee_ref, day_end, itau_phy, pdtphys
     41  use config_ocean_skin_m, only: activate_ocean_skin 
    3942
    4043  IMPLICIT none
     
    342345         "tendency on zonal wind due to acama gravity waves", du_gwd_front)
    343346
     347    if (activate_ocean_skin >= 1) then
     348       if (activate_ocean_skin == 2 .and. type_ocean == 'couple') then
     349          CALL put_field(pass, "delta_sal", &
     350               "ocean-air interface salinity minus bulk salinity", delta_sal)
     351          CALL put_field(pass, "delta_SST", &
     352               "ocean-air interface temperature minus bulk SST", delta_sst)
     353       end if
     354       
     355       CALL put_field(pass, "dS_ns", "delta salinity near surface", ds_ns)
     356       CALL put_field(pass, "dT_ns", "delta temperature near surface", dT_ns)
     357    end if
     358   
    344359    IF (pass==1) CALL enddef_restartphy
    345360    IF (pass==2) CALL close_restartphy
    346   ENDDO
     361 ENDDO
    347362 
    348363  !$OMP BARRIER
  • LMDZ6/trunk/libf/phylmd/phys_output_ctrlout_mod.F90

    r3780 r3815  
    19541954#endif
    19551955
     1956   type(ctrl_out), save:: o_delta_sst &
     1957        = ctrl_out([1, 10, 10, 1, 10, 10, 11, 11, 11, 11], 'delta_SST', &
     1958        "ocean-air interface temperature minus bulk SST", "K", '')
     1959
     1960   type(ctrl_out), save:: o_delta_sal &
     1961        = ctrl_out([1, 10, 10, 1, 10, 10, 11, 11, 11, 11], 'delta_sal', &
     1962        "ocean-air interface salinity minus bulk salinity", "ppt", '')
     1963
     1964   type(ctrl_out), save:: o_ds_ns &
     1965        = ctrl_out([1, 10, 10, 1, 10, 10, 11, 11, 11, 11], 'dS_ns', &
     1966        "subskin salinity minus foundation salinity", "ppt", '')
     1967
     1968   type(ctrl_out), save:: o_dt_ns &
     1969        = ctrl_out([1, 10, 10, 1, 10, 10, 11, 11, 11, 11], 'dT_ns', &
     1970        "subskin temperature minus foundation temperature", "K", '')
     1971
     1972   type(ctrl_out), save:: o_dter &
     1973        = ctrl_out([1, 10, 10, 1, 10, 10, 11, 11, 11, 11], 'dTer', &
     1974        "ocean-air interface temperature minus sub-skin temperature", "K", '')
     1975
     1976   type(ctrl_out), save:: o_dser &
     1977        = ctrl_out([1, 10, 10, 1, 10, 10, 11, 11, 11, 11], 'dSer', &
     1978        "ocean-air interface salinity minus sub-skin salinity", "ppt", '')
     1979
     1980   type(ctrl_out), save:: o_tkt &
     1981        = ctrl_out([1, 10, 10, 1, 10, 10, 11, 11, 11, 11], 'tkt', &
     1982        "thickness of thermal microlayer", "m", '')
     1983
     1984   type(ctrl_out), save:: o_tks &
     1985        = ctrl_out([1, 10, 10, 1, 10, 10, 11, 11, 11, 11], 'tks', &
     1986        "thickness of salinity microlayer", "m", '')
     1987
     1988   type(ctrl_out), save:: o_taur &
     1989        = ctrl_out([1, 10, 10, 1, 10, 10, 11, 11, 11, 11], 'taur', &
     1990        "momentum flux due to rain", "Pa", '')
     1991
     1992   type(ctrl_out), save:: o_sss &
     1993        = ctrl_out([1, 10, 10, 1, 10, 10, 11, 11, 11, 11], 'SSS', &
     1994        "bulk sea-surface salinity", "ppt", '')
     1995
    19561996END MODULE phys_output_ctrlout_mod
  • LMDZ6/trunk/libf/phylmd/phys_output_var_mod.F90

    r3149 r3815  
    133133 !$OMP THREADPRIVATE(sens_prec_liq_o, sens_prec_sol_o,lat_prec_liq_o,lat_prec_sol_o)
    134134
     135  ! Ocean-atmosphere interface, subskin ocean and near-surface ocean:
     136 
     137  REAL, ALLOCATABLE, SAVE:: dter(:)
     138  ! Temperature variation in the diffusive microlayer, that is
     139  ! ocean-air interface temperature minus subskin temperature. In K.
     140     
     141  REAL, SAVE, ALLOCATABLE:: dser(:)
     142  ! Temperature variation in the diffusive microlayer, that is
     143  ! subskin temperature minus ocean-air interface temperature. In K.
     144
     145  REAL, SAVE, ALLOCATABLE:: tkt(:)
     146  ! épaisseur (m) de la couche de diffusion thermique (microlayer)
     147  ! cool skin thickness
     148
     149  REAL, SAVE, ALLOCATABLE:: tks(:)
     150  ! épaisseur (m) de la couche de diffusion de masse (microlayer)
     151 
     152  REAL, SAVE, ALLOCATABLE:: taur(:) ! momentum flux due to rain, in Pa
     153
     154  REAL, SAVE, ALLOCATABLE:: sss(:)
     155  ! bulk salinity of the surface layer of the ocean, in ppt
     156 
     157  !$OMP THREADPRIVATE(dter, dser, tkt, tks, taur, sss)
     158
    135159CONTAINS
    136160
     
    138162  SUBROUTINE phys_output_var_init
    139163    use dimphy
     164    use config_ocean_skin_m, only: activate_ocean_skin
    140165
    141166    IMPLICIT NONE
     
    191216    IF (ok_gwd_rando) allocate(zustr_gwd_rando(klon), zvstr_gwd_rando(klon))
    192217
     218    if (activate_ocean_skin >= 1) allocate(dter(klon), dser(klon), tkt(klon), &
     219         tks(klon), taur(klon), sss(klon))
     220
    193221  END SUBROUTINE phys_output_var_init
    194222
  • LMDZ6/trunk/libf/phylmd/phys_output_write_mod.F90

    r3799 r3815  
    199199         o_col_O3_strato, o_col_O3_tropo,                 &
    200200!--interactive CO2
    201          o_flx_co2_ocean, o_flx_co2_land, o_flx_co2_ff, o_flx_co2_bb
    202 
     201         o_flx_co2_ocean, o_flx_co2_land, o_flx_co2_ff, o_flx_co2_bb, &
     202         o_delta_sst, o_delta_sal, o_ds_ns, o_dt_ns, o_dter, o_dser, o_tkt, &
     203         o_tks, o_taur, o_sss
    203204
    204205#ifdef CPP_StratAer
     
    245246         T2sumSTD, nlevSTD, du_gwd_rando, du_gwd_front, &
    246247         ulevSTD, vlevSTD, wlevSTD, philevSTD, qlevSTD, tlevSTD, &
    247          rhlevSTD, O3STD, O3daySTD, uvSTD, vqSTD, vTSTD, wqSTD, &
    248          vphiSTD, wTSTD, u2STD, v2STD, T2STD, missing_val_nf90
     248         rhlevSTD, O3STD, O3daySTD, uvSTD, vqSTD, vTSTD, wqSTD, vphiSTD, &
     249         wTSTD, u2STD, v2STD, T2STD, missing_val_nf90, delta_sal, ds_ns, &
     250         dt_ns, delta_sst
    249251
    250252    USE phys_local_var_mod, ONLY: zxfluxlat, slp, ptstar, pt0, zxtsol, zt2m, &
     
    353355         alt_tropo, &
    354356!Ionela
    355          ok_4xCO2atm
     357         ok_4xCO2atm, dter, dser, tkt, tks, taur, sss
    356358
    357359    USE ocean_slab_mod, ONLY: nslay, tslab, slab_bilg, tice, seaice, &
     
    380382#endif
    381383    USE tracinca_mod, ONLY: config_inca
     384    use config_ocean_skin_m, only: activate_ocean_skin
    382385
    383386    USE vertical_layers_mod, ONLY: presnivs
     
    23852388       ENDIF   !(iflag_phytrac==1)
    23862389
     2390       if (activate_ocean_skin >= 1) then
     2391          CALL histwrite_phy(o_delta_sst, delta_sst)
     2392          CALL histwrite_phy(o_delta_sal, delta_sal)
     2393          CALL histwrite_phy(o_ds_ns, ds_ns)
     2394          CALL histwrite_phy(o_dt_ns, dt_ns)
     2395          CALL histwrite_phy(o_dter, dter)
     2396          CALL histwrite_phy(o_dser, dser)
     2397          CALL histwrite_phy(o_tkt, tkt)
     2398          CALL histwrite_phy(o_tks, tks)
     2399          CALL histwrite_phy(o_taur, taur)
     2400          CALL histwrite_phy(o_sss, sss)
     2401       end if
     2402
    23872403       IF (.NOT.vars_defined) THEN
    23882404          !$OMP MASTER
  • LMDZ6/trunk/libf/phylmd/phys_state_var_mod.F90

    r3781 r3815  
    430430!$OMP THREADPRIVATE(is_initialized)   
    431431
    432 CONTAINS
     432      ! Ocean-atmosphere interface:
     433
     434      REAL, ALLOCATABLE, SAVE:: ds_ns(:) ! (klon)
     435      ! "delta salinity near surface". Salinity variation in the
     436      ! near-surface turbulent layer. That is subskin salinity minus
     437      ! foundation salinity. In ppt.
     438
     439      REAL, ALLOCATABLE, SAVE:: dt_ns(:) ! (klon)
     440      ! "delta temperature near surface". Temperature variation in the
     441      ! near-surface turbulent layer. That is subskin temperature
     442      ! minus foundation temperature. (Can be negative.) In K.
     443     
     444      REAL, ALLOCATABLE, SAVE:: delta_sst(:) ! (klon)
     445      ! Ocean-air interface temperature minus bulk SST, in
     446      ! K. Allocated and defined only if activate_ocean_skin >= 1.
     447
     448      REAL, ALLOCATABLE, SAVE:: delta_sal(:) ! (klon)
     449      ! Ocean-air interface salinity minus bulk salinity, in ppt
     450     
     451      !$OMP THREADPRIVATE(delta_sal, ds_ns, dt_ns, delta_sst)
     452
     453    CONTAINS
    433454
    434455!======================================================================
     
    438459USE infotrac_phy, ONLY : nbtr
    439460USE indice_sol_mod
     461use config_ocean_skin_m, only: activate_ocean_skin
    440462IMPLICIT NONE
    441463
     
    638660        du_gwd_front(:,:) = 0 !ym missing init   
    639661      ENDIF
    640 END SUBROUTINE phys_state_var_init
     662      if (activate_ocean_skin >= 1) ALLOCATE(delta_sal(klon), ds_ns(klon), &
     663           dt_ns(klon), delta_sst(klon))
     664
     665    END SUBROUTINE phys_state_var_init
    641666
    642667!======================================================================
    643 SUBROUTINE phys_state_var_end
     668    SUBROUTINE phys_state_var_end
     669      ! Useful only for lmdz1d.
    644670!USE dimphy
    645671USE indice_sol_mod
     672use config_ocean_skin_m, only: activate_ocean_skin
    646673IMPLICIT NONE
    647674include "clesphys.h"
     
    771798      DEALLOCATE(ale_bl_trig)
    772799!!! fin nrlmd le 10/04/2012
     800
     801      if (activate_ocean_skin >= 1) deALLOCATE(delta_sal, ds_ns, dt_ns, &
     802           delta_sst)
     803
    773804      is_initialized=.FALSE.
     805     
    774806END SUBROUTINE phys_state_var_end
    775807
  • LMDZ6/trunk/libf/phylmd/suphel.F90

    r3447 r3815  
    131131  rcvv = rcpv - rv
    132132  rkappa = rd/rcpd
     133  eps_w = rmv / rmd
    133134  retv = rv/rd - 1.
    134135  WRITE (UNIT=6, FMT='('' *** Thermodynamic, gas     ***'')')
  • LMDZ6/trunk/libf/phylmd/surf_ocean_mod.F90

    r3395 r3815  
    2020       z0m, z0h, SFRWL, alb_dir_new, alb_dif_new, evap, fluxsens, fluxlat, &
    2121       tsurf_new, dflux_s, dflux_l, lmt_bils, &
    22        flux_u1, flux_v1)
     22       flux_u1, flux_v1, delta_sst, delta_sal, ds_ns, dt_ns, dter, dser, tkt, tks, &
     23       taur, sss)
    2324
    2425    use albedo, only: alboc, alboc_cd
     26    use bulk_flux_m, only: bulk_flux
    2527    USE dimphy, ONLY: klon, zmasq
    2628    USE surface_data, ONLY     : type_ocean
     
    3032    USE indice_sol_mod, ONLY : nbsrf, is_oce
    3133    USE limit_read_mod
     34    use config_ocean_skin_m, only: activate_ocean_skin
    3235    !
    3336    ! This subroutine will make a call to ocean_XXX_noice according to the ocean mode (force,
     
    5053    REAL, DIMENSION(klon), INTENT(IN)        :: lwnet  ! net longwave radiation at surface 
    5154    REAL, DIMENSION(klon), INTENT(IN)        :: alb1   ! albedo in visible SW interval
    52     REAL, DIMENSION(klon), INTENT(IN)        :: windsp
     55    REAL, DIMENSION(klon), INTENT(IN)        :: windsp ! wind at 10 m, in m s-1
    5356    REAL, DIMENSION(klon), INTENT(IN)        :: rmu0 
    5457    REAL, DIMENSION(klon), INTENT(IN)        :: fder
    55     REAL, DIMENSION(klon), INTENT(IN)        :: tsurf_in
     58    REAL, INTENT(IN):: tsurf_in(klon) ! defined only for subscripts 1:knon
    5659    REAL, DIMENSION(klon), INTENT(IN)        :: p1lay,z1lay ! pression (Pa) et altitude (m) du premier niveau
    5760    REAL, DIMENSION(klon), INTENT(IN)        :: cdragh
     
    7376    REAL, DIMENSION(klon), INTENT(inOUT):: z0h
    7477
     78    REAL, intent(inout):: delta_sst(:) ! (knon)
     79    ! Ocean-air interface temperature minus bulk SST, in K. Defined
     80    ! only if activate_ocean_skin >= 1.
     81
     82    real, intent(inout):: delta_sal(:) ! (knon)
     83    ! Ocean-air interface salinity minus bulk salinity, in ppt. Defined
     84    ! only if activate_ocean_skin >= 1.
     85
     86    REAL, intent(inout):: ds_ns(:) ! (knon)
     87    ! "delta salinity near surface". Salinity variation in the
     88    ! near-surface turbulent layer. That is subskin salinity minus
     89    ! foundation salinity. In ppt.
     90
     91    REAL, intent(inout):: dt_ns(:) ! (knon)
     92    ! "delta temperature near surface". Temperature variation in the
     93    ! near-surface turbulent layer. That is subskin temperature
     94    ! minus foundation temperature. (Can be negative.) In K.
     95
    7596    ! Output variables
    76     !******************************************************************************
     97    !**************************************************************************
    7798    REAL, DIMENSION(klon), INTENT(OUT)       :: z0m
    7899    !albedo SB >>>
     
    83104    !albedo SB <<<     
    84105    REAL, DIMENSION(klon), INTENT(OUT)       :: evap, fluxsens, fluxlat
    85     REAL, DIMENSION(klon), INTENT(OUT)       :: tsurf_new
     106    REAL, INTENT(OUT):: tsurf_new(klon) ! sea surface temperature, in K
    86107    REAL, DIMENSION(klon), INTENT(OUT)       :: dflux_s, dflux_l     
    87108    REAL, DIMENSION(klon), INTENT(OUT)       :: lmt_bils
    88109    REAL, DIMENSION(klon), INTENT(OUT)       :: flux_u1, flux_v1
    89110
     111    REAL, intent(out):: dter(:) ! (knon)
     112    ! Temperature variation in the diffusive microlayer, that is
     113    ! ocean-air interface temperature minus subskin temperature. In
     114    ! K.
     115
     116    REAL, intent(out):: dser(:) ! (knon)
     117    ! Salinity variation in the diffusive microlayer, that is
     118    ! ocean-air interface salinity minus subskin salinity. In ppt.
     119
     120    REAL, intent(out):: tkt(:) ! (knon)
     121    ! épaisseur (m) de la couche de diffusion thermique (microlayer)
     122    ! cool skin thickness
     123
     124    REAL, intent(out):: tks(:) ! (knon)
     125    ! épaisseur (m) de la couche de diffusion de masse (microlayer)
     126
     127    REAL, intent(out):: taur(:) ! (knon)
     128    ! momentum flux due to rain, in Pa
     129
     130    real, intent(out):: sss(:) ! (klon)
     131    ! Bulk salinity of the surface layer of the ocean, in ppt. (Only
     132    ! defined for subscripts 1:knon, but we have to declare it with
     133    ! size klon because of the coupling machinery.)
     134
    90135    ! Local variables
    91     !******************************************************************************
     136    !*************************************************************************
    92137    INTEGER               :: i, k
    93138    REAL                  :: tmp
     
    97142    REAL, DIMENSION(klon) :: cdragq ! Cdrag pour l'evaporation
    98143    CHARACTER(len=20),PARAMETER :: modname="surf_ocean"
    99 
    100     ! End definition
    101     !******************************************************************************
     144    real rhoa(knon) ! density of moist air  (kg / m3)
     145    REAL sens_prec_liq(knon)
     146
     147    REAL t_int(knon) ! ocean-air interface temperature, in K
     148    real s_int(knon) ! ocean-air interface salinity, in ppt
     149
     150    !**************************************************************************
    102151
    103152
     
    126175    ENDIF
    127176
    128 
     177    rhoa = PS(:KNON) / (Rd * temp_air(:knon) * (1. + retv * spechum(:knon)))
    129178    !******************************************************************************
    130179    ! Switch according to type of ocean (couple, slab or forced)
     
    139188            AcoefH, AcoefQ, BcoefH, BcoefQ, &
    140189            AcoefU, AcoefV, BcoefU, BcoefV, &
    141             ps, u1, v1, gustiness, &
     190            ps, u1, v1, gustiness, tsurf_in, &
    142191            radsol, snow, agesno, &
    143192            qsurf, evap, fluxsens, fluxlat, flux_u1, flux_v1, &
    144             tsurf_new, dflux_s, dflux_l)
     193            tsurf_new, dflux_s, dflux_l, sens_prec_liq, sss, delta_sal, rhoa, &
     194            delta_sst)
    145195
    146196    CASE('slab')
     
    162212            AcoefH, AcoefQ, BcoefH, BcoefQ, &
    163213            AcoefU, AcoefV, BcoefU, BcoefV, &
    164             ps, u1, v1, gustiness, &
     214            ps, u1, v1, gustiness, tsurf_in, &
    165215            radsol, snow, agesno, &
    166216            qsurf, evap, fluxsens, fluxlat, flux_u1, flux_v1, &
    167             tsurf_new, dflux_s, dflux_l)
     217            tsurf_new, dflux_s, dflux_l, sens_prec_liq, rhoa)
    168218    END SELECT
    169219
     
    268318       CALL abort_physic(modname,'version non prevue',1)
    269319    ENDIF
    270     !
    271     !******************************************************************************
     320
     321    if (activate_ocean_skin >= 1) then
     322       if (type_ocean /= 'couple') sss(:knon) = 35.
     323       call bulk_flux(tkt, tks, taur, dter, dser, t_int, s_int, ds_ns, dt_ns, &
     324            u = windsp(:knon), t_ocean_1 = tsurf_new(:knon), s1 = sss(:knon), &
     325            rain = precip_rain(:knon) + precip_snow(:knon), &
     326            hf = - fluxsens(:knon), hlb = - fluxlat(:knon), &
     327            rnl = - lwnet(:knon), &
     328            tau = sqrt(flux_u1(:knon)**2 + flux_v1(:knon)**2), rhoa = rhoa, &
     329            xlv = [(rlvtt, i = 1, knon)], rf = - sens_prec_liq, dtime = dtime, &
     330            rns = swnet(:knon))
     331       delta_sst = t_int - tsurf_new(:knon)
     332       delta_sal = s_int - sss(:knon)
     333       if (activate_ocean_skin >= 2) tsurf_new(:knon) = t_int
     334    end if
     335   
    272336  END SUBROUTINE surf_ocean
    273   !******************************************************************************
     337  !****************************************************************************
    274338  !
    275339END MODULE surf_ocean_mod
  • LMDZ6/trunk/libf/phylmd/surf_seaice_mod.F90

    r3102 r3815  
    3737    INCLUDE "dimsoil.h"
    3838    INCLUDE "clesphys.h"
     39
     40    INCLUDE "YOMCST.h"
     41    ! for rd and retv
    3942
    4043! Input arguments
     
    8790    REAL, DIMENSION(klon) :: alb1_new,alb2_new
    8891!albedo SB <<<
    89 !
     92
     93    real rhoa(knon) ! density of moist air  (kg / m3)
     94
    9095! End definitions
    9196!****************************************************************************************
     
    98103    radsol(:) = 0.0
    99104    radsol(1:knon) = swnet(1:knon) + lwnet(1:knon)
     105
     106    rhoa = PS(:KNON) / (Rd * temp_air(:knon) * (1. + retv * spechum(:knon)))
    100107
    101108!****************************************************************************************
     
    116123            radsol, snow, qsurf, &
    117124            alb1_new, alb2_new, evap, fluxsens, fluxlat, flux_u1, flux_v1, &
    118             tsurf_new, dflux_s, dflux_l)
     125            tsurf_new, dflux_s, dflux_l, rhoa)
    119126       
    120127    ELSE IF (type_ocean == 'slab'.AND.version_ocean=='sicINT') THEN
     
    138145            radsol, snow, qsol, agesno, tsoil, &
    139146            qsurf, alb1_new, alb2_new, evap, fluxsens, fluxlat, flux_u1, flux_v1, &
    140             tsurf_new, dflux_s, dflux_l)
     147            tsurf_new, dflux_s, dflux_l, rhoa)
    141148
    142149    END IF
  • LMDZ6/trunk/makelmdz_fcm

    r3804 r3815  
    6565########################################################################
    6666
    67 CPP_KEY=""
     67CPP_KEY="IN_LMDZ"
    6868INCLUDE=""
    6969LIB=""
Note: See TracChangeset for help on using the changeset viewer.