7 SUBROUTINE iniaqua(nlon, iflag_phys)
42 INTEGER type_profil, type_aqua
45 REAL :: run_off_lic_0(nlon)
46 REAL :: qsolsrf(nlon,
nbsrf), snsrf(nlon,
nbsrf)
47 REAL :: tsoil(nlon, nsoilmx,
nbsrf)
48 REAL :: tslab(nlon), seaice(nlon)
59 REAL airefi, zcufi, zcvfi
73 CHARACTER *100 file,
var
76 REAL phy_nat(nlon, 360)
77 REAL phy_alb(nlon, 360)
78 REAL phy_sst(nlon, 360)
79 REAL phy_bil(nlon, 360)
80 REAL phy_rug(nlon, 360)
81 REAL phy_ice(nlon, 360)
82 REAL phy_fter(nlon, 360)
83 REAL phy_foce(nlon, 360)
84 REAL phy_fsic(nlon, 360)
85 REAL phy_flic(nlon, 360)
87 INTEGER,
SAVE :: read_climoz = 0
91 INTEGER,
SAVE :: nbapp_rad_omp
92 REAL,
SAVE :: co2_ppm_omp, solaire_omp
93 LOGICAL,
SAVE :: alb_ocean_omp
94 REAL,
SAVE :: rugos_omp
110 REAL clesphy0(longcles)
117 INTEGER l, ierr, aslun
135 print *,
'iniaqua:type_aqua, type_profil', type_aqua, type_profil
138 WRITE (*, *)
'iniaqua: klon=',
klon,
' nlon=', nlon
139 stop
'probleme de dimensions dans iniaqua'
167 CALL getin(
'nbapp_rad', nbapp_rad_omp)
179 CALL getin(
'co2_ppm', co2_ppm_omp)
181 CALL getin(
'solaire', solaire_omp)
184 alb_ocean_omp = .
true.
185 CALL getin(
'alb_ocean', alb_ocean_omp)
189 WRITE (*, *)
'iniaqua: co2_ppm=',
co2_ppm
190 solaire = solaire_omp
191 WRITE (*, *)
'iniaqua: solaire=', solaire
192 alb_ocean = alb_ocean_omp
193 WRITE (*, *)
'iniaqua: alb_ocean=', alb_ocean
218 IF (type_aqua==1)
THEN
222 ELSE IF (type_aqua==2)
THEN
230 CALL getin(
'rugos', rugos_omp)
234 WRITE (*, *)
'iniaqua: rugos=', rugos
254 phy_rug(:,
i) = rugos
264 CALL writelim(
klon, phy_nat, phy_alb, phy_sst, phy_bil, phy_rug, phy_ice, &
265 phy_fter, phy_foce, phy_flic, phy_fsic)
299 tsoil(
i, :, :) = phy_sst(
i, 1)
300 tslab(
i) = phy_sst(
i, 1)
331 qsolsrf(:, :) =
qsol(1)
339 print *,
'iniaqua: before phyredem'
360 print *,
'iniaqua: after phyredem'
369 SUBROUTINE zenang_an(cycle_diurne, gmtime, rlat, rlon, rmu0, fract)
410 REAL gmtime1, gmtime2
417 pi_local = 4.0*atan(1.0)
426 IF (abs(rlat(i))<=28.75)
THEN
427 rmu0m(i) = (210.1924+206.6059*cos(0.0174533*rlat(i))**2)/1365.
428 ELSE IF (abs(rlat(i))<=43.75)
THEN
429 rmu0m(i) = (187.4562+236.1853*cos(0.0174533*rlat(i))**2)/1365.
430 ELSE IF (abs(rlat(i))<=71.25)
THEN
431 rmu0m(i) = (162.4439+284.1192*cos(0.0174533*rlat(i))**2)/1365.
433 rmu0m(i) = (172.8125+183.7673*cos(0.0174533*rlat(i))**2)/1365.
441 IF (cycle_diurne)
THEN
447 rmu0a(i) = 2.*rmu0m(i)*sqrt(2.)*pi_local/(4.-pi_local)
448 rmu0(i) = rmu0a(i)*abs(sin(pi_local*gmtime+pi_local*rlon(i)/360.)) - &
453 IF (rmu0(i)<=0.)
THEN
474 rmu0(i) = rmu0m(i)*2.
484 SUBROUTINE writelim(klon, phy_nat, phy_alb, phy_sst, phy_bil, phy_rug, &
485 phy_ice, phy_fter, phy_foce, phy_flic, phy_fsic)
493 INTEGER,
INTENT (IN) :: klon
494 REAL,
INTENT (IN) :: phy_nat(klon, 360)
495 REAL,
INTENT (IN) :: phy_alb(klon, 360)
496 REAL,
INTENT (IN) :: phy_sst(klon, 360)
497 REAL,
INTENT (IN) :: phy_bil(klon, 360)
498 REAL,
INTENT (IN) :: phy_rug(klon, 360)
499 REAL,
INTENT (IN) :: phy_ice(klon, 360)
500 REAL,
INTENT (IN) :: phy_fter(klon, 360)
501 REAL,
INTENT (IN) :: phy_foce(klon, 360)
502 REAL,
INTENT (IN) :: phy_flic(klon, 360)
503 REAL,
INTENT (IN) :: phy_fsic(klon, 360)
512 INTEGER nid, ndim, ntim
513 INTEGER dims(2), debut(2), epais(2)
515 INTEGER id_nat, id_sst, id_bils, id_rug, id_alb
516 INTEGER id_fter, id_foce, id_fsic, id_flic
518 IF (is_mpi_root .AND. is_omp_root)
THEN
520 print *,
'writelim: Ecriture du fichier limit'
522 ierr = nf_create(
'limit.nc', nf_clobber, nid)
524 ierr = nf_put_att_text(nid, nf_global,
'title', 30, &
525 'Fichier conditions aux limites')
527 ierr = nf_def_dim(nid,
'points_physiques',
klon_glo, ndim)
528 ierr = nf_def_dim(nid,
'time', nf_unlimited, ntim)
534 ierr = nf_def_var(nid,
'TEMPS', nf_double, 1, ntim, id_tim)
536 ierr = nf_def_var(nid,
'TEMPS', nf_float, 1, ntim, id_tim)
538 ierr = nf_put_att_text(nid, id_tim,
'title', 17,
'Jour dans l annee')
541 ierr = nf_def_var(nid,
'NAT', nf_double, 2, dims, id_nat)
543 ierr = nf_def_var(nid,
'NAT', nf_float, 2, dims, id_nat)
545 ierr = nf_put_att_text(nid, id_nat,
'title', 23, &
546 'Nature du sol (0,1,2,3)')
549 ierr = nf_def_var(nid,
'SST', nf_double, 2, dims, id_sst)
551 ierr = nf_def_var(nid,
'SST', nf_float, 2, dims, id_sst)
553 ierr = nf_put_att_text(nid, id_sst,
'title', 35, &
554 'Temperature superficielle de la mer')
557 ierr = nf_def_var(nid,
'BILS', nf_double, 2, dims, id_bils)
559 ierr = nf_def_var(nid,
'BILS', nf_float, 2, dims, id_bils)
561 ierr = nf_put_att_text(nid, id_bils,
'title', 32, &
562 'Reference flux de chaleur au sol')
565 ierr = nf_def_var(nid,
'ALB', nf_double, 2, dims, id_alb)
567 ierr = nf_def_var(nid,
'ALB', nf_float, 2, dims, id_alb)
569 ierr = nf_put_att_text(nid, id_alb,
'title', 19,
'Albedo a la surface')
572 ierr = nf_def_var(nid,
'RUG', nf_double, 2, dims, id_rug)
574 ierr = nf_def_var(nid,
'RUG', nf_float, 2, dims, id_rug)
576 ierr = nf_put_att_text(nid, id_rug,
'title', 8,
'Rugosite')
579 ierr = nf_def_var(nid,
'FTER', nf_double, 2, dims, id_fter)
581 ierr = nf_def_var(nid,
'FTER', nf_float, 2, dims, id_fter)
583 ierr = nf_put_att_text(nid, id_fter,
'title',10,
'Frac. Land')
585 ierr = nf_def_var(nid,
'FOCE', nf_double, 2, dims, id_foce)
587 ierr = nf_def_var(nid,
'FOCE', nf_float, 2, dims, id_foce)
589 ierr = nf_put_att_text(nid, id_foce,
'title',11,
'Frac. Ocean')
591 ierr = nf_def_var(nid,
'FSIC', nf_double, 2, dims, id_fsic)
593 ierr = nf_def_var(nid,
'FSIC', nf_float, 2, dims, id_fsic)
595 ierr = nf_put_att_text(nid, id_fsic,
'title',13,
'Frac. Sea Ice')
597 ierr = nf_def_var(nid,
'FLIC', nf_double, 2, dims, id_flic)
599 ierr = nf_def_var(nid,
'FLIC', nf_float, 2, dims, id_flic)
601 ierr = nf_put_att_text(nid, id_flic,
'title',14,
'Frac. Land Ice')
603 ierr = nf_enddef(nid)
604 IF (ierr/=nf_noerr)
THEN
605 WRITE (*, *)
'writelim error: failed to end define mode'
606 WRITE (*, *) nf_strerror(ierr)
613 ierr = nf_put_var1_double(nid, id_tim, k, dble(k))
615 ierr = nf_put_var1_real(nid, id_tim, k, float(k))
617 IF (ierr/=nf_noerr)
THEN
618 WRITE (*, *)
'writelim error with temps(k),k=', k
619 WRITE (*, *) nf_strerror(ierr)
627 CALL gather(phy_nat, phy_glo)
628 IF (is_mpi_root .AND. is_omp_root)
THEN
630 ierr = nf_put_var_double(nid, id_nat, phy_glo)
632 ierr = nf_put_var_real(nid, id_nat, phy_glo)
634 IF (ierr/=nf_noerr)
THEN
635 WRITE (*, *)
'writelim error with phy_nat'
636 WRITE (*, *) nf_strerror(ierr)
640 CALL gather(phy_sst, phy_glo)
641 IF (is_mpi_root .AND. is_omp_root)
THEN
643 ierr = nf_put_var_double(nid, id_sst, phy_glo)
645 ierr = nf_put_var_real(nid, id_sst, phy_glo)
647 IF (ierr/=nf_noerr)
THEN
648 WRITE (*, *)
'writelim error with phy_sst'
649 WRITE (*, *) nf_strerror(ierr)
653 CALL gather(phy_bil, phy_glo)
654 IF (is_mpi_root .AND. is_omp_root)
THEN
656 ierr = nf_put_var_double(nid, id_bils, phy_glo)
658 ierr = nf_put_var_real(nid, id_bils, phy_glo)
660 IF (ierr/=nf_noerr)
THEN
661 WRITE (*, *)
'writelim error with phy_bil'
662 WRITE (*, *) nf_strerror(ierr)
666 CALL gather(phy_alb, phy_glo)
667 IF (is_mpi_root .AND. is_omp_root)
THEN
669 ierr = nf_put_var_double(nid, id_alb, phy_glo)
671 ierr = nf_put_var_real(nid, id_alb, phy_glo)
673 IF (ierr/=nf_noerr)
THEN
674 WRITE (*, *)
'writelim error with phy_alb'
675 WRITE (*, *) nf_strerror(ierr)
679 CALL gather(phy_rug, phy_glo)
680 IF (is_mpi_root .AND. is_omp_root)
THEN
682 ierr = nf_put_var_double(nid, id_rug, phy_glo)
684 ierr = nf_put_var_real(nid, id_rug, phy_glo)
686 IF (ierr/=nf_noerr)
THEN
687 WRITE (*, *)
'writelim error with phy_rug'
688 WRITE (*, *) nf_strerror(ierr)
692 CALL gather(phy_fter, phy_glo)
693 IF (is_mpi_root .AND. is_omp_root)
THEN
695 ierr = nf_put_var_double(nid, id_fter, phy_glo)
697 ierr = nf_put_var_real(nid, id_fter, phy_glo)
699 IF (ierr/=nf_noerr)
THEN
700 WRITE (*, *)
'writelim error with phy_fter'
701 WRITE (*, *) nf_strerror(ierr)
705 CALL gather(phy_foce, phy_glo)
706 IF (is_mpi_root .AND. is_omp_root)
THEN
708 ierr = nf_put_var_double(nid, id_foce, phy_glo)
710 ierr = nf_put_var_real(nid, id_foce, phy_glo)
712 IF (ierr/=nf_noerr)
THEN
713 WRITE (*, *)
'writelim error with phy_foce'
714 WRITE (*, *) nf_strerror(ierr)
718 CALL gather(phy_fsic, phy_glo)
719 IF (is_mpi_root .AND. is_omp_root)
THEN
721 ierr = nf_put_var_double(nid, id_fsic, phy_glo)
723 ierr = nf_put_var_real(nid, id_fsic, phy_glo)
725 IF (ierr/=nf_noerr)
THEN
726 WRITE (*, *)
'writelim error with phy_fsic'
727 WRITE (*, *) nf_strerror(ierr)
731 CALL gather(phy_flic, phy_glo)
732 IF (is_mpi_root .AND. is_omp_root)
THEN
734 ierr = nf_put_var_double(nid, id_flic, phy_glo)
736 ierr = nf_put_var_real(nid, id_flic, phy_glo)
738 IF (ierr/=nf_noerr)
THEN
739 WRITE (*, *)
'writelim error with phy_flic'
740 WRITE (*, *) nf_strerror(ierr)
745 IF (is_mpi_root .AND. is_omp_root)
THEN
753 SUBROUTINE profil_sst(nlon, rlatd, type_profil, phy_sst)
757 INTEGER nlon, type_profil, i, k, j
758 REAL :: rlatd(nlon), phy_sst(nlon, 360)
759 INTEGER imn, imx, amn, amx, kmn, kmx
760 INTEGER p, pplus, nlat_max
762 REAL x_anom_sst(nlat_max)
764 IF (
klon/=nlon) stop
'probleme de dimensions dans iniaqua'
765 WRITE (*, *)
' profil_sst: type_profil=', type_profil
771 IF (type_profil==1)
THEN
774 phy_sst(j, i) = 273. + 27.*(1-sin(1.5*rlatd(j))**2)
776 IF ((rlatd(j)>1.0471975) .OR. (rlatd(j)<-1.0471975))
THEN
781 IF (type_profil==2)
THEN
784 phy_sst(j, i) = 273. + 27.*(1-sin(1.5*rlatd(j))**4)
785 IF ((rlatd(j)>1.0471975) .OR. (rlatd(j)<-1.0471975))
THEN
792 IF (type_profil==3)
THEN
795 phy_sst(j, i) = 273. + 0.5*27.*(2-sin(1.5*rlatd(j))**2-sin(1.5* &
797 IF ((rlatd(j)>1.0471975) .OR. (rlatd(j)<-1.0471975))
THEN
803 IF (type_profil==4)
THEN
806 phy_sst(j, i) = 273. + 0.5*29.*(2-sin(1.5*rlatd(j))**2-sin(1.5* &
808 IF ((rlatd(j)>1.0471975) .OR. (rlatd(j)<-1.0471975))
THEN
814 IF (type_profil==5)
THEN
817 phy_sst(j, i) = 273. + 2. + 0.5*27.*(2-sin(1.5*rlatd(j))**2-sin(1.5 &
819 IF ((rlatd(j)>1.0471975) .OR. (rlatd(j)<-1.0471975))
THEN
820 phy_sst(j, i) = 273. + 2.
826 IF (type_profil==6)
THEN
834 IF (type_profil==7)
THEN
837 phy_sst(j, i) = 288. + 2.
842 IF (type_profil==8)
THEN
845 IF (rlatd(j)==rlatd(j-1))
THEN
846 phy_sst(j, i) = 273. + x_anom_sst(pplus) + &
847 0.5*27.*(2-sin(1.5*rlatd(j))**2-sin(1.5*rlatd(j))**4)
848 IF ((rlatd(j)>1.0471975) .OR. (rlatd(j)<-1.0471975))
THEN
849 phy_sst(j, i) = 273. + x_anom_sst(pplus)
854 phy_sst(j, i) = 273. + x_anom_sst(pplus) + &
855 0.5*27.*(2-sin(1.5*rlatd(j))**2-sin(1.5*rlatd(j))**4)
856 IF ((rlatd(j)>1.0471975) .OR. (rlatd(j)<-1.0471975))
THEN
857 phy_sst(j, i) = 273. + x_anom_sst(pplus)
859 WRITE (*, *) rlatd(j), x_anom_sst(pplus), phy_sst(j, i)
864 IF (type_profil==9)
THEN
867 phy_sst(j, i) = 273. - 2. + 0.5*27.*(2-sin(1.5*rlatd(j))**2-sin(1.5 &
869 IF ((rlatd(j)>1.0471975) .OR. (rlatd(j)<-1.0471975))
THEN
870 phy_sst(j, i) = 273. - 2.
876 IF (type_profil==10)
THEN
879 phy_sst(j, i) = 273. + 4. + 0.5*27.*(2-sin(1.5*rlatd(j))**2-sin(1.5 &
881 IF ((rlatd(j)>1.0471975) .OR. (rlatd(j)<-1.0471975))
THEN
882 phy_sst(j, i) = 273. + 4.
887 IF (type_profil==11)
THEN
890 phy_sst(j, i) = 273. + 0.5*27.*(2-sin(1.5*rlatd(j))**2-sin(1.5* &
892 IF ((rlatd(j)>1.0471975) .OR. (rlatd(j)<-1.0471975))
THEN
898 IF (type_profil==12)
THEN
901 phy_sst(j, i) = 273. + 4. + 0.5*27.*(2-sin(1.5*rlatd(j))**2-sin(1.5 &
903 IF ((rlatd(j)>1.0471975) .OR. (rlatd(j)<-1.0471975))
THEN
904 phy_sst(j, i) = 273. + 4.
909 IF (type_profil==13)
THEN
912 phy_sst(j, i) = 273. + 0.5*29.*(2-sin(1.5*rlatd(j))**2-sin(1.5* &
914 IF ((rlatd(j)>1.0471975) .OR. (rlatd(j)<-1.0471975))
THEN
920 IF (type_profil==14)
THEN
923 phy_sst(j, i) = 273. + 2. + 0.5*29.*(2-sin(1.5*rlatd(j))**2-sin(1.5 &
925 IF ((rlatd(j)>1.0471975) .OR. (rlatd(j)<-1.0471975))
THEN
931 if (type_profil.EQ.20)
then
932 print*,
'Profile SST 20'
936 phy_sst(j,i)=248.+55.*(1-sin(rlatd(j))**2)
940 if (type_profil.EQ.21)
then
941 print*,
'Profile SST 21'
944 phy_sst(j,i)=252.+55.*(1-sin(rlatd(j))**2)
953 amn = min(phy_sst(1,1), 1000.)
954 amx = max(phy_sst(1,1), -1000.)
961 IF (phy_sst(i,k)<amn)
THEN
966 IF (phy_sst(i,k)>amx)
THEN
974 print *,
'profil_sst: imn, kmn, phy_sst(imn,kmn) ', imn, kmn, amn
975 print *,
'profil_sst: imx, kmx, phy_sst(imx,kmx) ', imx, kmx, amx
subroutine zenang_an(cycle_diurne, gmtime, rlat, rlon, rmu0, fract)
real, dimension(:,:), allocatable, save q_ancien
real, dimension(:,:), allocatable, save w01
real, dimension(:,:), allocatable, save clwcon
integer, parameter is_ter
real, dimension(:), allocatable, save f0
real, dimension(:), allocatable, save zval
real, dimension(:), allocatable, save zsig
real, dimension(:), allocatable, save snow_fall
!$Id ok_orolf LOGICAL ok_limitvrai LOGICAL ok_all_xml INTEGER iflag_con
real, dimension(:,:), allocatable, save wake_deltaq
!$Id klon initialisation mois suivants day_rain itap
real, dimension(:,:), allocatable, save falb1
real, dimension(:), allocatable, save rain_fall
real, dimension(:,:), allocatable, save sig1
real, dimension(:,:), allocatable, save t_ancien
c c $Id c c calculs statistiques distribution nuage ftion du regime dynamique c c Ce calcul doit etre fait a partir de valeurs mensuelles CALL nbregdyn DO kmaxm1 DO l
subroutine fonte_neige_init(restart_runoff)
real, dimension(:), allocatable, save zmea
subroutine phyredem(fichnom)
real, dimension(:,:), allocatable, save pctsrf
real, dimension(:,:), allocatable, save falb2
real, dimension(:), allocatable, save radsol
real, dimension(:,:), allocatable, save entr_therm
!$Id mode_top_bound COMMON comconstr && pi
c c $Id c c calculs statistiques distribution nuage ftion du regime dynamique c c Ce calcul doit etre fait a partir de valeurs mensuelles CALL nbregdyn DO k
real, dimension(:), allocatable, save qsol
!$Id ysinus ok_gradsfile hybrid COMMON logici iflag_phys
!$Id klon initialisation mois suivants day_rain itap ENDIF!Calcul fin de nday_rain calcul nday_rain itap DO i
real, dimension(:,:,:), allocatable, save pbl_tke
real, dimension(:), allocatable, save sollw
real, dimension(:,:), allocatable, save rnebcon
!$Header!c include clesph0 h c COMMON clesph0 nbapp_rad
subroutine iniaqua(nlon, iflag_phys)
!$Id Turb_fcg_gcssold get_uvd it
real, dimension(:), allocatable, save wake_s
real, dimension(:), allocatable, save wake_cstar
!$Header!integer nvarmx s s s var
real, dimension(:,:), allocatable, save z0m
real, dimension(:), allocatable, save rugoro
integer, parameter is_lic
real, dimension(:), allocatable, save zpic
subroutine writelim(klon, phy_nat, phy_alb, phy_sst, phy_bil, phy_rug, phy_ice, phy_fter, phy_foce, phy_flic, phy_fsic)
!$Id ok_orolf LOGICAL ok_limitvrai LOGICAL ok_all_xml INTEGER iflag_ener_conserv REAL co2_ppm
!$Id Turb_fcg_gcssold get_uvd hqturb_gcssold endif!large scale llm &&& day
real, dimension(:,:), allocatable, save fm_therm
real, dimension(:), allocatable, save solsw
real, dimension(:), allocatable, save zgam
!$Header!integer nvarmx parameter(nfmx=10, imx=200, jmx=150, lmx=200, nvarmx=1000) real xd(imx
real, dimension(:), allocatable, save wake_fip
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL ulevSTD CALL &zphi philevSTD CALL &zx_rh rhlevSTD!DO klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon du jour ou toutes les read_climoz CALL true
character(len=6), save type_ocean
!$Id zjulian!correction pour l heure initiale!jyg!jyg CALL pdtphys
subroutine phys_state_var_end
real, dimension(:), allocatable, save wake_pe
real, dimension(:,:), allocatable, save agesno
subroutine phys_state_var_init()
real, dimension(:,:), allocatable, save ratqs
real, dimension(:), allocatable, save zstd
subroutine pbl_surface_init(fder_rst, snow_rst, qsurf_rst, ftsoil_rst)
integer, parameter is_sic
real, dimension(:,:), allocatable, save fevap
real, dimension(:), allocatable, save zmax0
nrlmd
real, dimension(:,:), allocatable, save z0h
real, dimension(:,:), allocatable, save ftsol
real, dimension(:,:), allocatable, save u_ancien
real, dimension(:), allocatable, save zthe
!$Header!integer nvarmx s s unit
integer, parameter is_oce
subroutine profil_sst(nlon, rlatd, type_profil, phy_sst)
real, dimension(:,:), allocatable, save detr_therm
real, dimension(:,:), allocatable, save v_ancien
real, dimension(:), allocatable, save latitude
real, dimension(:,:), allocatable, save wake_deltat