[3] | 1 | ! |
---|
| 2 | ! $Header: /home/cvsroot/LMDZ4/libf/phylmd/interface_surf.F90,v 1.6 2005/02/24 09:58:18 fairhead Exp $ |
---|
| 3 | ! |
---|
| 4 | |
---|
| 5 | MODULE interface_surf |
---|
| 6 | |
---|
| 7 | ! Ce module regroupe toutes les routines gerant l'interface entre le modele |
---|
| 8 | ! atmospherique et les modeles de surface (sols continentaux, oceans, glaces) |
---|
| 9 | ! Les routines sont les suivantes: |
---|
| 10 | ! |
---|
| 11 | ! interfsurf_*: routines d'aiguillage vers les interfaces avec les |
---|
| 12 | ! differents modeles de surface |
---|
| 13 | ! |
---|
| 14 | ! L. Fairhead, LMD, 02/2000 |
---|
| 15 | |
---|
| 16 | USE ioipsl |
---|
| 17 | |
---|
| 18 | IMPLICIT none |
---|
| 19 | |
---|
| 20 | PRIVATE |
---|
| 21 | PUBLIC :: interfsurf,interfsurf_hq |
---|
| 22 | |
---|
| 23 | INTERFACE interfsurf |
---|
| 24 | module procedure interfsurf_hq |
---|
| 25 | END INTERFACE |
---|
| 26 | |
---|
[97] | 27 | #include "YOMCST.h" |
---|
[3] | 28 | |
---|
| 29 | CONTAINS |
---|
| 30 | ! |
---|
| 31 | !############################################################################ |
---|
| 32 | ! |
---|
| 33 | ! ADAPTATION GCM POUR CP(T) |
---|
| 34 | SUBROUTINE interfsurf_hq(itime, dtime, rmu0, & |
---|
| 35 | & klon, iim, jjm, knon, & |
---|
| 36 | & rlon, rlat, cufi, cvfi, & |
---|
| 37 | & debut, lafin, soil_model, nsoilmx, tsoil, & |
---|
| 38 | & zlev, u1_lay, v1_lay, temp_air, epot_air, & |
---|
| 39 | & tq_cdrag, petAcoef, petBcoef, & |
---|
| 40 | & sollw, sollwdown, swnet, swdown, & |
---|
| 41 | & fder, taux, tauy, & |
---|
| 42 | & albedo, & |
---|
| 43 | & tsurf, pkh1, p1lay, radsol, & |
---|
| 44 | & fluxsens, dflux_s, & |
---|
| 45 | & tsol_rad, tsurf_new, alb_new) |
---|
| 46 | |
---|
| 47 | |
---|
| 48 | ! Cette routine sert d'aiguillage entre l'atmosphere et la surface en general |
---|
| 49 | ! (sols continentaux, oceans, glaces) pour les fluxs de chaleur et d'humidite. |
---|
| 50 | ! En pratique l'interface se fait entre la couche limite du modele |
---|
| 51 | ! atmospherique (clmain.F) et les routines de surface (sechiba, oasis, ...) |
---|
| 52 | ! |
---|
| 53 | ! |
---|
| 54 | ! L.Fairhead 02/2000 |
---|
| 55 | ! |
---|
| 56 | ! input: |
---|
| 57 | ! itime numero du pas de temps |
---|
| 58 | ! klon nombre total de points de grille |
---|
| 59 | ! iim, jjm nbres de pts de grille |
---|
| 60 | ! dtime pas de temps de la physique (en s) |
---|
| 61 | ! rmu0 cosinus de l'angle solaire zenithal |
---|
| 62 | ! knon nombre de points de la surface a traiter |
---|
| 63 | ! rlon longitudes |
---|
| 64 | ! rlat latitudes |
---|
| 65 | ! cufi,cvfi resolution des mailles en x et y (m) |
---|
| 66 | ! debut logical: 1er appel a la physique |
---|
| 67 | ! lafin logical: dernier appel a la physique |
---|
| 68 | ! zlev hauteur de la premiere couche |
---|
| 69 | ! u1_lay vitesse u 1ere couche |
---|
| 70 | ! v1_lay vitesse v 1ere couche |
---|
| 71 | ! temp_air temperature de l'air 1ere couche |
---|
| 72 | ! epot_air temp potentielle de l'air |
---|
| 73 | ! tq_cdrag cdrag |
---|
| 74 | ! petAcoef coeff. A de la resolution de la CL pour t |
---|
| 75 | ! petBcoef coeff. B de la resolution de la CL pour t |
---|
| 76 | ! sollw flux IR net a la surface |
---|
| 77 | ! sollwdown flux IR descendant a la surface |
---|
| 78 | ! swnet flux solaire net |
---|
| 79 | ! swdown flux solaire entrant a la surface |
---|
| 80 | ! albedo albedo de la surface |
---|
| 81 | ! tsurf temperature de surface |
---|
| 82 | ! pkh1 fct Exner à la surface: RCPD*(paprs(1)/preff)**RKAPPA |
---|
| 83 | ! p1lay pression 1er niveau (milieu de couche) |
---|
| 84 | ! radsol rayonnement net aus sol (LW + SW) |
---|
| 85 | ! fder derivee des flux (pour le couplage) |
---|
| 86 | ! taux, tauy tension de vents |
---|
| 87 | ! |
---|
| 88 | ! output: |
---|
| 89 | ! fluxsens flux de chaleur sensible |
---|
| 90 | ! tsol_rad |
---|
| 91 | ! tsurf_new temperature au sol |
---|
| 92 | ! alb_new albedo |
---|
| 93 | |
---|
| 94 | #include "iniprint.h" |
---|
| 95 | |
---|
| 96 | |
---|
| 97 | ! Parametres d'entree |
---|
| 98 | integer, intent(IN) :: itime |
---|
| 99 | integer, intent(IN) :: iim, jjm |
---|
| 100 | integer, intent(IN) :: klon |
---|
| 101 | real, intent(IN) :: dtime |
---|
| 102 | real, intent(IN) :: rmu0(klon) |
---|
| 103 | integer, intent(IN) :: knon |
---|
| 104 | logical, intent(IN) :: debut, lafin |
---|
| 105 | real, dimension(klon), intent(IN) :: rlon, rlat |
---|
| 106 | real, dimension(klon), intent(IN) :: cufi, cvfi |
---|
| 107 | real, dimension(klon), intent(INOUT) :: tq_cdrag |
---|
| 108 | real, dimension(klon), intent(IN) :: zlev |
---|
| 109 | real, dimension(klon), intent(IN) :: u1_lay, v1_lay |
---|
| 110 | real, dimension(klon), intent(IN) :: temp_air |
---|
| 111 | real, dimension(klon), intent(IN) :: epot_air |
---|
| 112 | real, dimension(klon), intent(IN) :: petAcoef |
---|
| 113 | real, dimension(klon), intent(IN) :: petBcoef |
---|
| 114 | real, dimension(klon), intent(IN) :: sollw, sollwdown, swnet, swdown |
---|
| 115 | real, dimension(klon), intent(IN) :: albedo |
---|
| 116 | real, dimension(klon), intent(IN) :: tsurf, pkh1, p1lay |
---|
| 117 | REAL, DIMENSION(klon), INTENT(INOUT) :: radsol,fder |
---|
| 118 | real, dimension(klon), intent(IN) :: taux, tauy |
---|
| 119 | !! PB ajout pour soil |
---|
| 120 | logical :: soil_model |
---|
| 121 | integer :: nsoilmx |
---|
| 122 | REAL, DIMENSION(klon, nsoilmx) :: tsoil |
---|
| 123 | REAL, dimension(klon) :: soilcap |
---|
| 124 | REAL, dimension(klon) :: soilflux |
---|
| 125 | ! Parametres de sortie |
---|
| 126 | real, dimension(klon), intent(OUT):: fluxsens |
---|
| 127 | real, dimension(klon), intent(OUT):: tsol_rad, tsurf_new, alb_new |
---|
| 128 | real, dimension(klon), intent(OUT):: dflux_s |
---|
| 129 | |
---|
| 130 | ! Local |
---|
| 131 | character (len = 20),save :: modname = 'interfsurf_hq' |
---|
| 132 | character (len = 80) :: abort_message |
---|
| 133 | integer, save :: error |
---|
| 134 | integer :: ii, index |
---|
| 135 | logical,save :: check = .false. |
---|
| 136 | real, dimension(klon):: cal, beta, capsol |
---|
| 137 | real, dimension(klon):: tsurf_temp, zcp |
---|
| 138 | INTEGER,dimension(1) :: iloc |
---|
| 139 | INTEGER :: isize |
---|
| 140 | real, dimension(klon):: fder_prev |
---|
| 141 | |
---|
| 142 | if (check) write(*,*) 'Entree ', modname |
---|
| 143 | |
---|
| 144 | ! Initialisations diverses |
---|
| 145 | ! |
---|
| 146 | cal = 999999. ; beta = 999999. ; capsol = 999999. |
---|
| 147 | alb_new = albedo |
---|
| 148 | tsurf_new = 999999. |
---|
| 149 | |
---|
| 150 | ! ADAPTATION GCM POUR CP(T) |
---|
| 151 | zcp(1:klon) = cpdet(tsurf(1:klon)) |
---|
| 152 | |
---|
| 153 | IF (soil_model) THEN |
---|
| 154 | CALL soil(dtime, knon, tsurf, tsoil,soilcap, soilflux) |
---|
| 155 | cal(1:knon) = zcp(1:knon) / soilcap(1:knon) |
---|
| 156 | ! print*,"DIAGNOSTIC SOIL" |
---|
| 157 | ! print*,"soilcap=",soilcap |
---|
| 158 | ! print*,"soilflux=",soilflux |
---|
| 159 | ! print*,"radsol=",radsol(knon/2) |
---|
| 160 | radsol(1:knon) = radsol(1:knon) + soilflux(1:knon) |
---|
| 161 | ELSE |
---|
| 162 | ! abort_message = "PAS DE MODELE DE SOL: CALCUL SOILCAP!!" |
---|
| 163 | ! call abort_gcm(modname,abort_message,1) |
---|
| 164 | ! VENUS: Valeur pour inertie = 200: |
---|
| 165 | soilcap = 14735. |
---|
| 166 | print*,"PAS DE MODELE DE SOL, soilcap=",soilcap |
---|
| 167 | cal(1:knon) = zcp(1:knon) / soilcap(1:knon) |
---|
| 168 | ENDIF |
---|
| 169 | ! ADAPTATION GCM POUR CP(T) |
---|
| 170 | CALL calcul_fluxs( klon, knon, dtime, & |
---|
| 171 | & tsurf, zcp, pkh1, p1lay, cal, beta, tq_cdrag, & |
---|
| 172 | & radsol, temp_air, u1_lay, v1_lay, & |
---|
| 173 | & petAcoef, petBcoef, & |
---|
| 174 | & tsurf_new, fluxsens, dflux_s ) |
---|
| 175 | |
---|
| 176 | END SUBROUTINE interfsurf_hq |
---|
| 177 | |
---|
| 178 | ! |
---|
| 179 | !######################################################################### |
---|
| 180 | ! |
---|
| 181 | SUBROUTINE calcul_fluxs( klon, knon, dtime, & |
---|
| 182 | ! ADAPTATION GCM POUR CP(T) |
---|
| 183 | & tsurf, zcp, pkh1, p1lay, cal, beta, coef1lay, & |
---|
| 184 | & radsol, t1lay, u1lay, v1lay, & |
---|
| 185 | & petAcoef, petBcoef, & |
---|
| 186 | & tsurf_new, fluxsens, dflux_s) |
---|
| 187 | |
---|
| 188 | ! Cette routine calcule les fluxs en h a l'interface et eventuellement |
---|
| 189 | ! une temperature de surface (au cas ou ok_veget = false) |
---|
| 190 | ! |
---|
| 191 | ! L. Fairhead 4/2000 |
---|
| 192 | ! |
---|
| 193 | ! input: |
---|
| 194 | ! knon nombre de points a traiter |
---|
| 195 | ! tsurf temperature de surface |
---|
| 196 | ! zcp Cp(Tsurf) |
---|
| 197 | ! pkh1 fct Exner à la surface: RCPD*(paprs(1)/preff)**RKAPPA |
---|
| 198 | ! p1lay pression 1er niveau (milieu de couche) |
---|
| 199 | ! cal capacite calorifique du sol |
---|
| 200 | ! beta evap reelle |
---|
| 201 | ! coef1lay coefficient d'echange |
---|
| 202 | ! petAcoef coeff. A de la resolution de la CL pour t |
---|
| 203 | ! petBcoef coeff. B de la resolution de la CL pour t |
---|
| 204 | ! radsol rayonnement net aus sol (LW + SW) |
---|
| 205 | ! |
---|
| 206 | ! output: |
---|
| 207 | ! tsurf_new temperature au sol |
---|
| 208 | ! fluxsens flux de chaleur sensible |
---|
| 209 | ! dflux_s derivee du flux de chaleur sensible / Ts |
---|
| 210 | ! |
---|
| 211 | |
---|
| 212 | ! Parametres d'entree |
---|
| 213 | integer, intent(IN) :: knon, klon |
---|
| 214 | real , intent(IN) :: dtime |
---|
| 215 | real, dimension(klon), intent(IN) :: petAcoef |
---|
| 216 | real, dimension(klon), intent(IN) :: petBcoef |
---|
| 217 | ! ADAPTATION GCM POUR CP(T) |
---|
| 218 | real, dimension(klon), intent(IN) :: tsurf,pkh1,zcp |
---|
| 219 | real, dimension(klon), intent(IN) :: p1lay, cal, beta, coef1lay |
---|
| 220 | real, dimension(klon), intent(IN) :: radsol |
---|
| 221 | real, dimension(klon), intent(IN) :: t1lay, u1lay, v1lay |
---|
| 222 | |
---|
| 223 | ! Parametres sorties |
---|
| 224 | real, dimension(klon), intent(OUT):: tsurf_new, fluxsens |
---|
| 225 | real, dimension(klon), intent(OUT):: dflux_s |
---|
| 226 | |
---|
| 227 | ! Variables locales |
---|
| 228 | integer :: i |
---|
| 229 | real, dimension(klon) :: zx_mh, zx_nh, zx_oh |
---|
| 230 | real, dimension(klon) :: zx_coef |
---|
| 231 | real, dimension(klon) :: ztetasurf,ztetasurf_new |
---|
| 232 | real, dimension(klon) :: zx_k1 |
---|
| 233 | real, dimension(klon) :: zx_q_0 , d_ts |
---|
| 234 | real :: zdelta, zcvm5, zcor |
---|
| 235 | ! |
---|
| 236 | logical, save :: check = .false. |
---|
| 237 | character (len = 20) :: modname = 'calcul_fluxs' |
---|
| 238 | character (len = 80) :: abort_message |
---|
| 239 | logical,save :: first = .true.,second=.false. |
---|
| 240 | |
---|
| 241 | if (check) write(*,*)'Entree ', modname |
---|
| 242 | |
---|
| 243 | IF (check) THEN |
---|
| 244 | WRITE(*,*)' radsol (min, max)' & |
---|
| 245 | & , MINVAL(radsol(1:knon)), MAXVAL(radsol(1:knon)) |
---|
| 246 | CALL flush(6) |
---|
| 247 | ENDIF |
---|
| 248 | |
---|
| 249 | ! |
---|
| 250 | ! Initialisation |
---|
| 251 | ! |
---|
| 252 | fluxsens=0. |
---|
| 253 | dflux_s = 0. |
---|
| 254 | ! |
---|
| 255 | DO i = 1, knon |
---|
| 256 | |
---|
| 257 | zx_coef(i) = coef1lay(i) & |
---|
| 258 | & * (1.0+SQRT(u1lay(i)**2+v1lay(i)**2)) & |
---|
| 259 | & * p1lay(i)/(RD*t1lay(i)) |
---|
| 260 | |
---|
| 261 | ENDDO |
---|
| 262 | |
---|
| 263 | |
---|
| 264 | ! === Calcul de la temperature de surface === |
---|
| 265 | ! |
---|
| 266 | ! MODIF VENUS: |
---|
| 267 | ! Le calcul se fait en temperature potentielle |
---|
| 268 | |
---|
| 269 | call t2tpot(knon,tsurf,ztetasurf,pkh1) |
---|
| 270 | |
---|
| 271 | do i = 1, knon |
---|
| 272 | zx_k1(i) = zx_coef(i) |
---|
| 273 | enddo |
---|
| 274 | |
---|
| 275 | |
---|
| 276 | do i = 1, knon |
---|
| 277 | |
---|
| 278 | ! H |
---|
| 279 | zx_oh(i) = 1. - (zx_k1(i) * petBcoef(i) * dtime) |
---|
| 280 | zx_mh(i) = zx_k1(i) * petAcoef(i) / zx_oh(i) |
---|
| 281 | ! Derives des flux dF/d(teta)s: |
---|
| 282 | zx_nh(i) = - (zx_k1(i) * zcp(i))/ zx_oh(i) |
---|
| 283 | ! Derives des flux dF/dTs (W m-2 K-1): version Terre |
---|
| 284 | ! zx_nh(i) = - (zx_k1(i) * RCPD * zx_pkh(i))/ zx_oh(i) |
---|
| 285 | |
---|
| 286 | ! Tsurface Version Terre |
---|
| 287 | ! |
---|
| 288 | ! tsurf_new(i) = (tsurf(i) + cal(i)/(RCPD * zx_pkh(i)) * dtime * & |
---|
| 289 | ! & (radsol(i) + zx_mh(i)) & |
---|
| 290 | ! & + dif_grnd(i) * t_grnd * dtime)/ & |
---|
| 291 | ! & ( 1. - dtime * cal(i)/(RCPD * zx_pkh(i)) * & |
---|
| 292 | ! & zx_nh(i) & |
---|
| 293 | ! & + dtime * dif_grnd(i)) |
---|
| 294 | ! |
---|
| 295 | ! d_ts(i) = tsurf_new(i) - tsurf(i) |
---|
| 296 | ! fluxsens(i) = zx_mh(i) + zx_nh(i) * tsurf_new(i) |
---|
| 297 | ! Derives des flux dF/dTs (W m-2 K-1): |
---|
| 298 | ! dflux_s(i) = zx_nh(i) |
---|
| 299 | |
---|
| 300 | ! MODIF VENUS : on vire dif_grnd (=0) et t_grnd |
---|
| 301 | ! et on travaille en teta |
---|
| 302 | |
---|
| 303 | ztetasurf_new(i) = (ztetasurf(i) + cal(i)/zcp(i) * dtime * & |
---|
| 304 | & (radsol(i) + zx_mh(i)) & |
---|
| 305 | & ) / & |
---|
| 306 | & ( 1. - cal(i)/zcp(i) * dtime * & |
---|
| 307 | & zx_nh(i) ) |
---|
| 308 | ENDDO |
---|
| 309 | |
---|
| 310 | call tpot2t(knon,ztetasurf_new,tsurf_new,pkh1) |
---|
| 311 | |
---|
| 312 | do i = 1, knon |
---|
| 313 | d_ts(i) = tsurf_new(i) - tsurf(i) |
---|
| 314 | fluxsens(i) = zx_mh(i) + zx_nh(i) * ztetasurf_new(i) |
---|
| 315 | ! Derives des flux dF/dTs (W m-2 K-1): |
---|
| 316 | dflux_s(i) = zx_nh(i)*ztetasurf(i)/tsurf(i) |
---|
| 317 | ENDDO |
---|
| 318 | |
---|
| 319 | END SUBROUTINE calcul_fluxs |
---|
| 320 | ! |
---|
| 321 | !######################################################################### |
---|
| 322 | ! |
---|
| 323 | END MODULE interface_surf |
---|