Ignore:
Timestamp:
May 20, 2025, 4:24:41 PM (2 months ago)
Author:
Laurent Fairhead
Message:

Ajout du modèle thermodynamique de glace de mer interactive améliorant les flux échangés à la surface de la banquise (Doctorat de Nicolas Michalezyk, Contact : Nicolas Michaleyk, Guillaume Gastineau)

Location:
LMDZ6/trunk/libf/phylmdiso
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • LMDZ6/trunk/libf/phylmdiso/limit_read_mod.F90

    r5217 r5662  
    2222  REAL, ALLOCATABLE, DIMENSION(:),   SAVE, PRIVATE :: sst
    2323!$OMP THREADPRIVATE(sst)   
     24!GG
     25  REAL, ALLOCATABLE, DIMENSION(:),   SAVE, PRIVATE :: sih
     26!$OMP THREADPRIVATE(sih)
     27!GG
    2428#ifdef ISO
    2529  REAL, ALLOCATABLE, DIMENSION(:),   SAVE, PRIVATE :: tuoce
     
    254258  END SUBROUTINE limit_read_sst
    255259
     260!GG
     261  SUBROUTINE limit_read_hice(knon, knindex, hice_out)
     262!
     263! This subroutine returns the sea surface temperature already read from limit.nc.
     264!
     265    USE dimphy, ONLY : klon
     266
     267    INTEGER, INTENT(IN)                  :: knon     ! nomber of points on compressed grid
     268    INTEGER, DIMENSION(klon), INTENT(IN) :: knindex  ! grid point number for compressed grid
     269    REAL, DIMENSION(klon), INTENT(OUT)   :: hice_out
     270
     271    INTEGER :: i
     272
     273    DO i = 1, knon
     274       hice_out(i) = sih(knindex(i))
     275    END DO
     276
     277  END SUBROUTINE limit_read_hice
     278!GG
    256279!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    257280!!
     
    273296    USE mod_grid_phy_lmdz
    274297    USE mod_phys_lmdz_para
    275     USE surface_data, ONLY : type_ocean, ok_veget
     298    !GG USE surface_data, ONLY : type_ocean, ok_veget
     299    USE surface_data, ONLY : type_ocean, ok_veget, iflag_seaice, amax_n, amax_s
     300    !GG
    276301    USE netcdf
    277302    USE indice_sol_mod
     
    284309    USE phys_cal_mod, ONLY : calend, year_len
    285310    USE print_control_mod, ONLY: lunout, prt_level
    286     USE lmdz_XIOS, ONLY: xios_recv_field
     311    USE lmdz_xios, ONLY: xios_recv_field, using_xios
    287312   
    288313    IMPLICIT NONE
     
    319344    REAL, DIMENSION(klon_mpi)                 :: rug_mpi  ! rugosity at global grid
    320345    REAL, DIMENSION(klon_mpi)                 :: alb_mpi  ! albedo at global grid
     346!GG
     347    REAL, DIMENSION(klon_glo)                 :: sih_glo  ! albedo at global grid
     348    REAL, DIMENSION(klon_mpi)                 :: sih_mpi  ! albedo at global grid
     349!GG
    321350
    322351    CHARACTER(len=20)                         :: modname='limit_read_mod'     
     
    344373       END IF
    345374
     375       !GG
     376       IF (iflag_seaice==1) THEN
     377             ALLOCATE(sih(klon), stat=ierr)
     378             IF (ierr /= 0) CALL abort_physic(modname, 'PB in allocating sih',1)
     379       ENDIF
     380       !GG
     381
    346382       IF ( .NOT. ok_veget ) THEN
    347383          ALLOCATE(rugos(klon), albedo(klon), stat=ierr)
     
    422458         IF ( type_ocean /= 'couple') THEN                   
    423459             IF (is_omp_master) CALL xios_recv_field("sst_limin",sst_mpi)
     460             !GG
     461             IF (is_omp_master) CALL xios_recv_field("sih_limin",sih_mpi)
     462             !GG
    424463         ENDIF
    425464       
     
    431470       IF ( type_ocean /= 'couple') THEN
    432471          CALL Scatter_omp(sst_mpi,sst)
     472          !GG
     473          CALL Scatter_omp(sih_mpi,sih)
     474          !GG
    433475          CALL Scatter_omp(pct_mpi(:,is_oce),pctsrf(:,is_oce))
    434476          CALL Scatter_omp(pct_mpi(:,is_sic),pctsrf(:,is_sic))
     
    481523             IF (ierr /= NF90_NOERR) CALL abort_physic(modname,'Lecture echouee pour <FSIC>' ,1)
    482524
     525! GG
     526! Account for leads
     527             IF (iflag_seaice>0) THEN
     528               DO ii=1,klon_glo/2
     529                 if (pct_glo(ii,is_sic)>amax_n) THEN
     530                    pct_glo(ii,is_oce)=pct_glo(ii,is_oce)+(pct_glo(ii,is_sic)-amax_n)
     531                    pct_glo(ii,is_sic)=amax_n
     532                 end if
     533               ENDDO
     534               DO ii=klon_glo/2,klon_glo
     535               if (pct_glo(ii,is_sic)>amax_s) THEN
     536                    pct_glo(ii,is_oce)=pct_glo(ii,is_oce)+(pct_glo(ii,is_sic)-amax_s)
     537                    pct_glo(ii,is_sic)=amax_s
     538               end if
     539               ENDDO
     540             ENDIF
     541!GG
    483542
    484543! Read land and continentals fraction only if asked for
     
    513572             ierr = NF90_GET_VAR(nid,nvarid,sst_glo,start,epais)
    514573             IF (ierr /= NF90_NOERR) CALL abort_physic(modname,'Lecture echouee pour <SST>',1)
    515          
     574!GG
     575             IF (iflag_seaice == 1) THEN
     576               ierr = NF90_INQ_VARID(nid, 'HICE', nvarid)
     577               IF (ierr /= NF90_NOERR) CALL abort_physic(modname,'Le champ <HICE> est absent',1)
     578
     579               ierr = NF90_GET_VAR(nid,nvarid,sih_glo(:),start,epais)
     580               IF (ierr /= NF90_NOERR) CALL abort_physic(modname,'Lecture echouee pour <HICE>' ,1)
     581             ENDIF
     582            !GG
     583         
    516584#ifdef ISO
    517585             IF ((iso_HTO.gt.0).and.(ok_prod_nucl_tritium)) THEN
     
    572640       IF ( type_ocean /= 'couple') THEN
    573641          CALL Scatter(sst_glo,sst)
     642          !GG
     643          IF (iflag_seaice==1) THEN
     644             CALL Scatter(sih_glo,sih)
     645          END IF
     646          !GG
    574647          CALL Scatter(pct_glo(:,is_oce),pctsrf(:,is_oce))
    575648          CALL Scatter(pct_glo(:,is_sic),pctsrf(:,is_sic))
  • LMDZ6/trunk/libf/phylmdiso/phyaqua_mod.F90

    r5645 r5662  
    351351
    352352
    353     CALL pbl_surface_init(fder, snsrf, qsolsrf, tsoil)
     353!GG
     354    CALL pbl_surface_init(fder, snsrf, qsolsrf, tsoil, hice, tice, bilg_cumul)
     355!    CALL pbl_surface_init(fder, snsrf, qsolsrf, tsoil)
     356!GG
    354357#ifdef ISO
    355358  CALL pbl_surface_init_iso(xtsnsrf,Rland_ice)
  • LMDZ6/trunk/libf/phylmdiso/phyetat0_mod.F90

    r5645 r5662  
    2020#endif
    2121  USE phyetat0_get_mod, ONLY : phyetat0_get, phyetat0_srf
    22   USE surface_data,     ONLY : type_ocean, version_ocean
     22!GG  USE surface_data,     ONLY : type_ocean, version_ocean
     23  USE surface_data,     ONLY : type_ocean, version_ocean, iflag_seaice, &
     24                                   iflag_seaice_alb, iflag_leads
     25!GG
    2326  USE phys_state_var_mod, ONLY : ancien_ok, clwcon, detr_therm, phys_tstep, &
    2427       qsol, fevap, z0m, z0h, agesno, &
     
    3740       zstd, zthe, zval, ale_bl, ale_bl_trig, alp_bl, u10m, v10m, treedrg, &
    3841       ale_wake, ale_bl_stat, ds_ns, dt_ns, delta_sst, delta_sal, dter, dser, &
    39        dt_ds, ratqs_inter_
     42!GG       dt_ds, ratqs_inter_
     43       dt_ds, ratqs_inter_, &
     44       hice, tice, bilg_cumul
     45!GG
     46
    4047!FC
    4148  USE geometry_mod,     ONLY: longitude_deg, latitude_deg
     
    4653  USE carbon_cycle_mod, ONLY: carbon_cycle_init, carbon_cycle_cpl, carbon_cycle_tr, carbon_cycle_rad, co2_send, RCO2_glo
    4754  USE indice_sol_mod,   ONLY: nbsrf, is_ter, epsfra, is_lic, is_oce, is_sic
    48   USE ocean_slab_mod,   ONLY: nslay, tslab, seaice, tice, ocean_slab_init
     55  !GG USE ocean_slab_mod,   ONLY: nslay, tslab, seaice, tice, ocean_slab_init
     56  USE ocean_slab_mod,   ONLY: nslay, tslab, seaice, tice_slab, ocean_slab_init
     57  !GG
    4958  USE time_phylmdz_mod, ONLY: init_iteration, pdtphys, itau_phy
    5059  use wxios_mod, ONLY: missing_val_xios => missing_val, using_xios
     
    179188  IF (ok_orolf) tab_cntrl(11) =1.
    180189  IF (ok_limitvrai) tab_cntrl(12) =1.
     190  !GG
     191  tab_cntrl(18) =iflag_seaice
     192  tab_cntrl(19) =iflag_seaice_alb
     193  tab_cntrl(20) =iflag_leads
     194  !GG
    181195
    182196  itau_phy = tab_cntrl(15)
     
    624638      ! Sea ice variables
    625639      IF (version_ocean == 'sicINT') THEN
    626           found=phyetat0_get(tice,"slab_tice","slab_tice",0.)
     640          found=phyetat0_get(tice_slab,"slab_tice","slab_tice",0.)
     641  !GG        found=phyetat0_get(tice,"slab_tice","slab_tice",0.)
    627642          IF (.NOT. found) THEN
    628               PRINT*, "phyetat0: Le champ <tice> est absent"
     643  !GG            PRINT*, "phyetat0: Le champ <tice> est absent"
     644              PRINT*, "phyetat0: Le champ <tice_slab> est absent"
    629645              PRINT*, "Initialisation a tsol_sic"
    630                   tice(:)=ftsol(:,is_sic)
     646  !GG                tice(:)=ftsol(:,is_sic)
     647                  tice_slab(:)=ftsol(:,is_sic)
    631648          ENDIF
    632649          found=phyetat0_get(seaice,"seaice","seaice",0.)
     
    675692  end if
    676693
     694  !GG
     695  ! Sea ice
     696  !IF (iflag_seaice == 2) THEN
     697
     698  found=phyetat0_get(hice,"hice","Ice thickness",0.)
     699  IF (.NOT. found) THEN
     700       PRINT*, "phyetat0: Le champ <hice> est absent"
     701       PRINT*, "Initialisation a hice=1m "
     702       hice(:)=1.0
     703  END IF
     704  found=phyetat0_get(tice,"tice","Sea Ice temperature",0.)
     705  IF (.NOT. found) THEN
     706       PRINT*, "phyetat0: Le champ <tice> est absent"
     707       PRINT*, "Initialisation a tsol_sic"
     708       tice(:)=ftsol(:,is_sic)
     709  END IF
     710  found=phyetat0_get(bilg_cumul,"bilg_cumul","Flux conductivite + transmit sea-ice",0.)
     711  IF (.NOT. found) THEN
     712       PRINT*, "phyetat0: Le champ <bilg_cumul> est absent"
     713       PRINT*, "Initialisation a zero"
     714       bilg_cumul(:)=0.0
     715  END IF
     716
     717  !END IF
     718  !GG
    677719  ! on ferme le fichier
    678720  CALL close_startphy
     
    686728!#endif
    687729  if ( iflag_physiq <= 1 ) then
    688   CALL pbl_surface_init(fder, snow, qsurf, tsoil)
     730  !GG CALL pbl_surface_init(fder, snow, qsurf, tsoil)
     731  CALL pbl_surface_init(fder, snow, qsurf, tsoil, hice, tice, bilg_cumul)
     732  !GG
    689733#ifdef ISO
    690734  CALL pbl_surface_init_iso(xtsnow,Rland_ice)
  • LMDZ6/trunk/libf/phylmdiso/phyredem.F90

    r5645 r5662  
    3131                                du_gwd_rando, du_gwd_front, u10m, v10m, &
    3232                                treedrg, solswfdiff, delta_sal, ds_ns, dt_ns, &
    33                                 delta_sst, ratqs_inter_, dter, dser, dt_ds
     33!GG                                delta_sst, ratqs_inter_, dter, dser, dt_ds
     34                                delta_sst, ratqs_inter_, dter, dser, dt_ds, &
     35                                hice, tice, bilg_cumul
     36!GG
    3437#ifdef ISO
    3538  USE phys_state_var_mod, ONLY: xtsol, fxtevap,xtrain_fall, xtsnow_fall,     &
     
    5154  USE carbon_cycle_mod, ONLY : carbon_cycle_cpl, co2_send, carbon_cycle_rad, RCO2_glo
    5255  USE indice_sol_mod, ONLY: nbsrf, is_oce, is_sic, is_ter, is_lic, epsfra
    53   USE surface_data, ONLY: type_ocean, version_ocean
    54   USE ocean_slab_mod, ONLY : nslay, tslab, seaice, tice, fsic
     56!GG  USE surface_data, ONLY: type_ocean, version_ocean
     57  USE surface_data, ONLY: type_ocean, version_ocean, iflag_seaice, iflag_seaice_alb, &
     58                          iflag_leads
     59!GG
     60  USE ocean_slab_mod, ONLY : nslay, tslab, seaice, tice_slab, fsic
    5561  USE time_phylmdz_mod, ONLY: annee_ref, day_end, itau_phy, pdtphys
    5662  use config_ocean_skin_m, only: activate_ocean_skin
     
    136142  IF (carbon_cycle_rad) tab_cntrl(17) = RCO2_glo
    137143  !PRINT*, "PC : phyredem RCO2_glo =",RCO2_glo
     144  !GG
     145  tab_cntrl(18 ) = iflag_seaice
     146  tab_cntrl(19 ) = iflag_seaice_alb
     147  tab_cntrl(20 ) = iflag_leads
     148  !GG
    138149
    139150  DO pass=1,2   ! pass=1 netcdf definition ; pass=2 netcdf write
     
    214225
    215226    CALL put_field_srf1(pass,"SNOW", "Neige", snow(:,:))
     227
     228    !GG
     229    CALL put_field(pass,"hice", "Ice thickness", hice)
     230    CALL put_field(pass,"tice", "Sea Ice temperature", tice)
     231    CALL put_field(pass,"bilg_cumul", "Flux conductivite + transmit sea-ice", bilg_cumul)
     232    !GG
    216233
    217234    CALL put_field(pass,"RADS", "Rayonnement net a la surface", radsol)
     
    388405        IF (version_ocean == 'sicINT') THEN
    389406            CALL put_field(pass,"seaice", "Slab seaice (kg/m2)", seaice)
    390             CALL put_field(pass,"slab_tice", "Slab sea ice temperature", tice)
     407            CALL put_field(pass,"slab_tice", "Slab sea ice temperature", tice_slab)
    391408        END IF
    392409    END IF
  • LMDZ6/trunk/libf/phylmdiso/physiq_mod.F90

    r5659 r5662  
    402402       rneb,  &
    403403       zxsnow,snowhgt,qsnow,to_ice,sissnow,runoff,albsol3_lic, &
    404        zxfluxt,zxfluxq
     404!GG       zxfluxt,zxfluxq
     405       zxfluxt,zxfluxq, &
     406       fcds, fcdi, dh_basal_growth, dh_basal_melt, &
     407       dh_top_melt, dh_snow2sic, &
     408       dtice_melt, dtice_snow2sic
     409!GG
    405410
    406411
     
    32993304            debut,     lafin, &
    33003305            longitude_deg, latitude_deg, rugoro,  zrmu0,      &
    3301             sollwdown,    cldt,      &
     3306        !GG    sollwdown,    cldt,      &
     3307            sollwdown, pphi,   cldt,      &
     3308        !GG
    33023309            rain_fall, snow_fall, bs_fall, solsw,   solswfdiff, sollw,     &
    33033310            gustiness,                                &
     
    33473354            wake_delta_pbl_TKE, &
    33483355                                !>nrlmd+jyg
    3349              treedrg &           
     3356!GG             treedrg )
     3357            treedrg,hice, tice, bilg_cumul, &
     3358            fcds, fcdi, dh_basal_growth, dh_basal_melt, &
     3359            dh_top_melt, dh_snow2sic, &
     3360            dtice_melt, dtice_snow2sic , &
     3361!GG
    33503362!AM
    3351             , tsurf_tersrf, tsoil_tersrf, qsurf_tersrf, tsurf_new_tersrf, &
     3363            tsurf_tersrf, tsoil_tersrf, qsurf_tersrf, tsurf_new_tersrf, &
    33523364            cdragm_tersrf, cdragh_tersrf, &
    33533365            swnet_tersrf, lwnet_tersrf, fluxsens_tersrf, fluxlat_tersrf &
Note: See TracChangeset for help on using the changeset viewer.