source: LMDZ5/trunk/libf/phylmd/phyetat0.F90 @ 2404

Last change on this file since 2404 was 2399, checked in by Ehouarn Millour, 9 years ago

Follow-up from commit 2395: get rid of rlon and rlat, longitude_deg and latitude_deg (from module geometry_mod) should be used instead. Longitudes and latitudes are no longer loaded from startphy.nc but inherited from dynamics (and compatibility with values in startphy.nc is checked). This will change bench results because of roundoffs differences between the two.
EM

  • Property copyright set to
    Name of program: LMDZ
    Creation date: 1984
    Version: LMDZ5
    License: CeCILL version 2
    Holder: Laboratoire de m\'et\'eorologie dynamique, CNRS, UMR 8539
    See the license file in the root directory
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 18.7 KB
RevLine 
[1403]1! $Id: phyetat0.F90 2399 2015-11-20 16:23:28Z fhourdin $
[782]2
[1827]3SUBROUTINE phyetat0 (fichnom, clesphy0, tabcntr0)
[1279]4
[2057]5  USE dimphy, only: klon, zmasq, klev, nslay
[1938]6  USE iophy, ONLY : init_iophy_new
[1827]7  USE ocean_cpl_mod,    ONLY : ocean_cpl_init
8  USE fonte_neige_mod,  ONLY : fonte_neige_init
9  USE pbl_surface_mod,  ONLY : pbl_surface_init
[2209]10  USE surface_data,     ONLY : type_ocean, version_ocean
[1938]11  USE phys_state_var_mod, ONLY : ancien_ok, clwcon, detr_therm, dtime, &
[2243]12       qsol, fevap, z0m, z0h, agesno, &
[2333]13       du_gwd_rando, du_gwd_front, entr_therm, f0, fm_therm, &
[2237]14       falb_dir, falb_dif, &
[1938]15       ftsol, pbl_tke, pctsrf, q_ancien, radpas, radsol, rain_fall, ratqs, &
[2399]16       rnebcon, rugoro, sig1, snow_fall, solaire_etat0, sollw, sollwdown, &
[1938]17       solsw, t_ancien, u_ancien, v_ancien, w01, wake_cstar, wake_deltaq, &
[2159]18       wake_deltat, wake_delta_pbl_TKE, delta_tsurf, wake_fip, wake_pe, &
19       wake_s, zgam, &
20       zmax0, zmea, zpic, zsig, &
[2069]21       zstd, zthe, zval, ale_bl, ale_bl_trig, alp_bl
[2399]22  USE geometry_mod, ONLY : longitude_deg, latitude_deg
[1938]23  USE iostart, ONLY : close_startphy, get_field, get_var, open_startphy
[2320]24  USE infotrac_phy, only: nbtr, nqo, type_trac, tname, niadv
[1827]25  USE traclmdz_mod,    ONLY : traclmdz_from_restart
26  USE carbon_cycle_mod, ONLY : carbon_cycle_tr, carbon_cycle_cpl, co2_send
[1938]27  USE indice_sol_mod, only: nbsrf, is_ter, epsfra, is_lic, is_oce, is_sic
[2209]28  USE ocean_slab_mod, ONLY: tslab, seaice, tice, ocean_slab_init
[2344]29  USE time_phylmdz_mod, ONLY: init_iteration, pdtphys, itau_phy
[967]30
[1827]31  IMPLICIT none
32  !======================================================================
33  ! Auteur(s) Z.X. Li (LMD/CNRS) date: 19930818
34  ! Objet: Lecture de l'etat initial pour la physique
35  !======================================================================
36  include "netcdf.inc"
37  include "dimsoil.h"
38  include "clesphys.h"
39  include "thermcell.h"
40  include "compbl.h"
[2188]41  include "YOMCST.h"
[1827]42  !======================================================================
43  CHARACTER*(*) fichnom
[524]44
[1827]45  ! les variables globales lues dans le fichier restart
[1001]46
[1827]47  REAL tsoil(klon, nsoilmx, nbsrf)
48  REAL qsurf(klon, nbsrf)
49  REAL snow(klon, nbsrf)
50  real fder(klon)
51  REAL run_off_lic_0(klon)
52  REAL fractint(klon)
53  REAL trs(klon, nbtr)
[2188]54  REAL zts(klon)
[651]55
[1827]56  CHARACTER*6 ocean_in
57  LOGICAL ok_veget_in
[879]58
[1827]59  INTEGER        longcles
60  PARAMETER    ( longcles = 20 )
61  REAL clesphy0( longcles )
[766]62
[1827]63  REAL xmin, xmax
[766]64
[1827]65  INTEGER nid, nvarid
66  INTEGER ierr, i, nsrf, isoil , k
67  INTEGER length
68  PARAMETER (length=100)
[2237]69  INTEGER it, iiq, isw
[1827]70  REAL tab_cntrl(length), tabcntr0(length)
71  CHARACTER*7 str7
72  CHARACTER*2 str2
[2243]73  LOGICAL :: found,phyetat0_get,phyetat0_srf
[2399]74  REAL :: lon_startphy(klon), lat_startphy(klon)
[1827]75
76  ! FH1D
77  !     real iolat(jjm+1)
[2344]78  !real iolat(jjm+1-1/(iim*jjm))
[1827]79
80  ! Ouvrir le fichier contenant l'etat initial:
81
82  CALL open_startphy(fichnom)
83
84  ! Lecture des parametres de controle:
85
86  CALL get_var("controle", tab_cntrl)
87
[956]88!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
[1827]89  ! FH 2008/05/09 On elimine toutes les clefs physiques dans la dynamique
90  ! Les constantes de la physiques sont lues dans la physique seulement.
91  ! Les egalites du type
92  !             tab_cntrl( 5 )=clesphy0(1)
93  ! sont remplacees par
94  !             clesphy0(1)=tab_cntrl( 5 )
95  ! On inverse aussi la logique.
96  ! On remplit les tab_cntrl avec les parametres lus dans les .def
[956]97!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
98
[1827]99  DO i = 1, length
100     tabcntr0( i ) = tab_cntrl( i )
101  ENDDO
[1279]102
[2344]103  tab_cntrl(1)=pdtphys
[1827]104  tab_cntrl(2)=radpas
[1279]105
[1827]106  ! co2_ppm : value from the previous time step
107  IF (carbon_cycle_tr .OR. carbon_cycle_cpl) THEN
108     co2_ppm = tab_cntrl(3)
109     RCO2    = co2_ppm * 1.0e-06  * 44.011/28.97
110     ! ELSE : keep value from .def
111  END IF
[1279]112
[1827]113  ! co2_ppm0 : initial value of atmospheric CO2 (from create_etat0_limit.e .def)
114  co2_ppm0   = tab_cntrl(16)
[524]115
[1827]116  solaire_etat0      = tab_cntrl(4)
117  tab_cntrl(5)=iflag_con
118  tab_cntrl(6)=nbapp_rad
[524]119
[1827]120  if (cycle_diurne) tab_cntrl( 7) =1.
121  if (soil_model) tab_cntrl( 8) =1.
122  if (new_oliq) tab_cntrl( 9) =1.
123  if (ok_orodr) tab_cntrl(10) =1.
124  if (ok_orolf) tab_cntrl(11) =1.
125  if (ok_limitvrai) tab_cntrl(12) =1.
[956]126
[1827]127  itau_phy = tab_cntrl(15)
[956]128
[1827]129  clesphy0(1)=tab_cntrl( 5 )
130  clesphy0(2)=tab_cntrl( 6 )
131  clesphy0(3)=tab_cntrl( 7 )
132  clesphy0(4)=tab_cntrl( 8 )
133  clesphy0(5)=tab_cntrl( 9 )
134  clesphy0(6)=tab_cntrl( 10 )
135  clesphy0(7)=tab_cntrl( 11 )
136  clesphy0(8)=tab_cntrl( 12 )
[956]137
[2344]138  ! set time iteration
139   CALL init_iteration(itau_phy)
140
[2399]141  ! read latitudes and make a sanity check (because already known from dyn)
142  CALL get_field("latitude",lat_startphy)
143  DO i=1,klon
144    IF (ABS(lat_startphy(i)-latitude_deg(i))>=1) THEN
145      WRITE(*,*) "phyetat0: Error! Latitude discrepancy wrt startphy file:",&
146                 " i=",i," lat_startphy(i)=",lat_startphy(i),&
147                 " latitude_deg(i)=",latitude_deg(i)
148      ! This is presumably serious enough to abort run
149      CALL abort_physic("phyetat0","discrepancy in latitudes!",1)
150    ENDIF
151    IF (ABS(lat_startphy(i)-latitude_deg(i))>=0.0001) THEN
152      WRITE(*,*) "phyetat0: Warning! Latitude discrepancy wrt startphy file:",&
153                 " i=",i," lat_startphy(i)=",lat_startphy(i),&
154                 " latitude_deg(i)=",latitude_deg(i)
155    ENDIF
156  ENDDO
[766]157
[2399]158  ! read longitudes and make a sanity check (because already known from dyn)
159  CALL get_field("longitude",lon_startphy)
160  DO i=1,klon
161    IF (ABS(lon_startphy(i)-longitude_deg(i))>=1) THEN
162      WRITE(*,*) "phyetat0: Error! Longitude discrepancy wrt startphy file:",&
163                 " i=",i," lon_startphy(i)=",lon_startphy(i),&
164                 " longitude_deg(i)=",longitude_deg(i)
165      ! This is presumably serious enough to abort run
166      CALL abort_physic("phyetat0","discrepancy in longitudes!",1)
167    ENDIF
168    IF (ABS(lon_startphy(i)-longitude_deg(i))>=0.0001) THEN
169      WRITE(*,*) "phyetat0: Warning! Longitude discrepancy wrt startphy file:",&
170                 " i=",i," lon_startphy(i)=",lon_startphy(i),&
171                 " longitude_deg(i)=",longitude_deg(i)
172    ENDIF
173  ENDDO
[1001]174
[1827]175  ! Lecture du masque terre mer
[766]176
[1827]177  CALL get_field("masque", zmasq, found)
178  IF (.NOT. found) THEN
179     PRINT*, 'phyetat0: Le champ <masque> est absent'
180     PRINT *, 'fichier startphy non compatible avec phyetat0'
181  ENDIF
[1001]182
[1827]183  ! Lecture des fractions pour chaque sous-surface
[766]184
[1827]185  ! initialisation des sous-surfaces
[766]186
[1827]187  pctsrf = 0.
[766]188
[1827]189  ! fraction de terre
[766]190
[1827]191  CALL get_field("FTER", pctsrf(:, is_ter), found)
192  IF (.NOT. found) PRINT*, 'phyetat0: Le champ <FTER> est absent'
[766]193
[1827]194  ! fraction de glace de terre
[766]195
[1827]196  CALL get_field("FLIC", pctsrf(:, is_lic), found)
197  IF (.NOT. found) PRINT*, 'phyetat0: Le champ <FLIC> est absent'
[1001]198
[1827]199  ! fraction d'ocean
[1001]200
[1827]201  CALL get_field("FOCE", pctsrf(:, is_oce), found)
202  IF (.NOT. found) PRINT*, 'phyetat0: Le champ <FOCE> est absent'
[1001]203
[1827]204  ! fraction glace de mer
[1001]205
[1827]206  CALL get_field("FSIC", pctsrf(:, is_sic), found)
207  IF (.NOT. found) PRINT*, 'phyetat0: Le champ <FSIC> est absent'
[1001]208
[1827]209  !  Verification de l'adequation entre le masque et les sous-surfaces
210
211  fractint( 1 : klon) = pctsrf(1 : klon, is_ter)  &
212       + pctsrf(1 : klon, is_lic)
213  DO i = 1 , klon
214     IF ( abs(fractint(i) - zmasq(i) ) .GT. EPSFRA ) THEN
215        WRITE(*, *) 'phyetat0: attention fraction terre pas ',  &
216             'coherente ', i, zmasq(i), pctsrf(i, is_ter) &
217             , pctsrf(i, is_lic)
218        WRITE(*, *) 'Je force la coherence zmasq=fractint'
219        zmasq(i) = fractint(i)
220     ENDIF
221  END DO
222  fractint (1 : klon) =  pctsrf(1 : klon, is_oce)  &
223       + pctsrf(1 : klon, is_sic)
224  DO i = 1 , klon
225     IF ( abs( fractint(i) - (1. - zmasq(i))) .GT. EPSFRA ) THEN
226        WRITE(*, *) 'phyetat0 attention fraction ocean pas ',  &
227             'coherente ', i, zmasq(i) , pctsrf(i, is_oce) &
228             , pctsrf(i, is_sic)
[2053]229        WRITE(*, *) 'Je force la coherence zmasq=1.-fractint'
[2052]230        zmasq(i) = 1. - fractint(i)
[1827]231     ENDIF
232  END DO
233
[2252]234!===================================================================
235! Lecture des temperatures du sol:
236!===================================================================
[1827]237
[2252]238  found=phyetat0_get(1,ftsol(:,1),"TS","Surface temperature",283.)
239  IF (found) THEN
240     DO nsrf=2,nbsrf
241        ftsol(:,nsrf)=ftsol(:,1)
[1827]242     ENDDO
243  ELSE
[2252]244     found=phyetat0_srf(1,ftsol,"TS","Surface temperature",283.)
[1827]245  ENDIF
[524]246
[2237]247!===================================================================
248  ! Lecture des albedo difus et direct
[2252]249!===================================================================
[2237]250
251  DO nsrf = 1, nbsrf
252     DO isw=1, nsw
[2252]253        IF (isw.GT.99) THEN
254           PRINT*, "Trop de bandes SW"
[2311]255           call abort_physic("phyetat0", "", 1)
[2237]256        ENDIF
[2252]257        WRITE(str2, '(i2.2)') isw
258        found=phyetat0_srf(1,falb_dir(:, isw,:),"A_dir_SW"//str2//"srf","Direct Albedo",0.2)
259        found=phyetat0_srf(1,falb_dif(:, isw,:),"A_dif_SW"//str2//"srf","Direct Albedo",0.2)
[2237]260     ENDDO
261  ENDDO
262
263!===================================================================
[1827]264  ! Lecture des temperatures du sol profond:
[2252]265!===================================================================
[524]266
[2252]267   DO isoil=1, nsoilmx
268        IF (isoil.GT.99) THEN
269           PRINT*, "Trop de couches "
[2311]270           call abort_physic("phyetat0", "", 1)
[1827]271        ENDIF
[2252]272        WRITE(str2,'(i2.2)') isoil
273        found=phyetat0_srf(1,tsoil(:, isoil,:),"Tsoil"//str2//"srf","Temp soil",0.)
[1827]274        IF (.NOT. found) THEN
275           PRINT*, "phyetat0: Le champ <Tsoil"//str7//"> est absent"
276           PRINT*, "          Il prend donc la valeur de surface"
[2252]277           tsoil(:, isoil, :)=ftsol(:, :)
[1827]278        ENDIF
[2252]279   ENDDO
[524]280
[2252]281!=======================================================================
282! Lecture precipitation/evaporation
283!=======================================================================
[1001]284
[2252]285  found=phyetat0_srf(1,qsurf,"QS","Near surface hmidity",0.)
286  found=phyetat0_get(1,qsol,"QSOL","Surface hmidity / bucket",0.)
287  found=phyetat0_srf(1,snow,"SNOW","Surface snow",0.)
288  found=phyetat0_srf(1,fevap,"EVAP","evaporation",0.)
289  found=phyetat0_get(1,snow_fall,"snow_f","snow fall",0.)
290  found=phyetat0_get(1,rain_fall,"rain_f","rain fall",0.)
[1001]291
[2252]292!=======================================================================
293! Radiation
294!=======================================================================
[1001]295
[2252]296  found=phyetat0_get(1,solsw,"solsw","net SW radiation surf",0.)
297  found=phyetat0_get(1,sollw,"sollw","net LW radiation surf",0.)
298  found=phyetat0_get(1,sollwdown,"sollwdown","down LW radiation surf",0.)
[1827]299  IF (.NOT. found) THEN
[2252]300     sollwdown = 0. ;  zts=0.
[2188]301     do nsrf=1,nbsrf
302        zts(:)=zts(:)+ftsol(:,nsrf)*pctsrf(:,nsrf)
303     enddo
304     sollwdown(:)=sollw(:)+RSIGMA*zts(:)**4
305  ENDIF
306
[2252]307  found=phyetat0_get(1,radsol,"RADS","Solar radiation",0.)
308  found=phyetat0_get(1,fder,"fder","Flux derivative",0.)
[2188]309
[1827]310
311  ! Lecture de la longueur de rugosite
[2243]312  found=phyetat0_srf(1,z0m,"RUG","Z0m ancien",0.001)
313  IF (found) THEN
314     z0h(:,1:nbsrf)=z0m(:,1:nbsrf)
[1827]315  ELSE
[2243]316     found=phyetat0_srf(1,z0m,"Z0m","Roughness length, momentum ",0.001)
317     found=phyetat0_srf(1,z0h,"Z0h","Roughness length, enthalpy ",0.001)
[1827]318  ENDIF
319
320  ! Lecture de l'age de la neige:
[2252]321  found=phyetat0_srf(1,agesno,"AGESNO","SNOW AGE",0.001)
[1827]322
[2252]323  ancien_ok=.true.
324  ancien_ok=ancien_ok.AND.phyetat0_get(klev,t_ancien,"TANCIEN","TANCIEN",0.)
325  ancien_ok=ancien_ok.AND.phyetat0_get(klev,q_ancien,"QANCIEN","QANCIEN",0.)
326  ancien_ok=ancien_ok.AND.phyetat0_get(klev,u_ancien,"UANCIEN","UANCIEN",0.)
327  ancien_ok=ancien_ok.AND.phyetat0_get(klev,v_ancien,"VANCIEN","VANCIEN",0.)
[1827]328
[2252]329  found=phyetat0_get(klev,clwcon,"CLWCON","CLWCON",0.)
330  found=phyetat0_get(klev,rnebcon,"RNEBCON","RNEBCON",0.)
331  found=phyetat0_get(klev,ratqs,"RATQS","RATQS",0.)
[1827]332
[2252]333  found=phyetat0_get(1,run_off_lic_0,"RUNOFFLIC0","RUNOFFLIC0",0.)
[1827]334
[2252]335!==================================
336!  TKE
337!==================================
338!
[1827]339  IF (iflag_pbl>1) then
[2252]340     found=phyetat0_srf(klev+1,pbl_tke,"TKE","Turb. Kinetic. Energ. ",1.e-8)
[1827]341  ENDIF
[1403]342
[2252]343  IF (iflag_pbl>1 .AND. iflag_wake>=1  .AND. iflag_pbl_split >=1 ) then
344    found=phyetat0_srf(klev+1,wake_delta_pbl_tke,"DELTATKE","Del TKE wk/env",0.)
345    found=phyetat0_srf(1,delta_tsurf,"DELTA_TSURF","Delta Ts wk/env ",0.)
[2159]346  ENDIF   !(iflag_pbl>1 .AND. iflag_wake>=1 .AND. iflag_pbl_split >=1 )
347
[2251]348!==================================
349!  thermiques, poches, convection
350!==================================
[1403]351
[2252]352! Emanuel
353  found=phyetat0_get(klev,sig1,"sig1","sig1",0.)
354  found=phyetat0_get(klev,w01,"w01","w01",0.)
[1403]355
[2252]356! Wake
[2251]357  found=phyetat0_get(klev,wake_deltat,"WAKE_DELTAT","Delta T wake/env",0.)
[2243]358  found=phyetat0_get(klev,wake_deltaq,"WAKE_DELTAQ","Delta hum. wake/env",0.)
[2252]359  found=phyetat0_get(1,wake_s,"WAKE_S","WAKE_S",0.)
360  found=phyetat0_get(1,wake_cstar,"WAKE_CSTAR","WAKE_CSTAR",0.)
361  found=phyetat0_get(1,wake_pe,"WAKE_PE","WAKE_PE",0.)
362  found=phyetat0_get(1,wake_fip,"WAKE_FIP","WAKE_FIP",0.)
[879]363
[2252]364! Thermiques
[2251]365  found=phyetat0_get(1,zmax0,"ZMAX0","ZMAX0",40.)
366  found=phyetat0_get(1,f0,"F0","F0",1.e-5)
[2252]367  found=phyetat0_get(klev+1,fm_therm,"FM_THERM","Thermals mass flux",0.)
[2251]368  found=phyetat0_get(klev,entr_therm,"ENTR_THERM","Thermals Entrain.",0.)
369  found=phyetat0_get(klev,detr_therm,"DETR_THERM","Thermals Detrain.",0.)
[782]370
[2252]371! ALE/ALP
[2251]372  found=phyetat0_get(1,ale_bl,"ALE_BL","ALE BL",0.)
373  found=phyetat0_get(1,ale_bl_trig,"ALE_BL_TRIG","ALE BL_TRIG",0.)
374  found=phyetat0_get(1,alp_bl,"ALP_BL","ALP BL",0.)
[1279]375
[2251]376!===========================================
[1827]377  ! Read and send field trs to traclmdz
[2251]378!===========================================
[1827]379
380  IF (type_trac == 'lmdz') THEN
[2265]381     DO it=1, nbtr                                                                 
382!!        iiq=niadv(it+2)                                                           ! jyg
383        iiq=niadv(it+nqo)                                                           ! jyg
[2252]384        found=phyetat0_get(1,trs(:,it),"trs_"//tname(iiq), &
385              "Surf trac"//tname(iiq),0.)
[1827]386     END DO
387     CALL traclmdz_from_restart(trs)
388
389     IF (carbon_cycle_cpl) THEN
[2252]390        ALLOCATE(co2_send(klon), stat=ierr)
[2311]391        IF (ierr /= 0) CALL abort_physic('phyetat0', 'pb allocation co2_send', 1)
[2251]392        found=phyetat0_get(1,co2_send,"co2_send","co2 send",0.)
[1827]393     END IF
394  END IF
395
[2251]396!===========================================
[2252]397!  ondes de gravite / relief
[2251]398!===========================================
399
[2252]400!  ondes de gravite non orographiques
[2333]401  if (ok_gwd_rando) found = &
402       phyetat0_get(klev,du_gwd_rando,"du_gwd_rando","du_gwd_rando",0.)
403  IF (.not. ok_hines .and. ok_gwd_rando) found &
404       = phyetat0_get(klev,du_gwd_front,"du_gwd_front","du_gwd_front",0.)
[1938]405
[2252]406!  prise en compte du relief sous-maille
407  found=phyetat0_get(1,zmea,"ZMEA","sub grid orography",0.)
408  found=phyetat0_get(1,zstd,"ZSTD","sub grid orography",0.)
409  found=phyetat0_get(1,zsig,"ZSIG","sub grid orography",0.)
410  found=phyetat0_get(1,zgam,"ZGAM","sub grid orography",0.)
411  found=phyetat0_get(1,zthe,"ZTHE","sub grid orography",0.)
412  found=phyetat0_get(1,zpic,"ZPIC","sub grid orography",0.)
413  found=phyetat0_get(1,zval,"ZVAL","sub grid orography",0.)
414  found=phyetat0_get(1,zmea,"ZMEA","sub grid orography",0.)
415  found=phyetat0_get(1,rugoro,"RUGSREL","sub grid orography",0.)
416
[2251]417!===========================================
418! Initialize ocean
419!===========================================
420
[2057]421  IF ( type_ocean == 'slab' ) THEN
[2209]422      CALL ocean_slab_init(dtime, pctsrf)
[2251]423      found=phyetat0_get(nslay,tslab,"tslab","tslab",0.)
[2057]424      IF (.NOT. found) THEN
425          PRINT*, "phyetat0: Le champ <tslab> est absent"
426          PRINT*, "Initialisation a tsol_oce"
427          DO i=1,nslay
[2209]428              tslab(:,i)=MAX(ftsol(:,is_oce),271.35)
[2057]429          END DO
430      END IF
[2251]431
[2209]432      ! Sea ice variables
[2251]433      found=phyetat0_get(1,tice,"slab_tice","slab_tice",0.)
[2209]434      IF (version_ocean == 'sicINT') THEN
435          IF (.NOT. found) THEN
436              PRINT*, "phyetat0: Le champ <tice> est absent"
437              PRINT*, "Initialisation a tsol_sic"
438                  tice(:)=ftsol(:,is_sic)
439          END IF
440          IF (.NOT. found) THEN
441              PRINT*, "phyetat0: Le champ <seaice> est absent"
442              PRINT*, "Initialisation a 0/1m suivant fraction glace"
443              seaice(:)=0.
444              WHERE (pctsrf(:,is_sic).GT.EPSFRA)
445                  seaice=917.
446              END WHERE
447          END IF
448      END IF !sea ice INT
[2057]449  END IF ! Slab       
450
[1827]451  ! on ferme le fichier
452  CALL close_startphy
453
454  ! Initialize module pbl_surface_mod
455
[2243]456  CALL pbl_surface_init(fder, snow, qsurf, tsoil)
[1827]457
458  ! Initialize module ocean_cpl_mod for the case of coupled ocean
459  IF ( type_ocean == 'couple' ) THEN
[2399]460     CALL ocean_cpl_init(dtime, longitude_deg, latitude_deg)
[1827]461  ENDIF
462
[2399]463  CALL init_iophy_new(latitude_deg, longitude_deg)
[2054]464
[1827]465  ! Initilialize module fonte_neige_mod     
466  CALL fonte_neige_init(run_off_lic_0)
467
468END SUBROUTINE phyetat0
[2243]469
470!===================================================================
471FUNCTION phyetat0_get(nlev,field,name,descr,default)
472!===================================================================
473! Lecture d'un champ avec contrôle
474! Function logique dont le resultat indique si la lecture
475! s'est bien passée
476! On donne une valeur par defaut dans le cas contraire
477!===================================================================
478
479USE iostart, ONLY : get_field
480USE dimphy, only: klon
[2311]481USE print_control_mod, ONLY: lunout
[2243]482
483IMPLICIT NONE
484
485LOGICAL phyetat0_get
486
487! arguments
488INTEGER,INTENT(IN) :: nlev
489CHARACTER*(*),INTENT(IN) :: name,descr
490REAL,INTENT(IN) :: default
491REAL,DIMENSION(klon,nlev),INTENT(INOUT) :: field
492
493! Local variables
494LOGICAL found
495
496   CALL get_field(name, field, found)
497   IF (.NOT. found) THEN
498     WRITE(lunout,*) "phyetat0: Le champ <",name,"> est absent"
499     WRITE(lunout,*) "Depart legerement fausse. Mais je continue"
500     field(:,:)=default
501   ENDIF
502   WRITE(lunout,*) name, descr, MINval(field),MAXval(field)
503   phyetat0_get=found
504
505RETURN
506END FUNCTION phyetat0_get
507
508!================================================================
509FUNCTION phyetat0_srf(nlev,field,name,descr,default)
510!===================================================================
511! Lecture d'un champ par sous-surface avec contrôle
512! Function logique dont le resultat indique si la lecture
513! s'est bien passée
514! On donne une valeur par defaut dans le cas contraire
515!===================================================================
516
517USE iostart, ONLY : get_field
518USE dimphy, only: klon
519USE indice_sol_mod, only: nbsrf
[2311]520USE print_control_mod, ONLY: lunout
[2243]521
522IMPLICIT NONE
523
524LOGICAL phyetat0_srf
525! arguments
526INTEGER,INTENT(IN) :: nlev
527CHARACTER*(*),INTENT(IN) :: name,descr
528REAL,INTENT(IN) :: default
529REAL,DIMENSION(klon,nlev,nbsrf),INTENT(INOUT) :: field
530
531! Local variables
532LOGICAL found,phyetat0_get
533INTEGER nsrf
534CHARACTER*2 str2
535 
536     IF (nbsrf.GT.99) THEN
537        WRITE(lunout,*) "Trop de sous-mailles"
[2311]538        call abort_physic("phyetat0", "", 1)
[2243]539     ENDIF
540
541     DO nsrf = 1, nbsrf
542        WRITE(str2, '(i2.2)') nsrf
543        found= phyetat0_get(nlev,field(:,:, nsrf), &
544        name//str2,descr//" srf:"//str2,default)
545     ENDDO
546
547     phyetat0_srf=found
548
549RETURN
550END FUNCTION phyetat0_srf
551
Note: See TracBrowser for help on using the repository browser.