source: LMDZ5/branches/testing/libf/phylmd/phyaqua_mod.F90 @ 2381

Last change on this file since 2381 was 2298, checked in by Laurent Fairhead, 10 years ago

Merged trunk changes -r2237:2291 into testing branch

  • 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
File size: 29.0 KB
RevLine 
[1992]1MODULE phyaqua_mod
2  ! Routines complementaires pour la physique planetaire.
3  IMPLICIT NONE
[1529]4
[1992]5CONTAINS
[1529]6
[1992]7  SUBROUTINE iniaqua(nlon, latfi, lonfi, iflag_phys)
[1529]8
[1992]9    ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
10    ! Creation d'un etat initial et de conditions aux limites
11    ! (resp startphy.nc et limit.nc) pour des configurations idealisees
12    ! du modele LMDZ dans sa version terrestre.
13    ! iflag_phys est un parametre qui controle
14    ! iflag_phys = N
15    ! de 100 a 199 : aqua planetes avec SST forcees
16    ! N-100 determine le type de SSTs
17    ! de 200 a 299 : terra planetes avec Ts calcule
[1529]18
[1992]19    ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
[1529]20
[1992]21    USE comgeomphy, ONLY: rlatd, rlond
22    USE dimphy, ONLY: klon
23    USE surface_data, ONLY: type_ocean, ok_veget
24    USE pbl_surface_mod, ONLY: pbl_surface_init
25    USE fonte_neige_mod, ONLY: fonte_neige_init
26    USE phys_state_var_mod
27    USE control_mod, ONLY: dayref, nday, iphysiq
28    USE indice_sol_mod
[1529]29
[1992]30    USE ioipsl
31    IMPLICIT NONE
[1529]32
[1992]33    include "dimensions.h"
34    ! #include "dimphy.h"
35    ! #include "YOMCST.h"
36    include "comconst.h"
37    include "clesphys.h"
38    include "dimsoil.h"
39    include "temps.h"
[1671]40
[1992]41    INTEGER, INTENT (IN) :: nlon, iflag_phys
42    ! IM ajout latfi, lonfi
43    REAL, INTENT (IN) :: lonfi(nlon), latfi(nlon)
[1529]44
[1992]45    INTEGER type_profil, type_aqua
[1529]46
[1992]47    ! Ajouts initialisation des surfaces
48    REAL :: run_off_lic_0(nlon)
49    REAL :: qsolsrf(nlon, nbsrf), snsrf(nlon, nbsrf)
50    REAL :: tsoil(nlon, nsoilmx, nbsrf)
51    REAL :: tslab(nlon), seaice(nlon)
[2298]52    REAL fder(nlon)
[1529]53
54
55
[1992]56    ! Arguments :
57    ! -----------
[1529]58
[1992]59    ! integer radpas
60    INTEGER it, unit, i, k, itap
[1529]61
[1992]62    REAL airefi, zcufi, zcvfi
[1529]63
[1992]64    REAL rugos, albedo
65    REAL tsurf
66    REAL time, timestep, day, day0
[2298]67    REAL qsol_f
[1992]68    REAL rugsrel(nlon)
69    ! real zmea(nlon),zstd(nlon),zsig(nlon)
70    ! real zgam(nlon),zthe(nlon),zpic(nlon),zval(nlon)
71    ! real rlon(nlon),rlat(nlon)
72    LOGICAL alb_ocean
73    ! integer demih_pas
[1529]74
[1992]75    CHARACTER *80 ans, file_forctl, file_fordat, file_start
76    CHARACTER *100 file, var
77    CHARACTER *2 cnbl
[1529]78
[1992]79    REAL phy_nat(nlon, 360)
80    REAL phy_alb(nlon, 360)
81    REAL phy_sst(nlon, 360)
82    REAL phy_bil(nlon, 360)
83    REAL phy_rug(nlon, 360)
84    REAL phy_ice(nlon, 360)
85    REAL phy_fter(nlon, 360)
86    REAL phy_foce(nlon, 360)
87    REAL phy_fsic(nlon, 360)
88    REAL phy_flic(nlon, 360)
[1529]89
[1992]90    INTEGER, SAVE :: read_climoz = 0 ! read ozone climatology
[1529]91
[1992]92    ! intermediate variables to use getin (need to be "save" to be shared by
93    ! all threads)
94    INTEGER, SAVE :: nbapp_rad_omp
95    REAL, SAVE :: co2_ppm_omp, solaire_omp
96    LOGICAL, SAVE :: alb_ocean_omp
97    REAL, SAVE :: rugos_omp
98    ! -------------------------------------------------------------------------
99    ! declaration pour l'appel a phyredem
100    ! -------------------------------------------------------------------------
[1529]101
[1992]102    ! real pctsrf(nlon,nbsrf),ftsol(nlon,nbsrf)
103    REAL falbe(nlon, nbsrf), falblw(nlon, nbsrf)
104    ! real pbl_tke(nlon,llm,nbsrf)
105    ! real rain_fall(nlon),snow_fall(nlon)
106    ! real solsw(nlon), sollw(nlon),radsol(nlon)
107    ! real t_ancien(nlon,llm),q_ancien(nlon,llm),rnebcon(nlon,llm)
108    ! real ratqs(nlon,llm)
109    ! real clwcon(nlon,llm)
[1529]110
[1992]111    INTEGER longcles
112    PARAMETER (longcles=20)
113    REAL clesphy0(longcles)
[1529]114
115
[1992]116    ! -----------------------------------------------------------------------
117    ! dynamial tendencies :
118    ! ---------------------
[1529]119
[1992]120    INTEGER l, ierr, aslun
[1529]121
[1992]122    REAL longitude, latitude
123    REAL paire
[1529]124
[1992]125    DATA latitude, longitude/48., 0./
[1529]126
[1992]127    ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
128    ! INITIALISATIONS
129    ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
[1529]130
[1992]131    ! -----------------------------------------------------------------------
132    ! Initialisations  des constantes
133    ! -------------------------------
[1529]134
135
[1992]136    type_aqua = iflag_phys/100
137    type_profil = iflag_phys - type_aqua*100
138    PRINT *, 'iniaqua:type_aqua, type_profil', type_aqua, type_profil
[1529]139
[1992]140    IF (klon/=nlon) THEN
141      WRITE (*, *) 'iniaqua: klon=', klon, ' nlon=', nlon
142      STOP 'probleme de dimensions dans iniaqua'
143    END IF
144    CALL phys_state_var_init(read_climoz)
[1529]145
146
[1992]147    read_climoz = 0
148    day0 = 217.
149    day = day0
150    it = 0
151    time = 0.
[1529]152
[1992]153    ! IM ajout latfi, lonfi
154    rlatd = latfi
155    rlond = lonfi
156    rlat = rlatd*180./pi
157    rlon = rlond*180./pi
[1529]158
[1992]159    ! -----------------------------------------------------------------------
160    ! initialisations de la physique
161    ! -----------------------------------------------------------------------
[1529]162
[1992]163    day_ini = dayref
164    day_end = day_ini + nday
165    airefi = 1.
166    zcufi = 1.
167    zcvfi = 1.
168    !$OMP MASTER
169    nbapp_rad_omp = 24
170    CALL getin('nbapp_rad', nbapp_rad_omp)
171    !$OMP END MASTER
172    !$OMP BARRIER
173    nbapp_rad = nbapp_rad_omp
[1759]174
[1992]175    ! ---------------------------------------------------------------------
176    ! Creation des conditions aux limites:
177    ! ------------------------------------
178    ! Initialisations des constantes
179    ! Ajouter les manquants dans planete.def... (albedo etc)
180    !$OMP MASTER
181    co2_ppm_omp = 348.
182    CALL getin('co2_ppm', co2_ppm_omp)
183    solaire_omp = 1365.
184    CALL getin('solaire', solaire_omp)
185    ! CALL getin('albedo',albedo) ! albedo is set below, depending on
186    ! type_aqua
187    alb_ocean_omp = .TRUE.
188    CALL getin('alb_ocean', alb_ocean_omp)
189    !$OMP END MASTER
190    !$OMP BARRIER
191    co2_ppm = co2_ppm_omp
192    WRITE (*, *) 'iniaqua: co2_ppm=', co2_ppm
193    solaire = solaire_omp
194    WRITE (*, *) 'iniaqua: solaire=', solaire
195    alb_ocean = alb_ocean_omp
196    WRITE (*, *) 'iniaqua: alb_ocean=', alb_ocean
[1529]197
[1992]198    radsol = 0.
199    qsol_f = 10.
[1529]200
[1992]201    ! Conditions aux limites:
202    ! -----------------------
[1529]203
[1992]204    qsol(:) = qsol_f
205    rugsrel = 0.0 ! (rugsrel = rugoro)
206    rugoro = 0.0
207    u_ancien = 0.0
208    v_ancien = 0.0
209    agesno = 50.0
210    ! Relief plat
211    zmea = 0.
212    zstd = 0.
213    zsig = 0.
214    zgam = 0.
215    zthe = 0.
216    zpic = 0.
217    zval = 0.
[1529]218
[1992]219    ! Une seule surface
220    pctsrf = 0.
221    IF (type_aqua==1) THEN
222      rugos = 1.E-4
223      albedo = 0.19
224      pctsrf(:, is_oce) = 1.
225    ELSE IF (type_aqua==2) THEN
226      rugos = 0.03
227      albedo = 0.1
228      pctsrf(:, is_ter) = 1.
229    END IF
[1529]230
[1992]231    !$OMP MASTER
232    rugos_omp = rugos
233    CALL getin('rugos', rugos_omp)
234    !$OMP END MASTER
235    !$OMP BARRIER
236    rugos = rugos_omp
237    WRITE (*, *) 'iniaqua: rugos=', rugos
[2220]238    zmasq(:) = pctsrf(:, is_ter)
[1529]239
[1992]240    ! pctsrf_pot(:,is_oce) = 1. - zmasq(:)
241    ! pctsrf_pot(:,is_sic) = 1. - zmasq(:)
[1529]242
[1992]243    ! Si alb_ocean on calcule un albedo oceanique moyen
244    ! if (alb_ocean) then
245    ! Voir pourquoi on avait ca.
246    ! CALL ini_alb_oce(phy_alb)
247    ! else
248    phy_alb(:, :) = albedo ! albedo land only (old value condsurf_jyg=0.3)
249    ! endif !alb_ocean
[1529]250
[1992]251    DO i = 1, 360
252      ! IM Terraplanete   phy_sst(:,i) = 260.+50.*cos(rlatd(:))**2
253      ! IM ajout calcul profil sst selon le cas considere (cf. FBr)
[1529]254
[1992]255      phy_nat(:, i) = 1.0 ! 0=ocean libre, 1=land, 2=glacier, 3=banquise
256      phy_bil(:, i) = 1.0 ! ne sert que pour les slab_ocean
257      phy_rug(:, i) = rugos ! longueur rugosite utilisee sur land only
258      phy_ice(:, i) = 0.0 ! fraction de glace (?)
259      phy_fter(:, i) = pctsrf(:, is_ter) ! fraction de glace (?)
260      phy_foce(:, i) = pctsrf(:, is_oce) ! fraction de glace (?)
261      phy_fsic(:, i) = pctsrf(:, is_sic) ! fraction de glace (?)
262      phy_flic(:, i) = pctsrf(:, is_lic) ! fraction de glace (?)
263    END DO
264    ! IM calcul profil sst
265    CALL profil_sst(nlon, rlatd, type_profil, phy_sst)
[1529]266
[1992]267    CALL writelim(klon, phy_nat, phy_alb, phy_sst, phy_bil, phy_rug, phy_ice, &
268      phy_fter, phy_foce, phy_flic, phy_fsic)
[1529]269
270
[1992]271    ! ---------------------------------------------------------------------
272    ! Ecriture de l'etat initial:
273    ! ---------------------------
[1529]274
275
[1992]276    ! Ecriture etat initial physique
[1529]277
[1992]278    timestep = dtvr*float(iphysiq)
279    radpas = nint(daysec/timestep/float(nbapp_rad))
[1529]280
[1992]281    DO i = 1, longcles
282      clesphy0(i) = 0.
283    END DO
284    clesphy0(1) = float(iflag_con)
285    clesphy0(2) = float(nbapp_rad)
286    ! IF( cycle_diurne  ) clesphy0(3) =  1.
287    clesphy0(3) = 1. ! cycle_diurne
288    clesphy0(4) = 1. ! soil_model
289    clesphy0(5) = 1. ! new_oliq
290    clesphy0(6) = 0. ! ok_orodr
291    clesphy0(7) = 0. ! ok_orolf
292    clesphy0(8) = 0. ! ok_limitvrai
[1529]293
294
[1992]295    ! =======================================================================
296    ! Profils initiaux
297    ! =======================================================================
[1529]298
[1992]299    ! On initialise les temperatures de surfaces comme les sst
300    DO i = 1, nlon
301      ftsol(i, :) = phy_sst(i, 1)
302      tsoil(i, :, :) = phy_sst(i, 1)
303      tslab(i) = phy_sst(i, 1)
304    END DO
[1529]305
[1992]306    falbe(:, :) = albedo
307    falblw(:, :) = albedo
308    rain_fall(:) = 0.
309    snow_fall(:) = 0.
310    solsw(:) = 0.
311    sollw(:) = 0.
312    radsol(:) = 0.
[1529]313
[1992]314    ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
315    ! intialisation bidon mais pas grave
316    t_ancien(:, :) = 0.
317    q_ancien(:, :) = 0.
318    ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
319    rnebcon = 0.
320    ratqs = 0.
321    clwcon = 0.
322    pbl_tke = 1.E-8
[1529]323
[1992]324    ! variables supplementaires pour appel a plb_surface_init
325    fder(:) = 0.
326    seaice(:) = 0.
327    run_off_lic_0 = 0.
[2298]328    fevap = 0.
[1529]329
330
[1992]331    ! Initialisations necessaires avant phyredem
332    type_ocean = 'force'
333    CALL fonte_neige_init(run_off_lic_0)
334    qsolsrf(:, :) = qsol(1) ! humidite du sol des sous surface
335    snsrf(:, :) = 0. ! couverture de neige des sous surface
[2298]336    z0m(:, :) = rugos ! couverture de neige des sous surface
337    z0h=z0m
[1530]338
339
[2298]340    CALL pbl_surface_init(fder, snsrf, qsolsrf, tsoil)
[1529]341
[1992]342    PRINT *, 'iniaqua: before phyredem'
[1529]343
[1992]344    falb1 = albedo
345    falb2 = albedo
346    zmax0 = 0.
347    f0 = 0.
348    sig1 = 0.
349    w01 = 0.
350    wake_deltat = 0.
351    wake_deltaq = 0.
352    wake_s = 0.
353    wake_cstar = 0.
354    wake_pe = 0.
355    wake_fip = 0.
356    fm_therm = 0.
357    entr_therm = 0.
358    detr_therm = 0.
[1529]359
360
[1992]361    CALL phyredem('startphy.nc')
[1529]362
[1992]363    PRINT *, 'iniaqua: after phyredem'
364    CALL phys_state_var_end
[1529]365
[1992]366    RETURN
367  END SUBROUTINE iniaqua
[1529]368
369
[1992]370  ! ====================================================================
371  ! ====================================================================
372  SUBROUTINE zenang_an(cycle_diurne, gmtime, rlat, rlon, rmu0, fract)
373    USE dimphy
374    IMPLICIT NONE
375    ! ====================================================================
376    ! =============================================================
377    ! CALL zenang(cycle_diurne,gmtime,rlat,rlon,rmu0,fract)
378    ! Auteur : A. Campoy et F. Hourdin
379    ! Objet  : calculer les valeurs moyennes du cos de l'angle zenithal
380    ! et l'ensoleillement moyen entre gmtime1 et gmtime2
381    ! connaissant la declinaison, la latitude et la longitude.
[1529]382
[1992]383    ! Dans cette version particuliere, on calcule le rayonnement
384    ! moyen sur l'année à chaque latitude.
385    ! angle zenithal calculé pour obtenir un
386    ! Fit polynomial de  l'ensoleillement moyen au sommet de l'atmosphere
387    ! en moyenne annuelle.
388    ! Spécifique de la terre. Utilisé pour les aqua planetes.
[1529]389
[1992]390    ! Rque   : Different de la routine angle en ce sens que zenang
391    ! fournit des moyennes de pmu0 et non des valeurs
392    ! instantanees, du coup frac prend toutes les valeurs
393    ! entre 0 et 1.
394    ! Date   : premiere version le 13 decembre 1994
395    ! revu pour  GCM  le 30 septembre 1996
396    ! ===============================================================
397    ! longi----INPUT : la longitude vraie de la terre dans son plan
398    ! solaire a partir de l'equinoxe de printemps (degre)
399    ! gmtime---INPUT : temps universel en fraction de jour
400    ! pdtrad---INPUT : pas de temps du rayonnement (secondes)
401    ! lat------INPUT : latitude en degres
402    ! long-----INPUT : longitude en degres
403    ! pmu0-----OUTPUT: angle zenithal moyen entre gmtime et gmtime+pdtrad
404    ! frac-----OUTPUT: ensoleillement moyen entre gmtime et gmtime+pdtrad
405    ! ================================================================
406    include "YOMCST.h"
407    ! ================================================================
408    LOGICAL cycle_diurne
409    REAL gmtime
410    REAL rlat(klon), rlon(klon), rmu0(klon), fract(klon)
411    ! ================================================================
412    INTEGER i
413    REAL gmtime1, gmtime2
414    REAL pi_local
[1529]415
416
[1992]417    REAL rmu0m(klon), rmu0a(klon)
[1529]418
419
[1992]420    pi_local = 4.0*atan(1.0)
[1529]421
[1992]422    ! ================================================================
423    ! Calcul de l'angle zenithal moyen sur la journee
424    ! ================================================================
425
426    DO i = 1, klon
427      fract(i) = 1.
428      ! Calcule du flux moyen
429      IF (abs(rlat(i))<=28.75) THEN
430        rmu0m(i) = (210.1924+206.6059*cos(0.0174533*rlat(i))**2)/1365.
431      ELSE IF (abs(rlat(i))<=43.75) THEN
432        rmu0m(i) = (187.4562+236.1853*cos(0.0174533*rlat(i))**2)/1365.
433      ELSE IF (abs(rlat(i))<=71.25) THEN
434        rmu0m(i) = (162.4439+284.1192*cos(0.0174533*rlat(i))**2)/1365.
[1529]435      ELSE
[1992]436        rmu0m(i) = (172.8125+183.7673*cos(0.0174533*rlat(i))**2)/1365.
437      END IF
438    END DO
[1529]439
[1992]440    ! ================================================================
441    ! Avec ou sans cycle diurne
442    ! ================================================================
[1529]443
[1992]444    IF (cycle_diurne) THEN
[1529]445
[1992]446      ! On redecompose flux  au sommet suivant un cycle diurne idealise
447      ! identique a toutes les latitudes.
[1671]448
[1992]449      DO i = 1, klon
450        rmu0a(i) = 2.*rmu0m(i)*sqrt(2.)*pi_local/(4.-pi_local)
451        rmu0(i) = rmu0a(i)*abs(sin(pi_local*gmtime+pi_local*rlon(i)/360.)) - &
452          rmu0a(i)/sqrt(2.)
453      END DO
[1671]454
[1992]455      DO i = 1, klon
456        IF (rmu0(i)<=0.) THEN
457          rmu0(i) = 0.
458          fract(i) = 0.
459        ELSE
460          fract(i) = 1.
461        END IF
462      END DO
[1671]463
[1992]464      ! Affichage de l'angel zenitale
465      ! print*,'************************************'
466      ! print*,'************************************'
467      ! print*,'************************************'
468      ! print*,'latitude=',rlat(i),'longitude=',rlon(i)
469      ! print*,'rmu0m=',rmu0m(i)
470      ! print*,'rmu0a=',rmu0a(i)
471      ! print*,'rmu0=',rmu0(i)
[1529]472
[1992]473    ELSE
[1671]474
[1992]475      DO i = 1, klon
476        fract(i) = 0.5
477        rmu0(i) = rmu0m(i)*2.
478      END DO
479
480    END IF
481
482    RETURN
483  END SUBROUTINE zenang_an
484
485  ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
486
487  SUBROUTINE writelim(klon, phy_nat, phy_alb, phy_sst, phy_bil, phy_rug, &
488      phy_ice, phy_fter, phy_foce, phy_flic, phy_fsic)
489
490    USE mod_phys_lmdz_para, ONLY: is_mpi_root, is_omp_root
491    USE mod_grid_phy_lmdz, ONLY: klon_glo
492    USE mod_phys_lmdz_transfert_para, ONLY: gather
493    IMPLICIT NONE
494    ! #include "dimensions.h"
495    ! #include "dimphy.h"
496    include "netcdf.inc"
497
498    INTEGER, INTENT (IN) :: klon
499    REAL, INTENT (IN) :: phy_nat(klon, 360)
500    REAL, INTENT (IN) :: phy_alb(klon, 360)
501    REAL, INTENT (IN) :: phy_sst(klon, 360)
502    REAL, INTENT (IN) :: phy_bil(klon, 360)
503    REAL, INTENT (IN) :: phy_rug(klon, 360)
504    REAL, INTENT (IN) :: phy_ice(klon, 360)
505    REAL, INTENT (IN) :: phy_fter(klon, 360)
506    REAL, INTENT (IN) :: phy_foce(klon, 360)
507    REAL, INTENT (IN) :: phy_flic(klon, 360)
508    REAL, INTENT (IN) :: phy_fsic(klon, 360)
509
510    REAL :: phy_glo(klon_glo, 360) ! temporary variable, to store phy_***(:)
511      ! on the whole physics grid
512    INTEGER :: k
513    INTEGER ierr
514    INTEGER dimfirst(3)
515    INTEGER dimlast(3)
516
517    INTEGER nid, ndim, ntim
518    INTEGER dims(2), debut(2), epais(2)
519    INTEGER id_tim
520    INTEGER id_nat, id_sst, id_bils, id_rug, id_alb
521    INTEGER id_fter, id_foce, id_fsic, id_flic
522
523    IF (is_mpi_root .AND. is_omp_root) THEN
524
525      PRINT *, 'writelim: Ecriture du fichier limit'
526
527      ierr = nf_create('limit.nc', nf_clobber, nid)
528
529      ierr = nf_put_att_text(nid, nf_global, 'title', 30, &
530        'Fichier conditions aux limites')
531      ! !        ierr = NF_DEF_DIM (nid, "points_physiques", klon, ndim)
532      ierr = nf_def_dim(nid, 'points_physiques', klon_glo, ndim)
533      ierr = nf_def_dim(nid, 'time', nf_unlimited, ntim)
534
535      dims(1) = ndim
536      dims(2) = ntim
537
[2220]538#ifdef NC_DOUBLE
539      ierr = nf_def_var(nid, 'TEMPS', nf_double, 1, ntim, id_tim)
540#else
[1992]541      ierr = nf_def_var(nid, 'TEMPS', nf_float, 1, ntim, id_tim)
[2220]542#endif
[1992]543      ierr = nf_put_att_text(nid, id_tim, 'title', 17, 'Jour dans l annee')
[2220]544
545#ifdef NC_DOUBLE
546      ierr = nf_def_var(nid, 'NAT', nf_double, 2, dims, id_nat)
547#else
[1992]548      ierr = nf_def_var(nid, 'NAT', nf_float, 2, dims, id_nat)
[2220]549#endif
[1992]550      ierr = nf_put_att_text(nid, id_nat, 'title', 23, &
551        'Nature du sol (0,1,2,3)')
[2220]552
553#ifdef NC_DOUBLE
554      ierr = nf_def_var(nid, 'SST', nf_double, 2, dims, id_sst)
555#else
[1992]556      ierr = nf_def_var(nid, 'SST', nf_float, 2, dims, id_sst)
[2220]557#endif
[1992]558      ierr = nf_put_att_text(nid, id_sst, 'title', 35, &
559        'Temperature superficielle de la mer')
[2220]560
561#ifdef NC_DOUBLE
562      ierr = nf_def_var(nid, 'BILS', nf_double, 2, dims, id_bils)
563#else
[1992]564      ierr = nf_def_var(nid, 'BILS', nf_float, 2, dims, id_bils)
[2220]565#endif
[1992]566      ierr = nf_put_att_text(nid, id_bils, 'title', 32, &
567        'Reference flux de chaleur au sol')
[2220]568
569#ifdef NC_DOUBLE
570      ierr = nf_def_var(nid, 'ALB', nf_double, 2, dims, id_alb)
571#else
[1992]572      ierr = nf_def_var(nid, 'ALB', nf_float, 2, dims, id_alb)
[2220]573#endif
[1992]574      ierr = nf_put_att_text(nid, id_alb, 'title', 19, 'Albedo a la surface')
[2220]575
576#ifdef NC_DOUBLE
577      ierr = nf_def_var(nid, 'RUG', nf_double, 2, dims, id_rug)
578#else
[1992]579      ierr = nf_def_var(nid, 'RUG', nf_float, 2, dims, id_rug)
[2220]580#endif
[1992]581      ierr = nf_put_att_text(nid, id_rug, 'title', 8, 'Rugosite')
582
[2220]583#ifdef NC_DOUBLE
584      ierr = nf_def_var(nid, 'FTER', nf_double, 2, dims, id_fter)
585#else
[1992]586      ierr = nf_def_var(nid, 'FTER', nf_float, 2, dims, id_fter)
[2220]587#endif
588      ierr = nf_put_att_text(nid, id_fter, 'title',10,'Frac. Land')
589#ifdef NC_DOUBLE
590      ierr = nf_def_var(nid, 'FOCE', nf_double, 2, dims, id_foce)
591#else
[1992]592      ierr = nf_def_var(nid, 'FOCE', nf_float, 2, dims, id_foce)
[2220]593#endif
594      ierr = nf_put_att_text(nid, id_foce, 'title',11,'Frac. Ocean')
595#ifdef NC_DOUBLE
596      ierr = nf_def_var(nid, 'FSIC', nf_double, 2, dims, id_fsic)
597#else
[1992]598      ierr = nf_def_var(nid, 'FSIC', nf_float, 2, dims, id_fsic)
[2220]599#endif
600      ierr = nf_put_att_text(nid, id_fsic, 'title',13,'Frac. Sea Ice')
601#ifdef NC_DOUBLE
602      ierr = nf_def_var(nid, 'FLIC', nf_double, 2, dims, id_flic)
603#else
[1992]604      ierr = nf_def_var(nid, 'FLIC', nf_float, 2, dims, id_flic)
[2220]605#endif
606      ierr = nf_put_att_text(nid, id_flic, 'title',14,'Frac. Land Ice')
[1992]607
608      ierr = nf_enddef(nid)
609      IF (ierr/=nf_noerr) THEN
610        WRITE (*, *) 'writelim error: failed to end define mode'
611        WRITE (*, *) nf_strerror(ierr)
612      END IF
613
614
615      ! write the 'times'
616      DO k = 1, 360
[1529]617#ifdef NC_DOUBLE
[1992]618        ierr = nf_put_var1_double(nid, id_tim, k, dble(k))
[1529]619#else
[1992]620        ierr = nf_put_var1_real(nid, id_tim, k, float(k))
[1671]621#endif
[1992]622        IF (ierr/=nf_noerr) THEN
623          WRITE (*, *) 'writelim error with temps(k),k=', k
624          WRITE (*, *) nf_strerror(ierr)
625        END IF
626      END DO
[1529]627
[1992]628    END IF ! of if (is_mpi_root.and.is_omp_root)
[1671]629
[1992]630    ! write the fields, after having collected them on master
[1671]631
[1992]632    CALL gather(phy_nat, phy_glo)
633    IF (is_mpi_root .AND. is_omp_root) THEN
[1671]634#ifdef NC_DOUBLE
[1992]635      ierr = nf_put_var_double(nid, id_nat, phy_glo)
[1671]636#else
[1992]637      ierr = nf_put_var_real(nid, id_nat, phy_glo)
[1529]638#endif
[1992]639      IF (ierr/=nf_noerr) THEN
640        WRITE (*, *) 'writelim error with phy_nat'
641        WRITE (*, *) nf_strerror(ierr)
642      END IF
643    END IF
[1671]644
[1992]645    CALL gather(phy_sst, phy_glo)
646    IF (is_mpi_root .AND. is_omp_root) THEN
[1671]647#ifdef NC_DOUBLE
[1992]648      ierr = nf_put_var_double(nid, id_sst, phy_glo)
[1671]649#else
[1992]650      ierr = nf_put_var_real(nid, id_sst, phy_glo)
[1671]651#endif
[1992]652      IF (ierr/=nf_noerr) THEN
653        WRITE (*, *) 'writelim error with phy_sst'
654        WRITE (*, *) nf_strerror(ierr)
655      END IF
656    END IF
[1671]657
[1992]658    CALL gather(phy_bil, phy_glo)
659    IF (is_mpi_root .AND. is_omp_root) THEN
[1671]660#ifdef NC_DOUBLE
[1992]661      ierr = nf_put_var_double(nid, id_bils, phy_glo)
[1671]662#else
[1992]663      ierr = nf_put_var_real(nid, id_bils, phy_glo)
[1671]664#endif
[1992]665      IF (ierr/=nf_noerr) THEN
666        WRITE (*, *) 'writelim error with phy_bil'
667        WRITE (*, *) nf_strerror(ierr)
668      END IF
669    END IF
[1671]670
[1992]671    CALL gather(phy_alb, phy_glo)
672    IF (is_mpi_root .AND. is_omp_root) THEN
[1671]673#ifdef NC_DOUBLE
[1992]674      ierr = nf_put_var_double(nid, id_alb, phy_glo)
[1671]675#else
[1992]676      ierr = nf_put_var_real(nid, id_alb, phy_glo)
[1671]677#endif
[1992]678      IF (ierr/=nf_noerr) THEN
679        WRITE (*, *) 'writelim error with phy_alb'
680        WRITE (*, *) nf_strerror(ierr)
681      END IF
682    END IF
[1671]683
[1992]684    CALL gather(phy_rug, phy_glo)
685    IF (is_mpi_root .AND. is_omp_root) THEN
[1671]686#ifdef NC_DOUBLE
[1992]687      ierr = nf_put_var_double(nid, id_rug, phy_glo)
[1671]688#else
[1992]689      ierr = nf_put_var_real(nid, id_rug, phy_glo)
[1671]690#endif
[1992]691      IF (ierr/=nf_noerr) THEN
692        WRITE (*, *) 'writelim error with phy_rug'
693        WRITE (*, *) nf_strerror(ierr)
694      END IF
695    END IF
[1671]696
[1992]697    CALL gather(phy_fter, phy_glo)
698    IF (is_mpi_root .AND. is_omp_root) THEN
[1671]699#ifdef NC_DOUBLE
[1992]700      ierr = nf_put_var_double(nid, id_fter, phy_glo)
[1671]701#else
[1992]702      ierr = nf_put_var_real(nid, id_fter, phy_glo)
[1671]703#endif
[1992]704      IF (ierr/=nf_noerr) THEN
705        WRITE (*, *) 'writelim error with phy_fter'
706        WRITE (*, *) nf_strerror(ierr)
707      END IF
708    END IF
[1671]709
[1992]710    CALL gather(phy_foce, phy_glo)
711    IF (is_mpi_root .AND. is_omp_root) THEN
[1671]712#ifdef NC_DOUBLE
[1992]713      ierr = nf_put_var_double(nid, id_foce, phy_glo)
[1671]714#else
[1992]715      ierr = nf_put_var_real(nid, id_foce, phy_glo)
[1671]716#endif
[1992]717      IF (ierr/=nf_noerr) THEN
718        WRITE (*, *) 'writelim error with phy_foce'
719        WRITE (*, *) nf_strerror(ierr)
720      END IF
721    END IF
[1671]722
[1992]723    CALL gather(phy_fsic, phy_glo)
724    IF (is_mpi_root .AND. is_omp_root) THEN
[1671]725#ifdef NC_DOUBLE
[1992]726      ierr = nf_put_var_double(nid, id_fsic, phy_glo)
[1671]727#else
[1992]728      ierr = nf_put_var_real(nid, id_fsic, phy_glo)
[1671]729#endif
[1992]730      IF (ierr/=nf_noerr) THEN
731        WRITE (*, *) 'writelim error with phy_fsic'
732        WRITE (*, *) nf_strerror(ierr)
733      END IF
734    END IF
[1671]735
[1992]736    CALL gather(phy_flic, phy_glo)
737    IF (is_mpi_root .AND. is_omp_root) THEN
[1671]738#ifdef NC_DOUBLE
[1992]739      ierr = nf_put_var_double(nid, id_flic, phy_glo)
[1671]740#else
[1992]741      ierr = nf_put_var_real(nid, id_flic, phy_glo)
[1671]742#endif
[1992]743      IF (ierr/=nf_noerr) THEN
744        WRITE (*, *) 'writelim error with phy_flic'
745        WRITE (*, *) nf_strerror(ierr)
746      END IF
747    END IF
[1671]748
[1992]749    ! close file:
750    IF (is_mpi_root .AND. is_omp_root) THEN
751      ierr = nf_close(nid)
752    END IF
[1671]753
[1992]754  END SUBROUTINE writelim
[1529]755
[1992]756  ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
[1671]757
[1992]758  SUBROUTINE profil_sst(nlon, rlatd, type_profil, phy_sst)
759    USE dimphy
760    IMPLICIT NONE
[1529]761
[1992]762    INTEGER nlon, type_profil, i, k, j
763    REAL :: rlatd(nlon), phy_sst(nlon, 360)
764    INTEGER imn, imx, amn, amx, kmn, kmx
765    INTEGER p, pplus, nlat_max
766    PARAMETER (nlat_max=72)
767    REAL x_anom_sst(nlat_max)
[1529]768
[1992]769    IF (klon/=nlon) STOP 'probleme de dimensions dans iniaqua'
770    WRITE (*, *) ' profil_sst: type_profil=', type_profil
771    DO i = 1, 360
772      ! phy_sst(:,i) = 260.+50.*cos(rlatd(:))**2
[1529]773
[1992]774      ! Rajout fbrlmd
[1529]775
[1992]776      IF (type_profil==1) THEN
777        ! Méthode 1 "Control" faible plateau à l'Equateur
778        DO j = 1, klon
779          phy_sst(j, i) = 273. + 27.*(1-sin(1.5*rlatd(j))**2)
780          ! PI/3=1.047197551
781          IF ((rlatd(j)>1.0471975) .OR. (rlatd(j)<-1.0471975)) THEN
782            phy_sst(j, i) = 273.
783          END IF
784        END DO
785      END IF
786      IF (type_profil==2) THEN
787        ! Méthode 2 "Flat" fort plateau à l'Equateur
788        DO j = 1, klon
789          phy_sst(j, i) = 273. + 27.*(1-sin(1.5*rlatd(j))**4)
790          IF ((rlatd(j)>1.0471975) .OR. (rlatd(j)<-1.0471975)) THEN
791            phy_sst(j, i) = 273.
792          END IF
793        END DO
794      END IF
[1529]795
796
[1992]797      IF (type_profil==3) THEN
798        ! Méthode 3 "Qobs" plateau réel à l'Equateur
799        DO j = 1, klon
800          phy_sst(j, i) = 273. + 0.5*27.*(2-sin(1.5*rlatd(j))**2-sin(1.5* &
801            rlatd(j))**4)
802          IF ((rlatd(j)>1.0471975) .OR. (rlatd(j)<-1.0471975)) THEN
803            phy_sst(j, i) = 273.
804          END IF
805        END DO
806      END IF
[1529]807
[1992]808      IF (type_profil==4) THEN
809        ! Méthode 4 : Méthode 3 + SST+2 "Qobs" plateau réel à l'Equateur
810        DO j = 1, klon
811          phy_sst(j, i) = 273. + 0.5*29.*(2-sin(1.5*rlatd(j))**2-sin(1.5* &
812            rlatd(j))**4)
813          IF ((rlatd(j)>1.0471975) .OR. (rlatd(j)<-1.0471975)) THEN
814            phy_sst(j, i) = 273.
815          END IF
816        END DO
817      END IF
[1529]818
[1992]819      IF (type_profil==5) THEN
820        ! Méthode 5 : Méthode 3 + +2K "Qobs" plateau réel à l'Equateur
821        DO j = 1, klon
822          phy_sst(j, i) = 273. + 2. + 0.5*27.*(2-sin(1.5*rlatd(j))**2-sin(1.5 &
823            *rlatd(j))**4)
824          IF ((rlatd(j)>1.0471975) .OR. (rlatd(j)<-1.0471975)) THEN
825            phy_sst(j, i) = 273. + 2.
826          END IF
[1529]827
[1992]828        END DO
829      END IF
[1529]830
[1992]831      IF (type_profil==6) THEN
832        ! Méthode 6 "cst" valeur constante de SST
833        DO j = 1, klon
834          phy_sst(j, i) = 288.
835        END DO
836      END IF
[1529]837
838
[1992]839      IF (type_profil==7) THEN
840        ! Méthode 7 "cst" valeur constante de SST +2
841        DO j = 1, klon
842          phy_sst(j, i) = 288. + 2.
843        END DO
844      END IF
[1529]845
[1992]846      p = 0
847      IF (type_profil==8) THEN
848        ! Méthode 8 profil anomalies SST du modèle couplé AR4
849        DO j = 1, klon
850          IF (rlatd(j)==rlatd(j-1)) THEN
851            phy_sst(j, i) = 273. + x_anom_sst(pplus) + &
852              0.5*27.*(2-sin(1.5*rlatd(j))**2-sin(1.5*rlatd(j))**4)
853            IF ((rlatd(j)>1.0471975) .OR. (rlatd(j)<-1.0471975)) THEN
854              phy_sst(j, i) = 273. + x_anom_sst(pplus)
855            END IF
856          ELSE
857            p = p + 1
858            pplus = 73 - p
859            phy_sst(j, i) = 273. + x_anom_sst(pplus) + &
860              0.5*27.*(2-sin(1.5*rlatd(j))**2-sin(1.5*rlatd(j))**4)
861            IF ((rlatd(j)>1.0471975) .OR. (rlatd(j)<-1.0471975)) THEN
862              phy_sst(j, i) = 273. + x_anom_sst(pplus)
863            END IF
864            WRITE (*, *) rlatd(j), x_anom_sst(pplus), phy_sst(j, i)
865          END IF
866        END DO
867      END IF
[1529]868
[1992]869      IF (type_profil==9) THEN
870        ! Méthode 5 : Méthode 3 + -2K "Qobs" plateau réel à l'Equateur
871        DO j = 1, klon
872          phy_sst(j, i) = 273. - 2. + 0.5*27.*(2-sin(1.5*rlatd(j))**2-sin(1.5 &
873            *rlatd(j))**4)
874          IF ((rlatd(j)>1.0471975) .OR. (rlatd(j)<-1.0471975)) THEN
875            phy_sst(j, i) = 273. - 2.
876          END IF
877        END DO
878      END IF
[1529]879
880
[1992]881      IF (type_profil==10) THEN
882        ! Méthode 10 : Méthode 3 + +4K "Qobs" plateau réel à l'Equateur
883        DO j = 1, klon
884          phy_sst(j, i) = 273. + 4. + 0.5*27.*(2-sin(1.5*rlatd(j))**2-sin(1.5 &
885            *rlatd(j))**4)
886          IF ((rlatd(j)>1.0471975) .OR. (rlatd(j)<-1.0471975)) THEN
887            phy_sst(j, i) = 273. + 4.
888          END IF
889        END DO
890      END IF
[1529]891
[1992]892      IF (type_profil==11) THEN
893        ! Méthode 11 : Méthode 3 + 4CO2 "Qobs" plateau réel à l'Equateur
894        DO j = 1, klon
895          phy_sst(j, i) = 273. + 0.5*27.*(2-sin(1.5*rlatd(j))**2-sin(1.5* &
896            rlatd(j))**4)
897          IF ((rlatd(j)>1.0471975) .OR. (rlatd(j)<-1.0471975)) THEN
898            phy_sst(j, i) = 273.
899          END IF
900        END DO
901      END IF
[1529]902
[1992]903      IF (type_profil==12) THEN
904        ! Méthode 12 : Méthode 10 + 4CO2 "Qobs" plateau réel à l'Equateur
905        DO j = 1, klon
906          phy_sst(j, i) = 273. + 4. + 0.5*27.*(2-sin(1.5*rlatd(j))**2-sin(1.5 &
907            *rlatd(j))**4)
908          IF ((rlatd(j)>1.0471975) .OR. (rlatd(j)<-1.0471975)) THEN
909            phy_sst(j, i) = 273. + 4.
910          END IF
911        END DO
912      END IF
[1529]913
[1992]914      IF (type_profil==13) THEN
915        ! Méthode 13 "Qmax" plateau réel à l'Equateur augmenté !
916        DO j = 1, klon
917          phy_sst(j, i) = 273. + 0.5*29.*(2-sin(1.5*rlatd(j))**2-sin(1.5* &
918            rlatd(j))**4)
919          IF ((rlatd(j)>1.0471975) .OR. (rlatd(j)<-1.0471975)) THEN
920            phy_sst(j, i) = 273.
921          END IF
922        END DO
923      END IF
[1529]924
[1992]925      IF (type_profil==14) THEN
926        ! Méthode 13 "Qmax2K" plateau réel à l'Equateur augmenté +2K !
927        DO j = 1, klon
928          phy_sst(j, i) = 273. + 2. + 0.5*29.*(2-sin(1.5*rlatd(j))**2-sin(1.5 &
929            *rlatd(j))**4)
930          IF ((rlatd(j)>1.0471975) .OR. (rlatd(j)<-1.0471975)) THEN
931            phy_sst(j, i) = 273.
932          END IF
933        END DO
934      END IF
[1529]935
[2160]936      if (type_profil.EQ.20) then
937      print*,'Profile SST 20'
938!     Méthode 13 "Qmax2K" plateau réel �|  l'Equateur augmenté +2K
939
940      do j=1,klon
941        phy_sst(j,i)=248.+55.*(1-sin(rlatd(j))**2)
942      enddo
943      endif
944
945      if (type_profil.EQ.21) then
946      print*,'Profile SST 21'
947!     Méthode 13 "Qmax2K" plateau réel �|  l'Equateur augmenté +2K
948      do j=1,klon
949        phy_sst(j,i)=252.+55.*(1-sin(rlatd(j))**2)
950      enddo
951      endif
952
953
954
[1992]955    END DO
956
957    ! IM beg : verif profil SST: phy_sst
958    amn = min(phy_sst(1,1), 1000.)
959    amx = max(phy_sst(1,1), -1000.)
960    imn = 1
961    kmn = 1
962    imx = 1
963    kmx = 1
964    DO k = 1, 360
965      DO i = 2, nlon
966        IF (phy_sst(i,k)<amn) THEN
967          amn = phy_sst(i, k)
968          imn = i
969          kmn = k
970        END IF
971        IF (phy_sst(i,k)>amx) THEN
972          amx = phy_sst(i, k)
973          imx = i
974          kmx = k
975        END IF
976      END DO
977    END DO
978
979    PRINT *, 'profil_sst: imn, kmn, phy_sst(imn,kmn) ', imn, kmn, amn
980    PRINT *, 'profil_sst: imx, kmx, phy_sst(imx,kmx) ', imx, kmx, amx
981    ! IM end : verif profil SST: phy_sst
982
983    RETURN
984  END SUBROUTINE profil_sst
985
986END MODULE phyaqua_mod
Note: See TracBrowser for help on using the repository browser.