Ignore:
Timestamp:
Jul 28, 2000, 2:38:04 PM (24 years ago)
Author:
lmdzadmin
Message:

Mise au point de l'interface en force, ca tourne sur un pas de temps
LF

File:
1 edited

Legend:

Unmodified
Added
Removed
  • LMDZ.3.3/branches/rel-LF/libf/phylmd/interface_surf.F90

    r109 r112  
    3636
    3737#include "YOMCST.inc"
    38 
    39 
    40   ! run_off      ruissellement total
     38#include "indicesol.inc"
     39
     40
     41! run_off      ruissellement total
    4142  real, allocatable, dimension(:),save    :: run_off
    4243
     
    5657      & albedo, snow, qsol, &
    5758      & tsurf, p1lay, ps, radsol, &
    58       & ocean, zmasq, &
     59      & ocean, npas, nexca, zmasq, &
    5960      & evap, fluxsens, fluxlat, dflux_l, dflux_s, &             
    60       & tsol_rad, tsurf_new, alb_new, emis_new, z0_new, pctsrf_new)
     61      & tsol_rad, tsurf_new, alb_new, emis_new, z0_new, pctsrf_new, agesno)
    6162
    6263
     
    125126!   pctsrf_new   nouvelle repartition des surfaces
    126127
    127   include 'indicesol.h'
    128128
    129129! Parametres d'entree
     
    153153  real, dimension(klon), intent(IN) :: fder, taux, tauy
    154154  character (len = 6)  :: ocean
     155  integer              :: npas, nexca ! nombre et pas de temps couplage
    155156  real, dimension(knon), intent(INOUT) :: evap, snow, qsol
    156157
     
    161162  real, dimension(knon), intent(OUT):: dflux_l, dflux_s
    162163  real, dimension(klon,nbsrf), intent(OUT) :: pctsrf_new
     164  real, dimension(klon), intent(INOUT):: agesno
    163165
    164166! Local
     
    166168  character (len = 80) :: abort_message
    167169  logical, save        :: first_call = .true.
    168   integer              :: error
     170  INTEGER              :: error, ii
    169171  logical              :: check = .true.
    170172  real, dimension(knon):: cal, beta, dif_grnd, capsol
    171173  real, parameter      :: calice=1.0/(5.1444e+06*0.15), tau_gl=1./86400.*5.
    172174  real, parameter      :: calsno=1./(2.3867e+06*.15)
    173   integer              :: nexca !pas de temps couplage
    174175  real, dimension(knon):: alb_ice
    175176  real, dimension(knon):: tsurf_temp
    176   real, dimension(klon):: agesno, alb_neig_grid, alb_eau
     177  real, dimension(klon):: alb_neig_grid, alb_eau
    177178  real, dimension(knon):: alb_neig
     179  REAL, DIMENSION(knon):: lmt_rug, lmt_alb
     180  real, DIMENSION(knon):: zfra
    178181
    179182  if (check) write(*,*) 'Entree ', modname
     
    203206      abort_message='voir ci-dessus'
    204207      call abort_gcm(modname,abort_message,1)
     208    endif
    205209  endif
    206210  first_call = .false.
     
    233237!
    234238
    235   CALL albsno(agesno,alb_neig_grid) 
    236 !
    237 !
    238 !
     239  CALL albsno(klon,agesno,alb_neig_grid) 
     240 
     241 
     242 
    239243    if (.not. ok_veget) then
    240244!
     
    256260     & klon, nisurf, knon, knindex, debut,  &
    257261     & lmt_alb, lmt_rug)
    258        alb_neig = alb_neig_grid(knindex)
     262!
     263! Pb compilo sun
     264!       alb_neig = alb_neig_grid(knindex)
     265!      alb_new = alb_neig*zfra + lmt_alb(knindex)*(1.0-zfra)
     266!      z0_new = lmt_rug(knindex)
     267!
     268       DO ii = 1, knon
     269         alb_neig(ii) = alb_neig_grid(knindex(ii))
     270         alb_new(ii) = lmt_alb(knindex(ii))
     271       enddo
    259272       zfra = MAX(0.0,MIN(1.0,snow/(snow+10.0)))
    260        alb_new = alb_neig*zfra + lmt_alb(knindex)*(1.0-zfra)
    261        z0_new = lmt_rug(knindex)
    262    
     273       alb_new = alb_neig*zfra + alb_new*(1.0-zfra)
     274       DO ii = 1, knon
     275         z0_new(ii) = lmt_rug(knindex(ii))
     276       enddo   
    263277    else
    264278!
     
    293307      call interfoce(itime, dtime, &
    294308      & klon, iim, jjm, nisurf, pctsrf, knon, knindex, rlon, rlat, &
    295       & ocean, nexca, debut, lafin, &
     309      & ocean, npas, nexca, debut, lafin, &
    296310      & swdown, lwdown, precip_rain, precip_snow, evap, tsurf, &
    297311      & fder, albedo, taux, tauy, zmasq, &
    298312      & tsurf_new, alb_new, alb_ice, pctsrf_new)
    299 
    300       tsurf_temp = tsurf_new
    301313
    302314!    else if (ocean == 'slab  ') then
     
    310322    endif
    311323
     324    tsurf_temp = tsurf_new
    312325    cal = 0.
    313326    beta = 1.
     
    324337!
    325338
    326      if ( minval(rmu0) == maxval(rmu0) && minval(rmu0) = -999.999 ) then
    327        CALL alboc(FLOAT(jour),rlat,alb_eau)
    328      else  ! cycle diurne
    329        CALL alboc_cd(rmu0,alb_eau)
    330      endif
    331      alb_new = alb_eau(knindex)
    332 
     339    if ( minval(rmu0) == maxval(rmu0) .and. minval(rmu0) == -999.999 ) then
     340      CALL alboc(FLOAT(jour),rlat,alb_eau)
     341    else  ! cycle diurne
     342      CALL alboc_cd(rmu0,alb_eau)
     343    endif
     344    DO ii =1, knon
     345      alb_new(ii) = alb_eau(knindex(ii))
     346    enddo
    333347!
    334348  else if (nisurf == is_sic) then
     
    341355!
    342356    if (ocean == 'couple') then
    343       nexca = 0
    344357
    345358      call interfoce(itime, dtime, &
    346359      & klon, iim, jjm, nisurf, pctsrf, knon, knindex, rlon, rlat, &
    347       & ocean, nexca, debut, lafin, &
     360      & ocean, npas, nexca, debut, lafin, &
    348361      & swdown, lwdown, precip_rain, precip_snow, evap, tsurf, &
    349362      & fder, albedo, taux, tauy, zmasq, &
     
    357370!      call interfoce(nisurf)
    358371    else                              ! lecture conditions limites
    359 !      call interfoce(itime, dtime, jour, &
    360 !     &  klon, nisurf, knon, knindex, &
    361 !     &  debut, &
    362 !     &  tsurf_new, pctsrf_new)
    363 !   endif
     372      call interfoce(itime, dtime, jour, &
     373     &  klon, nisurf, knon, knindex, &
     374     &  debut, &
     375     &  tsurf_new, pctsrf_new)
    364376
    365377      cal = calice
     
    381393!
    382394       zfra = MAX(0.0,MIN(1.0,snow/(snow+10.0)))
    383        alb_neig = alb_neig_grid(knindex)
     395       DO ii = 1, knon
     396         alb_neig = alb_neig_grid(knindex(ii))
     397       enddo
    384398       alb_new = alb_neig*zfra + 0.6 * (1.0-zfra)
    385399
     
    409423!
    410424       zfra = MAX(0.0,MIN(1.0,snow/(snow+10.0)))
    411        alb_neig = alb_neig_grid(knindex)
     425       DO ii =1, knon
     426         alb_neig = alb_neig_grid(knindex(ii))
     427       enddo
    412428       alb_new = alb_neig*zfra + 0.6 * (1.0-zfra)
    413429
     
    634650  SUBROUTINE interfoce_cpl(itime, dtime, &
    635651      & klon, iim, jjm, nisurf, pctsrf, knon, knindex, rlon, rlat, &
    636       & ocean, nexca, debut, lafin, &
     652      & ocean, npas, nexca, debut, lafin, &
    637653      & swdown, lwdown, precip_rain, precip_snow, evap, tsurf, &
    638654      & fder, albsol, taux, tauy, zmasq, &
     
    691707!
    692708
    693 #include 'indicesol.h'
    694709
    695710! Parametres d'entree
     
    708723  real, dimension(knon), intent(IN) :: precip_rain, precip_snow
    709724  real, dimension(knon), intent(IN) :: tsurf, fder, albsol, taux, tauy
    710   integer              :: nexca
     725  INTEGER              :: nexca, npas
    711726  real, dimension(klon), intent(IN) :: zmasq
    712727
     
    719734! Variables locales
    720735  integer                    :: j, error, sum_error, ig
    721   integer                    :: npas
    722736  character (len = 20) :: modname = 'interfoce_cpl'
    723737  character (len = 80) :: abort_message
     
    792806! initialisation couplage
    793807!
    794     call inicma(npas, nexca, dtime)
     808    call inicma(npas , nexca, dtime)
    795809!
    796810! 1ere lecture champs ocean
     
    824838  endif ! fin if (debut)
    825839
    826 !! fichier restart et fichiers histoires
    827 
    828 !! calcul des fluxs a passer
     840! fichier restart et fichiers histoires
     841
     842! calcul des fluxs a passer
    829843
    830844  cpl_sols(:,nisurf) = cpl_sols(:,nisurf) + swdown      / FLOAT(nexca)
     
    10371051!
    10381052
    1039 #include "indicesol.h"
    10401053
    10411054! Parametres d'entree
     
    10551068! Variables locales
    10561069  integer     :: ii
    1057   integer    :: lmt_pas     ! frequence de lecture des conditions limites
     1070  INTEGER,save :: lmt_pas     ! frequence de lecture des conditions limites
    10581071                             ! (en pas de physique)
    10591072  logical,save :: deja_lu    ! pour indiquer que le jour a lire a deja
     
    10631076  character (len = 20) :: modname = 'interfoce_lim'
    10641077  character (len = 80) :: abort_message
    1065   character (len = 20) :: fich ='limit'
    1066   logical     :: newlmt = .false.
     1078  character (len = 20) :: fich ='limit.nc'
     1079  LOGICAL     :: newlmt = .TRUE.
    10671080  logical     :: check = .true.
    10681081! Champs lus dans le fichier de CL
     
    10791092!
    10801093   
    1081   if (debut) then
     1094  if (debut .and. .not. allocated(sst_lu)) then
    10821095    lmt_pas = nint(86400./dtime * 1.0) ! pour une lecture une fois par jour
    10831096    jour_lu = jour - 1
     
    10961109! Ouverture du fichier
    10971110!
     1111    fich = trim(fich)
    10981112    ierr = NF_OPEN (fich, NF_NOWRITE,nid)
    10991113    if (ierr.NE.NF_NOERR) then
     
    11191133      endif
    11201134#ifdef NC_DOUBLE
    1121       ierr = NF_GET_VARA_DOUBLE(nid,nvarid,start,epais,pctsrf_new(1,is_oce))
     1135      ierr = NF_GET_VARA_DOUBLE(nid,nvarid,start,epais,pct_tmp(1,is_oce))
    11221136#else
    1123       ierr = NF_GET_VARA_REAL(nid,nvarid,start,epais,pctsrf_new(1,is_oce))
     1137      ierr = NF_GET_VARA_REAL(nid,nvarid,start,epais,pct_tmp(1,is_oce))
    11241138#endif
    11251139      if (ierr /= NF_NOERR) then
     
    11361150      endif
    11371151#ifdef NC_DOUBLE
    1138       ierr = NF_GET_VARA_DOUBLE(nid,nvarid,start,epais,pctsrf_new(1,is_sic))
     1152      ierr = NF_GET_VARA_DOUBLE(nid,nvarid,start,epais,pct_tmp(1,is_sic))
    11391153#else
    1140       ierr = NF_GET_VARA_REAL(nid,nvarid,start,epais,pctsrf_new(1,is_sic))
     1154      ierr = NF_GET_VARA_REAL(nid,nvarid,start,epais,pct_tmp(1,is_sic))
    11411155#endif
    11421156      if (ierr /= NF_NOERR) then
     
    11531167      endif
    11541168#ifdef NC_DOUBLE
    1155       ierr = NF_GET_VARA_DOUBLE(nid,nvarid,start,epais,pctsrf_new(1,is_ter))
     1169      ierr = NF_GET_VARA_DOUBLE(nid,nvarid,start,epais,pct_tmp(1,is_ter))
    11561170#else
    1157       ierr = NF_GET_VARA_REAL(nid,nvarid,start,epais,pctsrf_new(1,is_ter))
     1171      ierr = NF_GET_VARA_REAL(nid,nvarid,start,epais,pct_tmp(1,is_ter))
    11581172#endif
    11591173      if (ierr /= NF_NOERR) then
     
    11701184      endif
    11711185#ifdef NC_DOUBLE
    1172       ierr = NF_GET_VARA_DOUBLE(nid,nvarid,start,epais,pctsrf_new(1,is_lic))
     1186      ierr = NF_GET_VARA_DOUBLE(nid,nvarid,start,epais,pct_tmp(1,is_lic))
    11731187#else
    1174       ierr = NF_GET_VARA_REAL(nid,nvarid,start,epais,pctsrf_new(1,is_lic))
     1188      ierr = NF_GET_VARA_REAL(nid,nvarid,start,epais,pct_tmp(1,is_lic))
    11751189#endif
    11761190      if (ierr /= NF_NOERR) then
     
    12401254! Recopie des variables dans les champs de sortie
    12411255!
    1242   lmt_sst = sst_lu(knindex)
     1256  do ii = 1, knon
     1257    lmt_sst(ii) = sst_lu(knindex(ii))
     1258  enddo
     1259! je peux pas utiliser la ligne suivante a cause du compilo Sun
     1260!  lmt_sst = sst_lu(knindex)
    12431261  pctsrf_new = pct_tmp
    12441262
     
    12751293!
    12761294
    1277 #include "indicesol.h"
    12781295
    12791296! Parametres d'entree
     
    13011318  character (len = 20) :: modname = 'interfoce_lim'
    13021319  character (len = 80) :: abort_message
    1303   character (len = 20) :: fich ='limit'
     1320  character (len = 20) :: fich ='limit.nc'
    13041321  logical     :: newlmt = .false.
    13051322  logical     :: check = .true.
     
    13231340  endif
    13241341
    1325   if ((jour - jour_lu_sur) /= 0) deja_lu = .false.
     1342  if ((jour - jour_lu_sur) /= 0) deja_lu_sur = .false.
    13261343 
    1327   if (check) write(*,*)modname,':: jour_lu, deja_lu_sur', jour_lu, deja_lu_sur
     1344  if (check) write(*,*)modname,':: jour_lu_sur, deja_lu_sur', jour_lu_sur, deja_lu_sur
    13281345
    13291346! Tester d'abord si c'est le moment de lire le fichier
     
    13321349! Ouverture du fichier
    13331350!
     1351    fich = trim(fich)
    13341352    ierr = NF_OPEN (fich, NF_NOWRITE,nid)
    13351353    if (ierr.NE.NF_NOERR) then
     
    13391357!
    13401358! La tranche de donnees a lire:
    1341 !
     1359 
    13421360    start(1) = 1
    13431361    start(2) = jour + 1
     
    13891407! Recopie des variables dans les champs de sortie
    13901408!
    1391   lmt_alb = alb_lu(knindex)
    1392   lmt_rug = rug_lu(knindex)
     1409  DO ii = 1, knon
     1410    lmt_alb(ii) = alb_lu(knindex(ii))
     1411    lmt_rug(ii) = rug_lu(knindex(ii))
     1412  enddo
    13931413
    13941414  END SUBROUTINE interfsur_lim
     
    14411461#include "YOETHF.inc"
    14421462#include "FCTTRE.inc"
    1443 #include 'indicesol.h'
    14441463
    14451464! Parametres d'entree
     
    16061625!#########################################################################
    16071626!
    1608 
    1609   SUBROUTINE sol_dem_write(itime, klon, rlon, rlat, &
    1610   &                     pctsrf_new,tsurf_new,alb_new)
    1611 
    1612 ! Routine d'ecriture de l'etat de redemarrage pour le sol
    1613 !
    1614 ! L.Fairhead
    1615 !
    1616 ! input:
    1617 !   itime        numero du pas de temps
    1618 !   klon         nombre total de points de grille
    1619 !   rlon         longitudes
    1620 !   rlat         latitudes
    1621 !   tsurf_new    temperature au sol
    1622 !   alb_new      albedo
    1623 !   pctsrf_new   repartition des surfaces
    1624 
    1625   include 'indicesol.h'
    1626 #include 'temps.inc'
    1627   include 'netcdf.inc'
    1628 
    1629 ! Parametres d'entree
    1630   integer, intent(IN) :: itime
    1631   integer, intent(IN) :: klon
    1632   real, dimension(klon), intent(IN) :: rlon, rlat
    1633   real, dimension(klon,nbsrf), intent(IN)  :: tsurf_new, alb_new
    1634   real, dimension(klon,nbsrf), intent(IN) :: pctsrf_new
    1635 
    1636 ! Variables locales
    1637   integer             :: ierr, nid
    1638   integer             :: idim1, idim2, idim3
    1639   integer,parameter   :: length = 100
    1640   character (len = 20) :: modname = 'sol_dem_write'
    1641   character (len = 80) :: abort_message
    1642   real, dimension(length) :: tab_cntrl = 0.
    1643   integer                 :: nvarid
    1644 
    1645   ierr = NF_CREATE('restartsol', NF_CLOBBER, nid)
    1646   IF (ierr.NE.NF_NOERR) THEN
    1647     abort_message=' Pb d''ouverture du fichier restartsol'
    1648     CALL abort_gcm(modname,abort_message,ierr)
    1649   ENDIF
    1650 
    1651   ierr = NF_PUT_ATT_TEXT (nid, NF_GLOBAL, "title", 23,    &
    1652      &                    "Fichier redemmarage sol")
    1653   ierr = NF_DEF_DIM (nid, "index", length, idim1)
    1654   ierr = NF_DEF_DIM (nid, "points_physiques", klon, idim2)
    1655   ierr = NF_DEF_DIM (nid, "nombre_surfaces", nbsrf, idim3)
    1656   ierr = NF_ENDDEF(nid)
    1657 
    1658   tab_cntrl(13) = day_end
    1659   tab_cntrl(14) = anne_ini
    1660 
    1661   ierr = NF_REDEF (nid)
    1662 #ifdef NC_DOUBLE
    1663   ierr = NF_DEF_VAR (nid, "controle", NF_DOUBLE, 1, idim1,nvarid)
    1664 #else
    1665   ierr = NF_DEF_VAR (nid, "controle", NF_FLOAT, 1, idim1,nvarid)
    1666 #endif
    1667   ierr = NF_PUT_ATT_TEXT (nid,nvarid,"title", 22,  &
    1668      &                        "Parametres de controle")
    1669   ierr = NF_ENDDEF(nid)
    1670 #ifdef NC_DOUBLE
    1671   ierr = NF_PUT_VAR_DOUBLE (nid,nvarid,tab_cntrl)
    1672 #else
    1673   ierr = NF_PUT_VAR_REAL (nid,nvarid,tab_cntrl)
    1674 #endif
    1675 
    1676   ierr = NF_REDEF (nid)
    1677 #ifdef NC_DOUBLE
    1678   ierr = NF_DEF_VAR (nid, "longitude", NF_DOUBLE, 1, idim2,nvarid)
    1679 #else
    1680   ierr = NF_DEF_VAR (nid, "longitude", NF_FLOAT, 1, idim2,nvarid)
    1681 #endif
    1682   ierr = NF_PUT_ATT_TEXT (nid,nvarid,"title", 32,  &
    1683      &               "Longitudes de la grille physique")
    1684   ierr = NF_ENDDEF(nid)
    1685 #ifdef NC_DOUBLE
    1686   ierr = NF_PUT_VAR_DOUBLE (nid,nvarid,rlon)
    1687 #else
    1688   ierr = NF_PUT_VAR_REAL (nid,nvarid,rlon)
    1689 #endif
    1690 !
    1691   ierr = NF_REDEF (nid)
    1692 #ifdef NC_DOUBLE
    1693   ierr = NF_DEF_VAR (nid, "latitude", NF_DOUBLE, 1, idim2,nvarid)
    1694 #else
    1695   ierr = NF_DEF_VAR (nid, "latitude", NF_FLOAT, 1, idim2,nvarid)
    1696 #endif
    1697   ierr = NF_PUT_ATT_TEXT (nid,nvarid,"title", 31,    &
    1698      &                        "Latitudes de la grille physique")
    1699   ierr = NF_ENDDEF(nid)
    1700 #ifdef NC_DOUBLE
    1701   ierr = NF_PUT_VAR_DOUBLE (nid,nvarid,rlat)
    1702 #else
    1703   ierr = NF_PUT_VAR_REAL (nid,nvarid,rlat)
    1704 #endif
    1705         ierr = NF_REDEF (nid)
    1706 #ifdef NC_DOUBLE
    1707         ierr = NF_DEF_VAR (nid, "TS", NF_DOUBLE, 1, idim2,nvarid)
    1708 #else
    1709         ierr = NF_DEF_VAR (nid, "TS", NF_FLOAT, 1, idim2,nvarid)
    1710 #endif
    1711         ierr = NF_PUT_ATT_TEXT (nid,nvarid,"title", 22, &
    1712      &                        "Temperature de surface")
    1713         ierr = NF_ENDDEF(nid)
    1714 
    1715 
    1716 
    1717 
    1718   END SUBROUTINE sol_dem_write
    1719 !
    1720 !#########################################################################
    1721 !
    17221627  SUBROUTINE gath2cpl(champ_in, champ_out, klon, knon, iim, jjm, knindex)
    17231628
     
    18061711!#########################################################################
    18071712!
    1808 !
    1809 !#########################################################################
    1810 !
    1811   SUBROUTINE albsno(agesno,alb_neig_grid)
     1713  SUBROUTINE albsno(klon, agesno,alb_neig_grid)
    18121714  IMPLICIT none
    1813 c
    1814 #include "dimensions.h"
    1815 #include "dimphy.h"
    1816   INTEGER nvm
    1817   PARAMETER (nvm=8)
    1818   REAL veget(klon,nvm)
    1819   REAL alb_neig(klon)
    1820   REAL agesno(klon)
    1821 c
    1822   INTEGER i, nv
    1823 c
    1824   REAL init(nvm), decay(nvm), as
    1825   SAVE init, decay
     1715 
     1716  integer :: klon
     1717  INTEGER, PARAMETER :: nvm = 8
     1718  REAL, dimension(klon,nvm) :: veget
     1719  REAL, DIMENSION(klon) :: alb_neig_grid, agesno
     1720 
     1721  INTEGER :: i, nv
     1722 
     1723  REAL, DIMENSION(nvm),SAVE :: init, decay
     1724  REAL :: as
    18261725  DATA init /0.55, 0.14, 0.18, 0.29, 0.15, 0.15, 0.14, 0./
    18271726  DATA decay/0.30, 0.67, 0.63, 0.45, 0.40, 0.14, 0.06, 1./
    1828 c
     1727 
    18291728  veget = 0.
    18301729  veget(:,1) = 1.     ! desert partout
    18311730  DO i = 1, klon
    1832     alb_neig(i) = 0.0
     1731    alb_neig_grid(i) = 0.0
    18331732  ENDDO
    18341733  DO nv = 1, nvm
    18351734    DO i = 1, klon
    18361735      as = init(nv)+decay(nv)*EXP(-agesno(i)/5.)
    1837       alb_neig(i) = alb_neig(i) + veget(i,nv)*as
     1736      alb_neig_grid(i) = alb_neig_grid(i) + veget(i,nv)*as
    18381737    ENDDO
    18391738  ENDDO
    1840 c
     1739 
    18411740  END SUBROUTINE albsno
    18421741!
Note: See TracChangeset for help on using the changeset viewer.