source: LMDZ6/trunk/libf/phylmd/phyetat0.F90 @ 3449

Last change on this file since 3449 was 3449, checked in by oboucher, 5 years ago

changed hard coded CO2 molar mass to corresponding variable
and capitalize all of: if endif or and

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