[2] | 1 | SUBROUTINE condsurf( jour, jourvrai, pctsrf, |
---|
| 2 | s lmt_sst,lmt_alb,lmt_rug,lmt_bils ) |
---|
| 3 | IMPLICIT none |
---|
| 4 | c |
---|
| 5 | c Lire les conditions aux limites du modele. |
---|
| 6 | c ----------------------------------------- |
---|
| 7 | c jour : input , numero du jour a lire |
---|
| 8 | c jourvrai : input , vrai jour de la simulation |
---|
| 9 | c |
---|
| 10 | c pctsrf: sous-maille fractionnelle, la somme doit = 1 |
---|
| 11 | c lmt_sst: temperature de la surface oceanique |
---|
| 12 | c lmt_alb: albedo du sol |
---|
| 13 | c lmt_rug: longeur de rugosite du sol |
---|
| 14 | c lmt_bils: bilan chaleur au sol (a utiliser pour "slab-ocean") |
---|
| 15 | c |
---|
| 16 | #include "netcdf.inc" |
---|
| 17 | INTEGER nid, nvarid |
---|
| 18 | INTEGER debut(2) |
---|
| 19 | INTEGER epais(2) |
---|
| 20 | INTEGER lnblnk |
---|
| 21 | EXTERNAL lnblnk |
---|
| 22 | c |
---|
| 23 | #include "dimensions.h" |
---|
| 24 | #include "dimphy.h" |
---|
| 25 | #include "indicesol.h" |
---|
| 26 | #include "temps.h" |
---|
| 27 | #include "clesphys.h" |
---|
| 28 | c |
---|
| 29 | c newlmt indique l'utilisation de la sous-maille fractionnelle, |
---|
| 30 | c tandis que l'ancien regime utilisait l'indicateur du sol (0,1,2,3). |
---|
| 31 | |
---|
| 32 | LOGICAL newlmt |
---|
| 33 | PARAMETER (newlmt=.FALSE.) |
---|
| 34 | |
---|
| 35 | INTEGER nannemax |
---|
| 36 | PARAMETER ( nannemax = 60 ) |
---|
| 37 | c |
---|
| 38 | INTEGER jour,jourvrai |
---|
| 39 | REAL lmt_nat(klon) ! indicateur de la nature du sol |
---|
| 40 | REAL pctsrf(klon,nbsrf) ! sous-maille fractionnelle |
---|
| 41 | REAL lmt_sst(klon) ! temperature de la surface oceanique |
---|
| 42 | REAL lmt_alb(klon) ! albedo du sol |
---|
| 43 | REAL lmt_rug(klon) ! longeur de rugosite du sol |
---|
| 44 | REAL lmt_bils(klon) |
---|
| 45 | c |
---|
| 46 | c Couplage OASIS: |
---|
| 47 | #include "oasis.h" |
---|
| 48 | REAL cpl_sst(iim,jjm+1), cpl_sic(iim,jjm+1) |
---|
| 49 | REAL cpl_alb_sst(iim,jjm+1), cpl_alb_sic(iim,jjm+1) |
---|
| 50 | c |
---|
| 51 | c Variables locales: |
---|
| 52 | INTEGER ig, i, j, kt, ierr |
---|
| 53 | LOGICAL ok |
---|
| 54 | INTEGER anneelim,anneemax |
---|
| 55 | CHARACTER*20 fich |
---|
| 56 | cc |
---|
| 57 | cc ..................................................................... |
---|
| 58 | cc |
---|
| 59 | cc Pour lire le fichier limit correspondant vraiment a l'annee de la |
---|
| 60 | cc simulation en cours , il suffit de mettre ok_limitvrai = .TRUE. |
---|
| 61 | cc |
---|
| 62 | cc ...................................................................... |
---|
| 63 | c |
---|
| 64 | c |
---|
| 65 | IF (jour.LT.0 .OR. jour.GT.(360-1)) THEN |
---|
| 66 | PRINT*,'Le jour demande n est pas correct: ', jour |
---|
| 67 | CALL ABORT |
---|
| 68 | ENDIF |
---|
| 69 | c |
---|
| 70 | c ............. modif ( P. Le Van ) ........... |
---|
| 71 | |
---|
| 72 | anneelim = anne_ini |
---|
| 73 | anneemax = anne_ini + nannemax |
---|
| 74 | c |
---|
| 75 | c |
---|
| 76 | IF( ok_limitvrai ) THEN |
---|
| 77 | DO kt = 1, nannemax |
---|
| 78 | IF(jourvrai.LE. (kt-1)*360 + 359 ) THEN |
---|
| 79 | WRITE(fich,'("limit",i4,".nc")') anneelim |
---|
| 80 | PRINT *,' Fichier Limite ',fich |
---|
| 81 | GO TO 100 |
---|
| 82 | ENDIF |
---|
| 83 | anneelim = anneelim + 1 |
---|
| 84 | ENDDO |
---|
| 85 | |
---|
| 86 | PRINT *,' PBS ! Le jour a lire sur le fichier limit ne se ' |
---|
| 87 | PRINT *,' trouve pas sur les ',nannemax,' annees a partir de ' |
---|
| 88 | PRINT *,' l annee de debut', anne_ini |
---|
| 89 | CALL EXIT(1) |
---|
| 90 | c |
---|
| 91 | 100 CONTINUE |
---|
| 92 | c |
---|
| 93 | ELSE |
---|
| 94 | |
---|
| 95 | WRITE(fich,'("limit.nc")') |
---|
| 96 | PRINT *,' Fichier Limite ',fich |
---|
| 97 | ENDIF |
---|
| 98 | c |
---|
| 99 | c ........... ( fin modif P. Le Van ) ............ |
---|
| 100 | c |
---|
| 101 | c Ouvrir le fichier en format NetCDF: |
---|
| 102 | c |
---|
| 103 | ierr = NF_OPEN (fich, NF_NOWRITE,nid) |
---|
| 104 | IF (ierr.NE.NF_NOERR) THEN |
---|
| 105 | WRITE(6,*)' Pb d''ouverture du fichier ', fich |
---|
| 106 | WRITE(6,*)' Le fichier limit ',fich,' (avec 4 chiffres , pour' |
---|
| 107 | WRITE(6,*)' l an 2000 ) , n existe pas ! ' |
---|
| 108 | WRITE(6,*)' ierr = ', ierr |
---|
| 109 | CALL EXIT(1) |
---|
| 110 | ENDIF |
---|
| 111 | c |
---|
| 112 | c La tranche de donnees a lire: |
---|
| 113 | c |
---|
| 114 | debut(1) = 1 |
---|
| 115 | debut(2) = jour + 1 |
---|
| 116 | epais(1) = klon |
---|
| 117 | epais(2) = 1 |
---|
| 118 | c |
---|
| 119 | IF (newlmt) THEN |
---|
| 120 | c |
---|
| 121 | c Fraction "ocean": |
---|
| 122 | ierr = NF_INQ_VARID (nid, "FOCE", nvarid) |
---|
| 123 | IF (ierr .NE. NF_NOERR) THEN |
---|
| 124 | PRINT*, "condsurf: Le champ <FOCE> est absent" |
---|
| 125 | CALL abort |
---|
| 126 | ENDIF |
---|
| 127 | #ifdef NC_DOUBLE |
---|
| 128 | ierr = NF_GET_VARA_DOUBLE(nid,nvarid,debut,epais,pctsrf(1,is_oce)) |
---|
| 129 | #else |
---|
| 130 | ierr = NF_GET_VARA_REAL(nid,nvarid,debut,epais,pctsrf(1,is_oce)) |
---|
| 131 | #endif |
---|
| 132 | IF (ierr .NE. NF_NOERR) THEN |
---|
| 133 | PRINT*, "condsurf: Lecture echouee pour <FOCE>" |
---|
| 134 | CALL abort |
---|
| 135 | ENDIF |
---|
| 136 | c |
---|
| 137 | c Fraction "glace de mer": |
---|
| 138 | ierr = NF_INQ_VARID (nid, "FSIC", nvarid) |
---|
| 139 | IF (ierr .NE. NF_NOERR) THEN |
---|
| 140 | PRINT*, "condsurf: Le champ <FSIC> est absent" |
---|
| 141 | CALL abort |
---|
| 142 | ENDIF |
---|
| 143 | #ifdef NC_DOUBLE |
---|
| 144 | ierr = NF_GET_VARA_DOUBLE(nid,nvarid,debut,epais,pctsrf(1,is_sic)) |
---|
| 145 | #else |
---|
| 146 | ierr = NF_GET_VARA_REAL(nid,nvarid,debut,epais,pctsrf(1,is_sic)) |
---|
| 147 | #endif |
---|
| 148 | IF (ierr .NE. NF_NOERR) THEN |
---|
| 149 | PRINT*, "condsurf: Lecture echouee pour <FSIC>" |
---|
| 150 | CALL abort |
---|
| 151 | ENDIF |
---|
| 152 | c |
---|
| 153 | c Fraction "terre": |
---|
| 154 | ierr = NF_INQ_VARID (nid, "FTER", nvarid) |
---|
| 155 | IF (ierr .NE. NF_NOERR) THEN |
---|
| 156 | PRINT*, "condsurf: Le champ <FTER> est absent" |
---|
| 157 | CALL abort |
---|
| 158 | ENDIF |
---|
| 159 | #ifdef NC_DOUBLE |
---|
| 160 | ierr = NF_GET_VARA_DOUBLE(nid,nvarid,debut,epais,pctsrf(1,is_ter)) |
---|
| 161 | #else |
---|
| 162 | ierr = NF_GET_VARA_REAL(nid,nvarid,debut,epais,pctsrf(1,is_ter)) |
---|
| 163 | #endif |
---|
| 164 | IF (ierr .NE. NF_NOERR) THEN |
---|
| 165 | PRINT*, "condsurf: Lecture echouee pour <FTER>" |
---|
| 166 | CALL abort |
---|
| 167 | ENDIF |
---|
| 168 | c |
---|
| 169 | c Fraction "glacier terre": |
---|
| 170 | ierr = NF_INQ_VARID (nid, "FLIC", nvarid) |
---|
| 171 | IF (ierr .NE. NF_NOERR) THEN |
---|
| 172 | PRINT*, "condsurf: Le champ <FLIC> est absent" |
---|
| 173 | CALL abort |
---|
| 174 | ENDIF |
---|
| 175 | #ifdef NC_DOUBLE |
---|
| 176 | ierr = NF_GET_VARA_DOUBLE(nid,nvarid,debut,epais,pctsrf(1,is_lic)) |
---|
| 177 | #else |
---|
| 178 | ierr = NF_GET_VARA_REAL(nid,nvarid,debut,epais,pctsrf(1,is_lic)) |
---|
| 179 | #endif |
---|
| 180 | IF (ierr .NE. 0) THEN |
---|
| 181 | PRINT*, "condsurf: Lecture echouee pour <FLIC>" |
---|
| 182 | CALL abort |
---|
| 183 | ENDIF |
---|
| 184 | c |
---|
| 185 | ELSE ! test sur newlmt |
---|
| 186 | c |
---|
| 187 | c Indicateur de la nature du sol (0,1,2,3): |
---|
| 188 | ierr = NF_INQ_VARID (nid, "NAT", nvarid) |
---|
| 189 | IF (ierr .NE. NF_NOERR) THEN |
---|
| 190 | PRINT*, "condsurf: Le champ <NAT> est absent" |
---|
| 191 | CALL abort |
---|
| 192 | ENDIF |
---|
| 193 | #ifdef NC_DOUBLE |
---|
| 194 | ierr = NF_GET_VARA_DOUBLE(nid, nvarid,debut,epais,lmt_nat) |
---|
| 195 | #else |
---|
| 196 | ierr = NF_GET_VARA_REAL(nid, nvarid,debut,epais,lmt_nat) |
---|
| 197 | #endif |
---|
| 198 | IF (ierr .NE. NF_NOERR) THEN |
---|
| 199 | PRINT*, "condsurf: Lecture echouee pour <NAT>" |
---|
| 200 | CALL abort |
---|
| 201 | ENDIF |
---|
| 202 | c |
---|
| 203 | DO ig = 1, klon |
---|
| 204 | pctsrf(ig,is_oce) = 0.0 |
---|
| 205 | pctsrf(ig,is_ter) = 0.0 |
---|
| 206 | pctsrf(ig,is_lic) = 0.0 |
---|
| 207 | pctsrf(ig,is_sic) = 0.0 |
---|
| 208 | ENDDO |
---|
| 209 | ok = .TRUE. |
---|
| 210 | DO ig = 1, klon |
---|
| 211 | IF (NINT(lmt_nat(ig)).EQ.0) THEN |
---|
| 212 | pctsrf(ig,is_oce) = 1.0 |
---|
| 213 | ELSE IF (NINT(lmt_nat(ig)).EQ.1) THEN |
---|
| 214 | pctsrf(ig,is_ter) = 1.0 |
---|
| 215 | ELSE IF (NINT(lmt_nat(ig)).EQ.2) THEN |
---|
| 216 | pctsrf(ig,is_lic) = 1.0 |
---|
| 217 | ELSE IF (NINT(lmt_nat(ig)).EQ.3) THEN |
---|
| 218 | pctsrf(ig,is_sic) = 1.0 |
---|
| 219 | ELSE |
---|
| 220 | ok = .FALSE. |
---|
| 221 | ENDIF |
---|
| 222 | ENDDO |
---|
| 223 | IF (.NOT.ok) THEN |
---|
| 224 | PRINT*, "valeur fausse pour lmt_nat:", lmt_nat |
---|
| 225 | CALL abort |
---|
| 226 | ENDIF |
---|
| 227 | c |
---|
| 228 | ENDIF ! fin de test sur newlmt |
---|
| 229 | c |
---|
| 230 | c Sea surface temperature: |
---|
| 231 | ierr = NF_INQ_VARID (nid, "SST", nvarid) |
---|
| 232 | IF (ierr .NE. NF_NOERR) THEN |
---|
| 233 | PRINT*, "condsurf: Le champ <SST> est absent" |
---|
| 234 | CALL abort |
---|
| 235 | ENDIF |
---|
| 236 | #ifdef NC_DOUBLE |
---|
| 237 | ierr = NF_GET_VARA_DOUBLE(nid, nvarid,debut,epais,lmt_sst) |
---|
| 238 | #else |
---|
| 239 | ierr = NF_GET_VARA_REAL(nid, nvarid,debut,epais,lmt_sst) |
---|
| 240 | #endif |
---|
| 241 | IF (ierr .NE. NF_NOERR) THEN |
---|
| 242 | PRINT*, "condsurf: Lecture echouee pour <SST>" |
---|
| 243 | CALL abort |
---|
| 244 | ENDIF |
---|
| 245 | c |
---|
| 246 | c Albedo de surface: |
---|
| 247 | ierr = NF_INQ_VARID (nid, "ALB", nvarid) |
---|
| 248 | IF (ierr .NE. NF_NOERR) THEN |
---|
| 249 | PRINT*, "condsurf: Le champ <ALB> est absent" |
---|
| 250 | CALL abort |
---|
| 251 | ENDIF |
---|
| 252 | #ifdef NC_DOUBLE |
---|
| 253 | ierr = NF_GET_VARA_DOUBLE(nid, nvarid,debut,epais,lmt_alb) |
---|
| 254 | #else |
---|
| 255 | ierr = NF_GET_VARA_REAL(nid, nvarid,debut,epais,lmt_alb) |
---|
| 256 | #endif |
---|
| 257 | IF (ierr .NE. NF_NOERR) THEN |
---|
| 258 | PRINT*, "condsurf: Lecture echouee pour <ALB>" |
---|
| 259 | CALL abort |
---|
| 260 | ENDIF |
---|
| 261 | c |
---|
| 262 | c Longueur de rugosite au sol: |
---|
| 263 | ierr = NF_INQ_VARID (nid, "RUG", nvarid) |
---|
| 264 | IF (ierr .NE. NF_NOERR) THEN |
---|
| 265 | PRINT*, "condsurf: Le champ <RUG> est absent" |
---|
| 266 | CALL abort |
---|
| 267 | ENDIF |
---|
| 268 | #ifdef NC_DOUBLE |
---|
| 269 | ierr = NF_GET_VARA_DOUBLE(nid, nvarid,debut,epais,lmt_rug) |
---|
| 270 | #else |
---|
| 271 | ierr = NF_GET_VARA_REAL(nid, nvarid,debut,epais,lmt_rug) |
---|
| 272 | #endif |
---|
| 273 | IF (ierr .NE. NF_NOERR) THEN |
---|
| 274 | PRINT*, "condsurf: Lecture echouee pour <RUG>" |
---|
| 275 | CALL abort |
---|
| 276 | ENDIF |
---|
| 277 | c |
---|
| 278 | c Bilan flux de chaleur au sol: |
---|
| 279 | ierr = NF_INQ_VARID (nid, "BILS", nvarid) |
---|
| 280 | IF (ierr .NE. NF_NOERR) THEN |
---|
| 281 | PRINT*, "condsurf: Le champ <BILS> est absent" |
---|
| 282 | CALL abort |
---|
| 283 | ENDIF |
---|
| 284 | #ifdef NC_DOUBLE |
---|
| 285 | ierr = NF_GET_VARA_DOUBLE(nid, nvarid,debut,epais,lmt_bils) |
---|
| 286 | #else |
---|
| 287 | ierr = NF_GET_VARA_REAL(nid, nvarid,debut,epais,lmt_bils) |
---|
| 288 | #endif |
---|
| 289 | IF (ierr .NE. NF_NOERR) THEN |
---|
| 290 | PRINT*, "condsurf: Lecture echouee pour <BILS>" |
---|
| 291 | CALL abort |
---|
| 292 | ENDIF |
---|
| 293 | c |
---|
| 294 | c Fermer le fichier: |
---|
| 295 | c |
---|
| 296 | ierr = NF_CLOSE(nid) |
---|
| 297 | c |
---|
| 298 | c |
---|
| 299 | PRINT*, 'SST, ALB, RUG, etc. sont lus pour jour: ', jour |
---|
| 300 | c |
---|
| 301 | IF (ok_oasis) THEN |
---|
| 302 | C |
---|
| 303 | CALL fromcpl(jour,(jjm+1)*iim, |
---|
| 304 | . cpl_sst,cpl_sic,cpl_alb_sst,cpl_alb_sic) |
---|
| 305 | DO i = 1, iim-1 ! un seul point pour le pole nord |
---|
| 306 | cpl_sst(i,1) = cpl_sst(iim,1) |
---|
| 307 | cpl_sic(i,1) = cpl_sic(iim,1) |
---|
| 308 | cpl_alb_sst(i,1) = cpl_alb_sst(iim,1) |
---|
| 309 | cpl_alb_sic(i,1) = cpl_alb_sic(iim,1) |
---|
| 310 | ENDDO |
---|
| 311 | DO i = 2, iim ! un seul point pour le pole sud |
---|
| 312 | cpl_sst(i,jjm+1) = cpl_sst(1,jjm+1) |
---|
| 313 | cpl_sic(i,jjm+1) = cpl_sic(1,jjm+1) |
---|
| 314 | cpl_alb_sst(i,jjm+1) = cpl_alb_sst(1,jjm+1) |
---|
| 315 | cpl_alb_sic(i,jjm+1) = cpl_alb_sic(1,jjm+1) |
---|
| 316 | ENDDO |
---|
| 317 | c |
---|
| 318 | ig = 1 |
---|
| 319 | IF (pctsrf(ig,is_oce).GT.epsfra .OR. |
---|
| 320 | . pctsrf(ig,is_sic).GT.epsfra) THEN |
---|
| 321 | pctsrf(ig,is_oce) = pctsrf(ig,is_oce) |
---|
| 322 | . - (cpl_sic(1,1)-pctsrf(ig,is_sic)) |
---|
| 323 | pctsrf(ig,is_sic) = cpl_sic(1,1) |
---|
| 324 | lmt_sst(ig) = cpl_sst(1,1) |
---|
| 325 | ENDIF |
---|
| 326 | DO j = 2, jjm |
---|
| 327 | DO i = 1, iim |
---|
| 328 | ig = ig + 1 |
---|
| 329 | IF (pctsrf(ig,is_oce).GT.epsfra .OR. |
---|
| 330 | . pctsrf(ig,is_sic).GT.epsfra) THEN |
---|
| 331 | pctsrf(ig,is_oce) = pctsrf(ig,is_oce) |
---|
| 332 | . - (cpl_sic(i,j)-pctsrf(ig,is_sic)) |
---|
| 333 | pctsrf(ig,is_sic) = cpl_sic(i,j) |
---|
| 334 | lmt_sst(ig) = cpl_sst(i,j) |
---|
| 335 | ENDIF |
---|
| 336 | ENDDO |
---|
| 337 | ENDDO |
---|
| 338 | ig = ig + 1 |
---|
| 339 | IF (pctsrf(ig,is_oce).GT.epsfra .OR. |
---|
| 340 | . pctsrf(ig,is_sic).GT.epsfra) THEN |
---|
| 341 | pctsrf(ig,is_oce) = pctsrf(ig,is_oce) |
---|
| 342 | . - (cpl_sic(1,jjm+1)-pctsrf(ig,is_sic)) |
---|
| 343 | pctsrf(ig,is_sic) = cpl_sic(1,jjm+1) |
---|
| 344 | lmt_sst(ig) = cpl_sst(1,jjm+1) |
---|
| 345 | ENDIF |
---|
| 346 | c |
---|
| 347 | ENDIF ! ok_oasis |
---|
| 348 | c |
---|
| 349 | RETURN |
---|
| 350 | END |
---|