Ignore:
Timestamp:
Jul 21, 2000, 10:28:19 AM (24 years ago)
Author:
lmdzadmin
Message:

Rajout interface ocean couple

File:
1 edited

Legend:

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

    r101 r105  
    3838! run_off      ruissellement total
    3939  real, allocatable, dimension(:),save    :: run_off
     40#include "YOMCST.inc"
    4041
    4142
     
    5253      & fder, taux, tauy, &
    5354      & albedo, snow, qsol, &
    54       & tsurf, p1lay, coef1lay, ps, radsol, &
    55       & ocean, &
     55      & tsurf, p1lay, ps, radsol, &
     56      & ocean, zmasq, &
    5657      & evap, fluxsens, fluxlat, dflux_l, dflux_s, &             
    57       & tsol_rad, tsurf_new, alb_new, emis_new, z0_new, pctsrf_new, zmasq)
     58      & tsol_rad, tsurf_new, alb_new, emis_new, z0_new, pctsrf_new)
    5859
    5960
     
    103104!   tsurf        temperature de surface
    104105!   p1lay        pression 1er niveau (milieu de couche)
    105 !   coef1lay     coefficient d'echange
    106106!   ps           pression au sol
    107107!   radsol       rayonnement net aus sol (LW + SW)
     
    109109!   fder         derivee des flux (pour le couplage)
    110110!   taux, tauy   tension de vents
     111!   zmasq        masque terre/ocean
    111112!
    112113! output:
     
    120121!   z0_new       surface roughness
    121122!   pctsrf_new   nouvelle repartition des surfaces
    122 !   zmasq        masque terre/ocean
    123123
    124124  include 'indicesol.h'
     
    144144  real, dimension(knon), intent(IN) :: precip_rain, precip_snow
    145145  real, dimension(knon), intent(IN) :: lwdown, swnet, swdown, ps, albedo
    146   real, dimension(knon), intent(IN) :: tsurf, p1lay, coef1lay
     146  real, dimension(knon), intent(IN) :: tsurf, p1lay
    147147  real, dimension(knon), intent(IN) :: radsol
    148148  real, dimension(klon), intent(IN) :: zmasq
     
    169169  integer              :: nexca !pas de temps couplage
    170170  real, dimension(knon):: alb_ice
     171  real, dimension(knon):: tsurf_temp
    171172
    172173#include "YOMCST.inc"
     
    191192      call abort_gcm(modname,abort_message,1)
    192193    endif
     194    if ( is_oce > is_sic ) then
     195      write(*,*)' *** Warning ***'
     196      write(*,*)' Pour des raisons de sequencement dans le code'
     197      write(*,*)' l''ocean doit etre traite avant la banquise'
     198      write(*,*)' or is_oce = ',is_oce, '> is_sic = ',is_sic
     199      abort_message='voir ci-dessus'
     200      call abort_gcm(modname,abort_message,1)
    193201  endif
    194202  first_call = .false.
     
    228236      cal = RCPD * capsol
    229237      call calcul_fluxs( knon, nisurf, dtime, &
    230      &   tsurf, p1lay, cal, beta, coef1lay, ps, &
     238     &   tsurf, p1lay, cal, beta, tq_cdrag, ps, &
    231239     &   precip_rain, precip_snow, snow, qsol,  &
    232240     &   radsol, dif_grnd, temp_air, spechum, u1_lay, v1_lay, &
     
    247255     &  tq_cdrag, petAcoef, peqAcoef, petBcoef, peqBcoef, &
    248256     &  precip_rain, precip_snow, lwdown, swnet, swdown, &
    249      &  tsurf, p1lay, coef1lay, ps, radsol, &
     257     &  tsurf, p1lay, ps, radsol, &
    250258     &  evap, fluxsens, fluxlat, &             
    251259     &  tsol_rad, tsurf_new, alb_new, emis_new, z0_new, dflux_l, dflux_s)
     
    271279      & ocean, nexca, debut, lafin, &
    272280      & swdown, lwdown, precip_rain, precip_snow, evap, tsurf, &
    273       & fder, albedo, taux, tauy, &
     281      & fder, albedo, taux, tauy, zmasq, &
    274282      & tsurf_new, alb_new, alb_ice, pctsrf_new)
     283
     284      tsurf_temp = tsurf_new
    275285
    276286!    else if (ocean == 'slab  ') then
     
    281291!     &  debut, &
    282292!     &  tsurf_new, alb_new, z0_new, pctsrf_new)
     293!
    283294    endif
    284 !
     295
    285296    cal = 0.
    286297    beta = 1.
    287298    dif_grnd = 0.
    288299
     300    endif
    289301    call calcul_fluxs( knon, nisurf, dtime, &
    290      &   tsurf, p1lay, cal, beta, coef1lay, ps, &
     302     &   tsurf_temp, p1lay, cal, beta, tq_cdrag, ps, &
    291303     &   precip_rain, precip_snow, snow, qsol,  &
    292304     &   radsol, dif_grnd, temp_air, spechum, u1_lay, v1_lay, &
     
    307319! Surface "glace de mer" appel a l'interface avec l'ocean
    308320!
    309 !    call interfoce(nisurf, ocean)
    310 !
    311 
    312     cal = calice
    313     where (snow > 0.0) cal = calsno
    314     beta = 1.0
    315     dif_grnd = 1.0 / tau_gl
     321!
     322    if (ocean == 'couple') then
     323      nexca = 0
     324
     325      call interfoce(itime, dtime, &
     326      & klon, iim, jjm, nisurf, pctsrf, knon, knindex, rlon, rlat, &
     327      & ocean, nexca, debut, lafin, &
     328      & swdown, lwdown, precip_rain, precip_snow, evap, tsurf, &
     329      & fder, albedo, taux, tauy, zmasq, &
     330      & tsurf_new, alb_new, alb_ice, pctsrf_new)
     331
     332      tsurf_temp = tsurf_new
     333      cal = 0.
     334      dif_grnd = 0.
     335
     336!    else if (ocean == 'slab  ') then
     337!      call interfoce(nisurf)
     338    else                              ! lecture conditions limites
     339!      call interfoce(itime, dtime, jour, &
     340!     &  klon, nisurf, knon, knindex, &
     341!     &  debut, &
     342!     &  tsurf_new, alb_new, z0_new, pctsrf_new)endif
     343
     344      cal = calice
     345      where (snow > 0.0) cal = calsno
     346      beta = 1.0
     347      dif_grnd = 1.0 / tau_gl
     348      tsurf_temp = tsurf
     349    endif
    316350
    317351    call calcul_fluxs( knon, nisurf, dtime, &
    318      &   tsurf, p1lay, cal, beta, coef1lay, ps, &
     352     &   tsurf_temp, p1lay, cal, beta, tq_cdrag, ps, &
    319353     &   precip_rain, precip_snow, snow, qsol,  &
    320354     &   radsol, dif_grnd, temp_air, spechum, u1_lay, v1_lay, &
     
    338372
    339373    call calcul_fluxs( knon, nisurf, dtime, &
    340      &   tsurf, p1lay, cal, beta, coef1lay, ps, &
     374     &   tsurf, p1lay, cal, beta, tq_cdrag, ps, &
    341375     &   precip_rain, precip_snow, snow, qsol,  &
    342376     &   radsol, dif_grnd, temp_air, spechum, u1_lay, v1_lay, &
     
    386420     & tq_cdrag, petAcoef, peqAcoef, petBcoef, peqBcoef, &
    387421     & precip_rain, precip_snow, lwdown, swnet, swdown, &
    388      & tsurf, p1lay, coef1lay, ps, radsol, &
     422     & tsurf, p1lay, ps, radsol, &
    389423     & evap, fluxsens, fluxlat, &             
    390424     & tsol_rad, tsurf_new, alb_new, emis_new, z0_new, dflux_l, dflux_s)
     
    427461!   tsurf        temperature de surface
    428462!   p1lay        pression 1er niveau (milieu de couche)
    429 !   coef1lay     coefficient d'echange
    430463!   ps           pression au sol
    431464!   radsol       rayonnement net aus sol (LW + SW)
     
    463496  real, dimension(knon), intent(IN) :: precip_rain, precip_snow
    464497  real, dimension(knon), intent(IN) :: lwdown, swnet, swdown, ps
    465   real, dimension(knon), intent(IN) :: tsurf, p1lay, coef1lay
     498  real, dimension(knon), intent(IN) :: tsurf, p1lay
    466499  real, dimension(knon), intent(IN) :: radsol
    467500! Parametres de sortie
     
    569602      & ocean, nexca, debut, lafin, &
    570603      & swdown, lwdown, precip_rain, precip_snow, evap, tsurf, &
    571       & fder, albsol, taux, tauy, &
     604      & fder, albsol, taux, tauy, zmasq, &
    572605      & tsurf_new, alb_new, alb_ice, pctsrf_new)
    573 
    574 
    575606
    576607! Cette routine sert d'interface entre le modele atmospherique et un
    577608! coupleur avec un modele d'ocean 'complet' derriere
     609!
     610! Le modele de glace qu'il est prevu d'utiliser etant couple directement a
     611! l'ocean presentement, on va passer deux fois dans cette routine par pas de
     612! temps physique, une fois avec les points oceans et l'autre avec les points
     613! glace. A chaque pas de temps de couplage, la lecture des champs provenant
     614! du coupleur se fera "dans" l'ocean et l'ecriture des champs a envoyer
     615! au coupleur "dans" la glace. Il faut donc des tableaux de travail "tampons"
     616! dimensionnes sur toute la grille qui remplissent les champs sur les
     617! domaines ocean/glace quand il le faut. Il est aussi necessaire que l'index
     618! ocean soit traiter avant l'index glace (sinon tout intervertir)
     619!
    578620!
    579621! L. Fairhead 02/2000
     
    605647!   tauy         tension de vent en y
    606648!   nexca        frequence de couplage
     649!   zmasq        masque terre/ocean
    607650!
    608651!
     
    632675  real, dimension(knon), intent(IN) :: tsurf, fder, albsol, taux, tauy
    633676  integer              :: nexca
     677  real, dimension(klon), intent(IN) :: zmasq
    634678
    635679  real, dimension(knon), intent(INOUT) :: evap
     
    646690  logical              :: check = .true.
    647691! variables pour moyenner les variables de couplage
    648   real, allocatable, dimension(:),save :: cpl_sols, cpl_nsol, cpl_rain
    649   real, allocatable, dimension(:),save :: cpl_snow, cpl_evap, cpl_tsol
    650   real, allocatable, dimension(:),save :: cpl_fder, cpl_albe, cpl_taux
    651   real, allocatable, dimension(:),save :: cpl_tauy, cpl_ruis
     692  real, allocatable, dimension(:,:),save :: cpl_sols, cpl_nsol, cpl_rain
     693  real, allocatable, dimension(:,:),save :: cpl_snow, cpl_evap, cpl_tsol
     694  real, allocatable, dimension(:,:),save :: cpl_fder, cpl_albe, cpl_taux
     695  real, allocatable, dimension(:,:),save :: cpl_tauy, cpl_rriv, cpl_rcoa
     696! variables tampons avant le passage au coupleur
     697  real, allocatable, dimension(:,:,:),save :: tmp_sols, tmp_nsol, tmp_rain
     698  real, allocatable, dimension(:,:,:),save :: tmp_snow, tmp_evap, tmp_tsol
     699  real, allocatable, dimension(:,:,:),save :: tmp_fder, tmp_albe, tmp_taux
     700  real, allocatable, dimension(:,:,:),save :: tmp_tauy, tmp_rriv, tmp_rcoa
    652701! variables a passer au coupleur
    653   real, dimension(iim, jjm+1) :: wri_sols, wri_nsol, wri_rain
    654   real, dimension(iim, jjm+1) :: wri_snow, wri_evap, wri_tsol
    655   real, dimension(iim, jjm+1) :: wri_fder, wri_albe, wri_taux
    656   real, dimension(iim, jjm+1) :: wri_tauy, wri_ruis
     702  real, dimension(iim, jjm+1) :: wri_sol_ice, wri_sol_sea, wri_nsol_ice
     703  real, dimension(iim, jjm+1) :: wri_nsol_sea, wri_fder_ice, wri_evap_ice
     704  real, dimension(iim, jjm+1) :: wri_evap_sea
     705  real, dimension(iim, jjm+1) :: wri_rain, wri_snow, wri_taux
     706  real, dimension(iim, jjm+1) :: wri_tauy, wri_rriv, wri_rcoa
    657707! variables relues par le coupleur
    658   real, dimension(iim, jjm+1) :: read_sst, read_sic
    659   real, dimension(iim, jjm+1) :: read_alb_sst, read_alb_sic
     708! read_sic = fraction de glace
     709! read_sit = temperature de glace
     710  real, allocatable, dimension(:,:),save :: read_sst, read_sic, read_sit
     711  real, allocatable, dimension(:,:),save :: read_alb_sic
    660712! variable tampon
    661713  real, dimension(klon)       :: tamp
    662714  real, dimension(knon)       :: tamp_sic
    663 
    664 
     715  real, dimension(iim, jjm+1, 2) :: tamp_srf
     716  integer, allocatable, dimension(:), save :: tamp_ind
     717  real, allocatable, dimension(:,:),save :: tamp_zmasq
     718  real, dimension(iim, jjm+1) :: deno
    665719!
    666720! Initialisation
     
    668722  if (debut) then
    669723    sum_error = 0
    670     allocate(cpl_sols(knon), stat = error)
    671     sum_error = sum_error + error
    672     allocate(cpl_nsol(knon), stat = error)
    673     sum_error = sum_error + error
    674     allocate(cpl_rain(knon), stat = error)
    675     sum_error = sum_error + error
    676     allocate(cpl_snow(knon), stat = error)
    677     sum_error = sum_error + error
    678     allocate(cpl_evap(knon), stat = error)
    679     sum_error = sum_error + error
    680     allocate(cpl_tsol(knon), stat = error)
    681     sum_error = sum_error + error
    682     allocate(cpl_fder(knon), stat = error)
    683     sum_error = sum_error + error
    684     allocate(cpl_albe(knon), stat = error)
    685     sum_error = sum_error + error
    686     allocate(cpl_taux(knon), stat = error)
    687     sum_error = sum_error + error
    688     allocate(cpl_tauy(knon), stat = error)
    689     sum_error = sum_error + error
    690     allocate(cpl_ruis(knon), stat = error)
    691     sum_error = sum_error + error
     724    allocate(cpl_sols(knon,2), stat = error); sum_error = sum_error + error
     725    allocate(cpl_nsol(knon,2), stat = error); sum_error = sum_error + error
     726    allocate(cpl_rain(knon,2), stat = error); sum_error = sum_error + error
     727    allocate(cpl_snow(knon,2), stat = error); sum_error = sum_error + error
     728    allocate(cpl_evap(knon,2), stat = error); sum_error = sum_error + error
     729    allocate(cpl_tsol(knon,2), stat = error); sum_error = sum_error + error
     730    allocate(cpl_fder(knon,2), stat = error); sum_error = sum_error + error
     731    allocate(cpl_albe(knon,2), stat = error); sum_error = sum_error + error
     732    allocate(cpl_taux(knon,2), stat = error); sum_error = sum_error + error
     733    allocate(cpl_tauy(knon,2), stat = error); sum_error = sum_error + error
     734    allocate(cpl_rcoa(knon,2), stat = error); sum_error = sum_error + error
     735    allocate(cpl_rriv(knon,2), stat = error); sum_error = sum_error + error
     736    allocate(read_sst(iim, jjm+1), stat = error); sum_error = sum_error + error
     737    allocate(read_sic(iim, jjm+1), stat = error); sum_error = sum_error + error
     738    allocate(read_sit(iim, jjm+1), stat = error); sum_error = sum_error + error
     739    allocate(read_sit(iim, jjm+1), stat = error); sum_error = sum_error + error
     740    allocate(read_alb_sic(iim, jjm+1), stat = error); sum_error = sum_error + error
     741
    692742    if (sum_error /= 0) then
    693743      abort_message='Pb allocation variables couplees'
    694744      call abort_gcm(modname,abort_message,1)
    695745    endif
    696     cpl_sols = 0.
    697     cpl_nsol = 0.
    698     cpl_rain = 0.
    699     cpl_snow = 0.
    700     cpl_evap = 0.
    701     cpl_tsol = 0.
    702     cpl_fder = 0.
    703     cpl_albe = 0.
    704     cpl_taux = 0.
    705     cpl_tauy = 0.
    706     cpl_ruis = 0.
     746    cpl_sols = 0.; cpl_nsol = 0.; cpl_rain = 0.; cpl_snow = 0.
     747    cpl_evap = 0.; cpl_tsol = 0.; cpl_fder = 0.; cpl_albe = 0.
     748    cpl_taux = 0.; cpl_tauy = 0.; cpl_rriv = 0.; cpl_rcoa = 0.
     749
     750    sum_error = 0
     751    allocate(tamp_ind(klon), stat = error); sum_error = sum_error + error
     752    allocate(tamp_zmasq(iim, jjm+1), stat = error); sum_error = sum_error + error   
     753    do ig = 1, klon
     754      tamp_ind(ig) = ig
     755    enddo
     756    call gath2cpl(zmasq, tamp_zmasq, klon, klon, iim, jjm, tamp_ind)
    707757!
    708758! initialisation couplage
     
    712762! 1ere lecture champs ocean
    713763!
    714     call fromcpl(itime,(jjm+1)*iim,                                          &
    715      &        read_sst, read_sic, read_alb_sst, read_alb_sic)
     764    if (nisurf == is_oce) then
     765      call fromcpl(itime,(jjm+1)*iim,                                  &
     766     &        read_sst, read_sic, read_sit, read_alb_sic)
     767!
     768! je voulais utiliser des where mais ca ne voulait pas compiler dans un
     769! if construct sur sun
     770!
     771      do j = 1, jjm + 1
     772        do ig = 1, iim
     773          if (abs(1. - read_sic(ig,j)) < 0.00001) then
     774            read_sst(ig,j) = RTT - 1.8
     775            read_sit(ig,j) = read_sit(ig,j) / read_sic(ig,j)
     776            read_alb_sic(ig,j) = read_alb_sic(ig,j) / read_sic(ig,j)
     777          else if (abs(read_sic(ig,j)) < 0.00001) then
     778            read_sst(ig,j) = read_sst(ig,j) / (1. - read_sic(ig,j))
     779            read_sit(ig,j) = read_sst(ig,j)
     780            read_alb_sic(ig,j) =  0.6
     781          else
     782            read_sst(ig,j) = read_sst(ig,j) / (1. - read_sic(ig,j))
     783            read_sit(ig,j) = read_sit(ig,j) / read_sic(ig,j)
     784            read_alb_sic(ig,j) = read_alb_sic(ig,j) / read_sic(ig,j)
     785          endif
     786        enddo
     787      enddo
     788    endif
     789
     790  endif ! fin if (debut)
     791
     792! fichier restart et fichiers histoires
     793
     794! calcul des fluxs a passer
     795
     796  cpl_sols(:,nisurf) = cpl_sols(:,nisurf) + swdown      / FLOAT(nexca)
     797  cpl_nsol(:,nisurf) = cpl_nsol(:,nisurf) + lwdown      / FLOAT(nexca)
     798  cpl_rain(:,nisurf) = cpl_rain(:,nisurf) + precip_rain / FLOAT(nexca)
     799  cpl_snow(:,nisurf) = cpl_snow(:,nisurf) + precip_snow / FLOAT(nexca)
     800  cpl_evap(:,nisurf) = cpl_evap(:,nisurf) + evap        / FLOAT(nexca)
     801  cpl_tsol(:,nisurf) = cpl_tsol(:,nisurf) + tsurf       / FLOAT(nexca)
     802  cpl_fder(:,nisurf) = cpl_fder(:,nisurf) + fder        / FLOAT(nexca)
     803  cpl_albe(:,nisurf) = cpl_albe(:,nisurf) + albsol      / FLOAT(nexca)
     804  cpl_taux(:,nisurf) = cpl_taux(:,nisurf) + taux        / FLOAT(nexca)
     805  cpl_tauy(:,nisurf) = cpl_tauy(:,nisurf) + tauy        / FLOAT(nexca)
     806  cpl_rriv(:,nisurf) = cpl_rriv(:,nisurf) + run_off     / FLOAT(nexca)/dtime
     807  cpl_rcoa(:,nisurf) = cpl_rcoa(:,nisurf) + run_off     / FLOAT(nexca)/dtime
     808
     809  if (mod(itime, nexca) == 0) then
     810!
     811! Mise sur la bonne grille des champs a passer au coupleur
     812!
     813! allocation memoire
     814    sum_error = 0
     815    allocate(tmp_sols(iim,jjm+1,2), stat=error); sum_error = sum_error + error
     816    allocate(tmp_nsol(iim,jjm+1,2), stat=error); sum_error = sum_error + error
     817    allocate(tmp_rain(iim,jjm+1,2), stat=error); sum_error = sum_error + error
     818    allocate(tmp_snow(iim,jjm+1,2), stat=error); sum_error = sum_error + error
     819    allocate(tmp_evap(iim,jjm+1,2), stat=error); sum_error = sum_error + error
     820    allocate(tmp_tsol(iim,jjm+1,2), stat=error); sum_error = sum_error + error
     821    allocate(tmp_fder(iim,jjm+1,2), stat=error); sum_error = sum_error + error
     822    allocate(tmp_albe(iim,jjm+1,2), stat=error); sum_error = sum_error + error
     823    allocate(tmp_taux(iim,jjm+1,2), stat=error); sum_error = sum_error + error
     824    allocate(tmp_tauy(iim,jjm+1,2), stat=error); sum_error = sum_error + error
     825    allocate(tmp_rriv(iim,jjm+1,2), stat=error); sum_error = sum_error + error
     826    allocate(tmp_rcoa(iim,jjm+1,2), stat=error); sum_error = sum_error + error
     827    if (sum_error /= 0) then
     828      abort_message='Pb allocation variables couplees'
     829      call abort_gcm(modname,abort_message,1)
     830    endif
     831
     832    call gath2cpl(cpl_sols(1,nisurf), tmp_sols(1,1,nisurf), klon, knon,iim,jjm, knindex)
     833    call gath2cpl(cpl_nsol(1,nisurf), tmp_nsol(1,1,nisurf), klon, knon,iim,jjm, knindex)
     834    call gath2cpl(cpl_rain(1,nisurf), tmp_rain(1,1,nisurf), klon, knon,iim,jjm, knindex)
     835    call gath2cpl(cpl_snow(1,nisurf), tmp_snow(1,1,nisurf), klon, knon,iim,jjm, knindex)
     836    call gath2cpl(cpl_evap(1,nisurf), tmp_evap(1,1,nisurf), klon, knon,iim,jjm, knindex)
     837    call gath2cpl(cpl_tsol(1,nisurf), tmp_tsol(1,1,nisurf), klon, knon,iim,jjm, knindex)
     838    call gath2cpl(cpl_fder(1,nisurf), tmp_fder(1,1,nisurf), klon, knon,iim,jjm, knindex)
     839    call gath2cpl(cpl_albe(1,nisurf), tmp_albe(1,1,nisurf), klon, knon,iim,jjm, knindex)
     840    call gath2cpl(cpl_taux(1,nisurf), tmp_taux(1,1,nisurf), klon, knon,iim,jjm, knindex)
     841    call gath2cpl(cpl_tauy(1,nisurf), tmp_tauy(1,1,nisurf), klon, knon,iim,jjm, knindex)
     842    call gath2cpl(cpl_rriv(1,nisurf), tmp_rriv(1,1,nisurf), klon, knon,iim,jjm, knindex)
     843    call gath2cpl(cpl_rcoa(1,nisurf), tmp_rcoa(1,1,nisurf), klon, knon,iim,jjm, knindex)
     844!
     845! Passage des champs au/du coupleur
     846!
     847! Si le domaine considere est l'ocean, on lit les champs venant du coupleur
     848!
     849    if (nisurf == is_oce) then
     850      call fromcpl(itime,(jjm+1)*iim,                                  &
     851     &        read_sst, read_sic, read_sit, read_alb_sic)
     852      do j = 1, jjm + 1
     853        do ig = 1, iim
     854          if (abs(1. - read_sic(ig,j)) < 0.00001) then
     855            read_sst(ig,j) = RTT - 1.8
     856            read_sit(ig,j) = read_sit(ig,j) / read_sic(ig,j)
     857            read_alb_sic(ig,j) = read_alb_sic(ig,j) / read_sic(ig,j)
     858          else if (abs(read_sic(ig,j)) < 0.00001) then
     859            read_sst(ig,j) = read_sst(ig,j) / (1. - read_sic(ig,j))
     860            read_sit(ig,j) = read_sst(ig,j)
     861            read_alb_sic(ig,j) =  0.6
     862          else
     863            read_sst(ig,j) = read_sst(ig,j) / (1. - read_sic(ig,j))
     864            read_sit(ig,j) = read_sit(ig,j) / read_sic(ig,j)
     865            read_alb_sic(ig,j) = read_alb_sic(ig,j) / read_sic(ig,j)
     866          endif
     867        enddo
     868      enddo
     869    endif
     870!
     871! Si le domaine considere est la banquise, on envoie les champs au coupleur
     872!
     873    if (nisurf == is_sic) then
     874      wri_rain = 0.; wri_snow = 0.; wri_rcoa = 0.; wri_rriv = 0.
     875      wri_taux = 0.; wri_tauy = 0.
     876      call gath2cpl(pctsrf(1,is_oce), tamp_srf(1,1,1), klon, klon, iim, jjm, tamp_ind)
     877      call gath2cpl(pctsrf(1,is_sic), tamp_srf(1,1,2), klon, klon, iim, jjm, tamp_ind)
     878
     879      wri_sol_ice = tmp_sols(:,:,2)
     880      wri_sol_sea = tmp_sols(:,:,1)
     881      wri_nsol_ice = tmp_nsol(:,:,2)
     882      wri_nsol_sea = tmp_nsol(:,:,1)
     883      wri_fder_ice = tmp_fder(:,:,2)
     884      wri_evap_ice = tmp_evap(:,:,2)
     885      wri_evap_sea = tmp_evap(:,:,1)
     886      where (tamp_zmasq /= 1.)
     887        deno =  tamp_srf(:,:,1) + tamp_srf(:,:,2)
     888        wri_rain = tmp_rain(:,:,1) * tamp_srf(:,:,1) / deno +    &
     889      &            tmp_rain(:,:,2) * tamp_srf(:,:,2) / deno
     890        wri_snow = tmp_snow(:,:,1) * tamp_srf(:,:,1) / deno +    &
     891      &            tmp_snow(:,:,2) * tamp_srf(:,:,2) / deno
     892        wri_rriv = tmp_rriv(:,:,1) * tamp_srf(:,:,1) / deno +    &
     893      &            tmp_rriv(:,:,2) * tamp_srf(:,:,2) / deno
     894        wri_rcoa = tmp_rcoa(:,:,1) * tamp_srf(:,:,1) / deno +    &
     895      &            tmp_rcoa(:,:,2) * tamp_srf(:,:,2) / deno
     896        wri_taux = tmp_taux(:,:,1) * tamp_srf(:,:,1) / deno +    &
     897      &            tmp_taux(:,:,2) * tamp_srf(:,:,2) / deno
     898        wri_tauy = tmp_tauy(:,:,1) * tamp_srf(:,:,1) / deno +    &
     899      &            tmp_tauy(:,:,2) * tamp_srf(:,:,2) / deno
     900      endwhere
     901
     902      call intocpl(itime, (jjm+1)*iim, wri_sol_ice, wri_sol_sea, wri_nsol_ice,&
     903      & wri_nsol_sea, wri_fder_ice, wri_evap_ice, wri_evap_sea, wri_rain, &
     904      & wri_snow, wri_rcoa, wri_rriv, wri_taux, wri_tauy, wri_taux, wri_tauy, &
     905      & lafin )
     906      cpl_sols = 0.; cpl_nsol = 0.; cpl_rain = 0.; cpl_snow = 0.
     907      cpl_evap = 0.; cpl_tsol = 0.; cpl_fder = 0.; cpl_albe = 0.
     908      cpl_taux = 0.; cpl_tauy = 0.; cpl_rriv = 0.; cpl_rcoa = 0.
     909!
     910! deallocation memoire variables temporaires
     911!
     912      sum_error = 0
     913      deallocate(tmp_sols, stat=error); sum_error = sum_error + error
     914      deallocate(tmp_nsol, stat=error); sum_error = sum_error + error
     915      deallocate(tmp_rain, stat=error); sum_error = sum_error + error
     916      deallocate(tmp_snow, stat=error); sum_error = sum_error + error
     917      deallocate(tmp_evap, stat=error); sum_error = sum_error + error
     918      deallocate(tmp_fder, stat=error); sum_error = sum_error + error
     919      deallocate(tmp_tsol, stat=error); sum_error = sum_error + error
     920      deallocate(tmp_albe, stat=error); sum_error = sum_error + error
     921      deallocate(tmp_taux, stat=error); sum_error = sum_error + error
     922      deallocate(tmp_tauy, stat=error); sum_error = sum_error + error
     923      deallocate(tmp_rriv, stat=error); sum_error = sum_error + error
     924      deallocate(tmp_rcoa, stat=error); sum_error = sum_error + error
     925      if (sum_error /= 0) then
     926        abort_message='Pb deallocation variables couplees'
     927        call abort_gcm(modname,abort_message,1)
     928      endif
     929
     930    endif
     931
     932  endif            ! fin nexca
     933!
     934! on range les variables lues/sauvegardees dans les bonnes variables de sortie
     935!
     936  if (nisurf == is_oce) then
    716937    call cpl2gath(read_sst, tsurf_new, klon, knon,iim,jjm, knindex)
    717938    call cpl2gath(read_sic, tamp_sic , klon, knon,iim,jjm, knindex)
    718     call cpl2gath(read_alb_sst, alb_new, klon, knon,iim,jjm, knindex)
    719     call cpl2gath(read_alb_sic, alb_ice, klon, knon,iim,jjm, knindex)
    720939!
    721940! transformer tamp_sic en pctsrf_new
     
    729948      endif
    730949    enddo
    731 
    732   endif ! fin if (debut)
    733 
    734 ! fichier restart et fichiers histoires
    735 
    736 ! calcul des fluxs a passer
    737 
    738   cpl_sols = cpl_sols + swdown      / FLOAT(nexca)
    739   cpl_nsol = cpl_nsol + lwdown      / FLOAT(nexca)
    740   cpl_rain = cpl_rain + precip_rain / FLOAT(nexca)
    741   cpl_snow = cpl_snow + precip_snow / FLOAT(nexca)
    742   cpl_evap = cpl_evap + evap        / FLOAT(nexca)
    743   cpl_tsol = cpl_tsol + tsurf       / FLOAT(nexca)
    744   cpl_fder = cpl_fder + fder        / FLOAT(nexca)
    745   cpl_albe = cpl_albe + albsol      / FLOAT(nexca)
    746   cpl_taux = cpl_taux + taux        / FLOAT(nexca)
    747   cpl_tauy = cpl_tauy + tauy        / FLOAT(nexca)
    748   cpl_ruis = cpl_ruis + run_off     / FLOAT(nexca)/dtime
    749 
    750   if (mod(itime, nexca) == 0) then
    751 !
    752 ! Mise sur la bonne grille des champs a passer au coupleur
    753     call gath2cpl(cpl_sols, wri_sols, klon, knon,iim,jjm, knindex)
    754     call gath2cpl(cpl_nsol, wri_nsol, klon, knon,iim,jjm, knindex)
    755     call gath2cpl(cpl_rain, wri_rain, klon, knon,iim,jjm, knindex)
    756     call gath2cpl(cpl_snow, wri_snow, klon, knon,iim,jjm, knindex)
    757     call gath2cpl(cpl_evap, wri_evap, klon, knon,iim,jjm, knindex)
    758     call gath2cpl(cpl_tsol, wri_tsol, klon, knon,iim,jjm, knindex)
    759     call gath2cpl(cpl_fder, wri_fder, klon, knon,iim,jjm, knindex)
    760     call gath2cpl(cpl_albe, wri_albe, klon, knon,iim,jjm, knindex)
    761     call gath2cpl(cpl_taux, wri_taux, klon, knon,iim,jjm, knindex)
    762     call gath2cpl(cpl_tauy, wri_tauy, klon, knon,iim,jjm, knindex)
    763     call gath2cpl(cpl_ruis, wri_ruis, klon, knon,iim,jjm, knindex)
    764 !
    765 ! Passage des champs au coupleur
    766 !
    767     call intocpl(itime, iim, jjm , wri_sols, wri_nsol, wri_rain, wri_snow, &
    768       & wri_evap, wri_tsol, wri_fder, wri_albe, wri_taux, wri_tauy,       &
    769       & wri_ruis )
    770     cpl_sols = 0.
    771     cpl_nsol = 0.
    772     cpl_rain = 0.
    773     cpl_snow = 0.
    774     cpl_evap = 0.
    775     cpl_tsol = 0.
    776     cpl_fder = 0.
    777     cpl_albe = 0.
    778     cpl_taux = 0.
    779     cpl_tauy = 0.
    780     cpl_ruis = 0.
    781 
    782     call fromcpl(itime,(jjm+1)*iim,                                          &
    783      &        read_sst, read_sic, read_alb_sst, read_alb_sic)
    784     call cpl2gath(read_sst, tsurf_new, klon, knon,iim,jjm, knindex)
    785     call cpl2gath(read_sic, tamp_sic , klon, knon,iim,jjm, knindex)
    786     call cpl2gath(read_alb_sst, alb_new, klon, knon,iim,jjm, knindex)
    787     call cpl2gath(read_alb_sic, alb_ice, klon, knon,iim,jjm, knindex)
    788 ! transformer tamp_sic en pctsrf_new
    789 
    790     do ig = 1, klon
    791       IF (pctsrf(ig,is_oce) > epsfra .OR.            &
    792      &             pctsrf(ig,is_sic) > epsfra) THEN
    793             pctsrf_new(ig,is_oce) = pctsrf(ig,is_oce)    &
    794      &                        - (tamp_sic(ig)-pctsrf(ig,is_sic))
    795             pctsrf_new(ig,is_sic) = tamp_sic(ig)
    796       endif
    797     enddo
     950  else if (nisurf == is_sic) then
     951      call cpl2gath(read_sit, tsurf_new, klon, knon,iim,jjm, knindex)
     952      call cpl2gath(read_alb_sic, alb_new, klon, knon,iim,jjm, knindex)
    798953  endif
    799954
     
    12781433!
    12791434    fonte_neige = (nisurf /= is_oce) .AND. &
    1280      & (snow(i) > 0. .OR. nisurf == is_sic .OR. nisurf == is_lic) &
     1435     & (snow(i) > epsfra .OR. nisurf == is_sic .OR. nisurf == is_lic) &
    12811436     & .AND. (tsurf_new(i) >= RTT)
    12821437    if (fonte_neige) tsurf_new(i) = RTT 
     
    14531608  real, dimension(klon)     :: tamp
    14541609
     1610  tamp = 0.
    14551611  do i = 1, knon
    14561612    ig = knindex(i)
Note: See TracChangeset for help on using the changeset viewer.