[3331] | 1 | #ifdef ISO |
---|
| 2 | ! $Id: $ |
---|
| 3 | |
---|
| 4 | MODULE isotopes_mod |
---|
| 5 | USE infotrac_phy, ONLY: ntraciso,niso,indnum_fn_num,ok_isotrac,use_iso, & |
---|
| 6 | & niso_possibles |
---|
| 7 | IMPLICIT NONE |
---|
| 8 | SAVE |
---|
| 9 | |
---|
| 10 | ! contient toutes les variables isotopiques et leur initialisation |
---|
| 11 | ! les routines specifiquement isotopiques sont dans |
---|
| 12 | ! isotopes_routines_mod pour éviter dépendance circulaire avec |
---|
| 13 | ! isotopes_verif_mod. |
---|
| 14 | |
---|
| 15 | |
---|
| 16 | ! indices des isotopes |
---|
| 17 | integer, save :: iso_eau,iso_HDO,iso_O18,iso_O17,iso_HTO ! indices de 1 à niso: les isos n'existant pas sont mis à 0 |
---|
| 18 | !$OMP THREADPRIVATE(iso_eau,iso_HDO,iso_O18,iso_O17,iso_HTO) |
---|
| 19 | |
---|
| 20 | integer :: iso_eau_possible,iso_HDO_possible,iso_O18_possible,iso_O17_possible,iso_HTO_possible ! indices de 1 à niso_possibles: ils correspondent aux tableaux définis dans infotrac: |
---|
| 21 | ! tnom_iso=(/'eau','HDO','O18','O17','HTO'/) |
---|
| 22 | ! ce sont ces indices qui doivent être utilisés avec use_iso, puisque use_iso est défini comme DIMENSION(niso_possibles) |
---|
| 23 | parameter (iso_eau_possible=1) |
---|
| 24 | parameter (iso_HDO_possible=2) |
---|
| 25 | parameter (iso_O18_possible=3) |
---|
| 26 | parameter (iso_O17_possible=4) |
---|
| 27 | parameter (iso_HTO_possible=5) |
---|
| 28 | |
---|
| 29 | integer, save :: ntracisoOR |
---|
| 30 | !$OMP THREADPRIVATE(ntracisoOR) |
---|
| 31 | |
---|
| 32 | ! variables indépendantes des isotopes |
---|
| 33 | |
---|
| 34 | real, save :: pxtmelt,pxtice,pxtmin,pxtmax |
---|
| 35 | !$OMP THREADPRIVATE(pxtmelt,pxtice,pxtmin,pxtmax) |
---|
| 36 | real, save :: tdifexp, tv0cin, thumxt1 |
---|
| 37 | !$OMP THREADPRIVATE(tdifexp, tv0cin, thumxt1) |
---|
| 38 | integer, save :: ntot |
---|
| 39 | !$OMP THREADPRIVATE(ntot) |
---|
| 40 | real, save :: h_land_ice |
---|
| 41 | !$OMP THREADPRIVATE(h_land_ice) |
---|
| 42 | real, save :: P_veg |
---|
| 43 | !$OMP THREADPRIVATE(P_veg) |
---|
| 44 | real, save :: musi,lambda_sursat |
---|
| 45 | !$OMP THREADPRIVATE(lambda_sursat) |
---|
| 46 | real, save :: Kd |
---|
| 47 | !$OMP THREADPRIVATE(Kd) |
---|
| 48 | real, save :: rh_cste_surf_cond,T_cste_surf_cond |
---|
| 49 | !$OMP THREADPRIVATE(rh_cste_surf_cond,T_cste_surf_cond) |
---|
| 50 | |
---|
| 51 | logical, save :: bidouille_anti_divergence |
---|
| 52 | ! si true, rappel régulier de xteau vers q, pour éviter dérives lentes |
---|
| 53 | !$OMP THREADPRIVATE(bidouille_anti_divergence) |
---|
| 54 | logical, save :: essai_convergence |
---|
| 55 | ! si false, on fait rigoureusement comme dans LMDZ sans isotopes, |
---|
| 56 | ! meme si c'est génant pour les isotopes |
---|
| 57 | !$OMP THREADPRIVATE(essai_convergence) |
---|
| 58 | integer, save :: initialisation_iso |
---|
| 59 | ! 0: dans fichier |
---|
| 60 | ! 1: R=0 |
---|
| 61 | ! 2: R selon distill rayleigh |
---|
| 62 | ! 3: R=Rsmow |
---|
| 63 | !$OMP THREADPRIVATE(initialisation_iso) |
---|
| 64 | integer, save :: modif_SST ! 0 par defaut, 1 si on veut modifier la sst |
---|
| 65 | ! 2 et 3: profils de SST |
---|
| 66 | !$OMP THREADPRIVATE(modif_SST) |
---|
| 67 | real, save :: deltaTtest ! modif de la SST, uniforme. |
---|
| 68 | !$OMP THREADPRIVATE(deltaTtest) |
---|
| 69 | integer, save :: modif_sic ! on met des trous dans glace de mer |
---|
| 70 | !$OMP THREADPRIVATE(modif_sic) |
---|
| 71 | real, save :: deltasic ! fraction de trous minimale |
---|
| 72 | !$OMP THREADPRIVATE(deltasic) |
---|
| 73 | real, save :: deltaTtestpoles |
---|
| 74 | !$OMP THREADPRIVATE(deltaTtestpoles) |
---|
| 75 | real, save :: sstlatcrit |
---|
| 76 | !$OMP THREADPRIVATE(sstlatcrit) |
---|
| 77 | real, save :: dsstlatcrit |
---|
| 78 | !$OMP THREADPRIVATE(dsstlatcrit) |
---|
| 79 | real, save :: deltaO18_oce |
---|
| 80 | !$OMP THREADPRIVATE(deltaO18_oce) |
---|
| 81 | integer, save :: albedo_prescrit ! 0 par defaut |
---|
| 82 | ! 1 si on veut garder albedo constant |
---|
| 83 | !$OMP THREADPRIVATE(albedo_prescrit) |
---|
| 84 | real, save :: lon_min_albedo,lon_max_albedo |
---|
| 85 | !$OMP THREADPRIVATE(lon_min_albedo,lon_max_albedo) |
---|
| 86 | real, save :: lat_min_albedo,lat_max_albedo |
---|
| 87 | !$OMP THREADPRIVATE(lat_min_albedo,lat_max_albedo) |
---|
| 88 | real, save :: deltaP_BL,tdifexp_sol |
---|
| 89 | !$OMP THREADPRIVATE(deltaP_BL,tdifexp_sol) |
---|
| 90 | integer, save :: ruissellement_pluie,alphak_stewart |
---|
| 91 | !$OMP THREADPRIVATE(ruissellement_pluie,alphak_stewart) |
---|
| 92 | integer, save :: calendrier_guide |
---|
| 93 | !$OMP THREADPRIVATE(calendrier_guide) |
---|
| 94 | integer, save :: cste_surf_cond |
---|
| 95 | !$OMP THREADPRIVATE(cste_surf_cond) |
---|
| 96 | real, save :: mixlen |
---|
| 97 | !$OMP THREADPRIVATE(mixlen) |
---|
| 98 | integer, save :: evap_cont_cste |
---|
| 99 | !$OMP THREADPRIVATE(evap_cont_cste) |
---|
| 100 | real, save :: deltaO18_evap_cont,d_evap_cont |
---|
| 101 | !$OMP THREADPRIVATE(deltaO18_evap_cont,d_evap_cont) |
---|
| 102 | integer, save :: nudge_qsol,region_nudge_qsol |
---|
| 103 | !$OMP THREADPRIVATE(nudge_qsol,region_nudge_qsol) |
---|
| 104 | integer, save :: nlevmaxO17 |
---|
| 105 | !$OMP THREADPRIVATE(nlevmaxO17) |
---|
| 106 | integer, save :: no_pce |
---|
| 107 | ! real, save :: slope_limiterxy,slope_limiterz |
---|
| 108 | !$OMP THREADPRIVATE(no_pce) |
---|
| 109 | real, save :: A_satlim |
---|
| 110 | !$OMP THREADPRIVATE(A_satlim) |
---|
| 111 | integer, save :: ok_restrict_A_satlim,modif_ratqs |
---|
| 112 | !$OMP THREADPRIVATE(ok_restrict_A_satlim,modif_ratqs) |
---|
| 113 | real, save :: Pcrit_ratqs,ratqsbasnew |
---|
| 114 | !$OMP THREADPRIVATE(Pcrit_ratqs,ratqsbasnew) |
---|
| 115 | real, save :: fac_modif_evaoce |
---|
| 116 | !$OMP THREADPRIVATE(fac_modif_evaoce) |
---|
| 117 | integer, save :: ok_bidouille_wake |
---|
| 118 | !$OMP THREADPRIVATE(ok_bidouille_wake) |
---|
| 119 | logical :: cond_temp_env |
---|
| 120 | !$OMP THREADPRIVATE(cond_temp_env) |
---|
| 121 | |
---|
| 122 | |
---|
| 123 | ! variables tableaux fn de niso |
---|
| 124 | real, ALLOCATABLE, DIMENSION(:), save :: tnat, toce, tcorr |
---|
| 125 | !$OMP THREADPRIVATE(tnat, toce, tcorr) |
---|
| 126 | real, ALLOCATABLE, DIMENSION(:), save :: tdifrel |
---|
| 127 | !$OMP THREADPRIVATE(tdifrel) |
---|
| 128 | real, ALLOCATABLE, DIMENSION(:), save :: talph1, talph2, talph3 |
---|
| 129 | !$OMP THREADPRIVATE(talph1, talph2, talph3) |
---|
| 130 | real, ALLOCATABLE, DIMENSION(:), save :: talps1, talps2 |
---|
| 131 | !$OMP THREADPRIVATE(talps1, talps2) |
---|
| 132 | real, ALLOCATABLE, DIMENSION(:), save :: tkcin0, tkcin1, tkcin2 |
---|
| 133 | !$OMP THREADPRIVATE(tkcin0, tkcin1, tkcin2) |
---|
| 134 | real, ALLOCATABLE, DIMENSION(:), save :: alpha_liq_sol |
---|
| 135 | !$OMP THREADPRIVATE(alpha_liq_sol) |
---|
| 136 | real, ALLOCATABLE, DIMENSION(:), save :: Rdefault, Rmethox |
---|
| 137 | !$OMP THREADPRIVATE(Rdefault, Rmethox) |
---|
| 138 | character*3, ALLOCATABLE, DIMENSION(:), save :: striso |
---|
| 139 | !$OMP THREADPRIVATE(striso) |
---|
| 140 | real, save :: fac_coeff_eq17_liq, fac_coeff_eq17_ice |
---|
| 141 | !$OMP THREADPRIVATE(fac_coeff_eq17_liq, fac_coeff_eq17_ice) |
---|
| 142 | |
---|
| 143 | real ridicule ! valeur maximale pour qu'une variable de type |
---|
| 144 | ! rapoport de mélange puisse être considérée comme négligeable. Si |
---|
| 145 | ! négligeable, alors on ne verifie pas si sa compo iso esta bérrante. |
---|
| 146 | parameter (ridicule=1e-12) |
---|
| 147 | ! parameter (ridicule=1) |
---|
| 148 | ! |
---|
| 149 | real ridicule_rain ! valeur limite de ridicule pour les flux de pluies (rain, zrfl...) |
---|
| 150 | parameter (ridicule_rain=1e-8) ! en kg/s <-> 1e-3mm/day |
---|
| 151 | |
---|
| 152 | real ridicule_evap ! valeur limite de ridicule pour les evap |
---|
| 153 | parameter (ridicule_evap=ridicule_rain*1e-2) ! en kg/s <-> 1e-3mm/day |
---|
| 154 | |
---|
| 155 | real ridicule_qsol ! valeur limite de ridicule pour les qsol |
---|
| 156 | parameter (ridicule_qsol=ridicule_rain) ! en kg <-> 1e-8kg |
---|
| 157 | |
---|
| 158 | real ridicule_snow ! valeur limite de ridicule pour les snow |
---|
| 159 | parameter (ridicule_snow=ridicule_qsol) ! en kg/s <-> 1e-8kg |
---|
| 160 | |
---|
| 161 | real expb_max |
---|
| 162 | parameter (expb_max=30.0) |
---|
| 163 | |
---|
| 164 | ! spécifique au tritium: |
---|
| 165 | |
---|
| 166 | |
---|
| 167 | logical, save :: ok_prod_nucl_tritium ! si oui, production de tritium par essais nucleaires |
---|
| 168 | !$OMP THREADPRIVATE(ok_prod_nucl_tritium) |
---|
| 169 | integer nessai |
---|
| 170 | parameter (nessai=486) |
---|
| 171 | integer, save :: day_nucl(nessai) |
---|
| 172 | !$OMP THREADPRIVATE(day_nucl) |
---|
| 173 | integer, save :: month_nucl(nessai) |
---|
| 174 | !$OMP THREADPRIVATE(month_nucl) |
---|
| 175 | integer, save :: year_nucl(nessai) |
---|
| 176 | !$OMP THREADPRIVATE(year_nucl) |
---|
| 177 | real, save :: lat_nucl(nessai) |
---|
| 178 | !$OMP THREADPRIVATE(lat_nucl) |
---|
| 179 | real, save :: lon_nucl(nessai) |
---|
| 180 | !$OMP THREADPRIVATE(lon_nucl) |
---|
| 181 | real, save :: zmin_nucl(nessai) |
---|
| 182 | !$OMP THREADPRIVATE(zmin_nucl) |
---|
| 183 | real, save :: zmax_nucl(nessai) |
---|
| 184 | !$OMP THREADPRIVATE(zmax_nucl) |
---|
| 185 | real, save :: HTO_nucl(nessai) |
---|
| 186 | !$OMP THREADPRIVATE(HTO_nucl) |
---|
| 187 | |
---|
| 188 | |
---|
| 189 | CONTAINS |
---|
| 190 | |
---|
| 191 | SUBROUTINE iso_init() |
---|
| 192 | use IOIPSL ! getin |
---|
| 193 | implicit none |
---|
| 194 | |
---|
| 195 | ! -- local variables: |
---|
| 196 | |
---|
| 197 | integer ixt |
---|
| 198 | ! référence O18 |
---|
| 199 | real fac_enrichoce18 |
---|
| 200 | real alpha_liq_sol_O18, & |
---|
| 201 | & talph1_O18,talph2_O18,talph3_O18, & |
---|
| 202 | & talps1_O18,talps2_O18, & |
---|
| 203 | & tkcin0_O18,tkcin1_O18,tkcin2_O18, & |
---|
| 204 | & tdifrel_O18 |
---|
| 205 | |
---|
| 206 | ! cas de l'O17 |
---|
| 207 | real fac_kcin |
---|
| 208 | real pente_MWL |
---|
| 209 | integer ierr |
---|
| 210 | |
---|
| 211 | logical ok_nocinsat, ok_nocinsfc !sensi test |
---|
| 212 | parameter (ok_nocinsfc=.FALSE.) ! if T: no kinetic effect in sfc evap |
---|
| 213 | parameter (ok_nocinsat=.FALSE.) ! if T: no sursaturation effect for ice |
---|
| 214 | logical Rdefault_smow |
---|
| 215 | parameter (Rdefault_smow=.FALSE.) ! si T: Rdefault=smow; si F: nul |
---|
| 216 | ! pour le tritium |
---|
| 217 | integer iessai |
---|
| 218 | |
---|
| 219 | ! allocations mémoire |
---|
| 220 | |
---|
| 221 | allocate (tnat(niso)) |
---|
| 222 | allocate (toce(niso)) |
---|
| 223 | allocate (tcorr(niso)) |
---|
| 224 | allocate (tdifrel(niso)) |
---|
| 225 | allocate (talph1(niso)) |
---|
| 226 | allocate (talph2(niso)) |
---|
| 227 | allocate (talph3(niso)) |
---|
| 228 | allocate (talps1(niso)) |
---|
| 229 | allocate (talps2(niso)) |
---|
| 230 | allocate (tkcin0(niso)) |
---|
| 231 | allocate (tkcin1(niso)) |
---|
| 232 | allocate (tkcin2(niso)) |
---|
| 233 | allocate (alpha_liq_sol(niso)) |
---|
| 234 | allocate (Rdefault(niso)) |
---|
| 235 | allocate (Rmethox(niso)) |
---|
| 236 | allocate (striso(niso)) |
---|
| 237 | |
---|
| 238 | |
---|
| 239 | !-------------------------------------------------------------- |
---|
| 240 | ! General: |
---|
| 241 | !-------------------------------------------------------------- |
---|
| 242 | |
---|
| 243 | ! -- verif du nombre d'isotopes: |
---|
| 244 | write(*,*) 'iso_init 64: niso=',niso |
---|
| 245 | |
---|
| 246 | ! init de ntracisoOR: on écrasera en cas de ok_isotrac si complications avec |
---|
| 247 | ! ORCHIDEE |
---|
| 248 | ntracisoOR=ntraciso |
---|
| 249 | |
---|
| 250 | ! -- Type of water isotopes: |
---|
| 251 | |
---|
| 252 | iso_eau=indnum_fn_num(1) |
---|
| 253 | iso_HDO=indnum_fn_num(2) |
---|
| 254 | iso_O18=indnum_fn_num(3) |
---|
| 255 | iso_O17=indnum_fn_num(4) |
---|
| 256 | iso_HTO=indnum_fn_num(5) |
---|
| 257 | write(*,*) 'iso_init 59: iso_eau=',iso_eau |
---|
| 258 | write(*,*) 'iso_HDO=',iso_HDO |
---|
| 259 | write(*,*) 'iso_O18=',iso_O18 |
---|
| 260 | write(*,*) 'iso_O17=',iso_O17 |
---|
| 261 | write(*,*) 'iso_HTO=',iso_HTO |
---|
| 262 | write(*,*) 'iso_init 251: use_iso=',use_iso |
---|
| 263 | |
---|
| 264 | ! initialisation |
---|
| 265 | lambda_sursat=0.004 |
---|
| 266 | thumxt1=0.75*1.2 |
---|
| 267 | ntot=20 |
---|
| 268 | h_land_ice=20. ! à comparer aux 3000mm de snow_max |
---|
| 269 | P_veg=1.0 |
---|
| 270 | bidouille_anti_divergence=.false. |
---|
| 271 | essai_convergence=.false. |
---|
| 272 | initialisation_iso=0 |
---|
| 273 | modif_sst=0 |
---|
| 274 | modif_sic=0 |
---|
| 275 | deltaTtest=0.0 |
---|
| 276 | deltasic=0.1 |
---|
| 277 | deltaTtestpoles=0.0 |
---|
| 278 | sstlatcrit=30.0 |
---|
| 279 | deltaO18_oce=0.0 |
---|
| 280 | albedo_prescrit=0 |
---|
| 281 | lon_min_albedo=-200 |
---|
| 282 | lon_max_albedo=200 |
---|
| 283 | lat_min_albedo=-100 |
---|
| 284 | lat_max_albedo=100 |
---|
| 285 | deltaP_BL=10.0 |
---|
| 286 | ruissellement_pluie=0 |
---|
| 287 | alphak_stewart=1 |
---|
| 288 | tdifexp_sol=0.67 |
---|
| 289 | calendrier_guide=0 |
---|
| 290 | cste_surf_cond=0 |
---|
| 291 | mixlen=35.0 |
---|
| 292 | evap_cont_cste=0.0 |
---|
| 293 | deltaO18_evap_cont=0.0 |
---|
| 294 | d_evap_cont=0.0 |
---|
| 295 | nudge_qsol=0 |
---|
| 296 | region_nudge_qsol=1 |
---|
| 297 | nlevmaxO17=50 |
---|
| 298 | no_pce=0 |
---|
| 299 | A_satlim=1.0 |
---|
| 300 | ok_restrict_A_satlim=0 |
---|
| 301 | ! slope_limiterxy=2.0 |
---|
| 302 | ! slope_limiterz=2.0 |
---|
| 303 | modif_ratqs=0 |
---|
| 304 | Pcrit_ratqs=500.0 |
---|
| 305 | ratqsbasnew=0.05 |
---|
| 306 | |
---|
| 307 | fac_modif_evaoce=1.0 |
---|
| 308 | ok_bidouille_wake=0 |
---|
| 309 | cond_temp_env=.false. |
---|
| 310 | ! si oui, la temperature de cond est celle de l'environnement, |
---|
| 311 | ! pour eviter bugs quand temperature dans ascendances convs est |
---|
| 312 | ! mal calculee |
---|
| 313 | ok_prod_nucl_tritium=.false. |
---|
| 314 | |
---|
| 315 | ! lecture des paramètres isotopiques: |
---|
| 316 | call getin('lambda',lambda_sursat) |
---|
| 317 | call getin('thumxt1',thumxt1) |
---|
| 318 | call getin('ntot',ntot) |
---|
| 319 | call getin('h_land_ice',h_land_ice) |
---|
| 320 | call getin('P_veg',P_veg) |
---|
| 321 | call getin('bidouille_anti_divergence',bidouille_anti_divergence) |
---|
| 322 | call getin('essai_convergence',essai_convergence) |
---|
| 323 | call getin('initialisation_iso',initialisation_iso) |
---|
| 324 | !if (ok_isotrac) then |
---|
| 325 | !if (initialisation_iso.eq.0) then |
---|
| 326 | ! call getin('initialisation_isotrac',initialisation_isotrac) |
---|
| 327 | !endif !if (initialisation_iso.eq.0) then |
---|
| 328 | !endif !if (ok_isotrac) then |
---|
| 329 | call getin('modif_sst',modif_sst) |
---|
| 330 | if (modif_sst.ge.1) then |
---|
| 331 | call getin('deltaTtest',deltaTtest) |
---|
| 332 | if (modif_sst.ge.2) then |
---|
| 333 | call getin('deltaTtestpoles',deltaTtestpoles) |
---|
| 334 | call getin('sstlatcrit',sstlatcrit) |
---|
| 335 | #ifdef ISOVERIF |
---|
| 336 | !call iso_verif_positif(sstlatcrit,'iso_init 107') |
---|
| 337 | if (sstlatcrit.lt.0.0) then |
---|
| 338 | write(*,*) 'iso_init 270: sstlatcrit=',sstlatcrit |
---|
| 339 | stop |
---|
| 340 | endif |
---|
| 341 | #endif |
---|
| 342 | if (modif_sst.ge.3) then |
---|
| 343 | call getin('dsstlatcrit',dsstlatcrit) |
---|
| 344 | #ifdef ISOVERIF |
---|
| 345 | !call iso_verif_positif(dsstlatcrit,'iso_init 110') |
---|
| 346 | if (sstlatcrit.lt.0.0) then |
---|
| 347 | write(*,*) 'iso_init 279: dsstlatcrit=',dsstlatcrit |
---|
| 348 | stop |
---|
| 349 | endif |
---|
| 350 | #endif |
---|
| 351 | endif !if (modif_sst.ge.3) then |
---|
| 352 | endif !if (modif_sst.ge.2) then |
---|
| 353 | endif ! if (modif_sst.ge.1) then |
---|
| 354 | call getin('modif_sic',modif_sic) |
---|
| 355 | if (modif_sic.ge.1) then |
---|
| 356 | call getin('deltasic',deltasic) |
---|
| 357 | endif !if (modif_sic.ge.1) then |
---|
| 358 | |
---|
| 359 | call getin('albedo_prescrit',albedo_prescrit) |
---|
| 360 | call getin('lon_min_albedo',lon_min_albedo) |
---|
| 361 | call getin('lon_max_albedo',lon_max_albedo) |
---|
| 362 | call getin('lat_min_albedo',lat_min_albedo) |
---|
| 363 | call getin('lat_max_albedo',lat_max_albedo) |
---|
| 364 | call getin('deltaO18_oce',deltaO18_oce) |
---|
| 365 | call getin('deltaP_BL',deltaP_BL) |
---|
| 366 | call getin('ruissellement_pluie',ruissellement_pluie) |
---|
| 367 | call getin('alphak_stewart',alphak_stewart) |
---|
| 368 | call getin('tdifexp_sol',tdifexp_sol) |
---|
| 369 | call getin('calendrier_guide',calendrier_guide) |
---|
| 370 | call getin('cste_surf_cond',cste_surf_cond) |
---|
| 371 | call getin('mixlen',mixlen) |
---|
| 372 | call getin('evap_cont_cste',evap_cont_cste) |
---|
| 373 | call getin('deltaO18_evap_cont',deltaO18_evap_cont) |
---|
| 374 | call getin('d_evap_cont',d_evap_cont) |
---|
| 375 | call getin('nudge_qsol',nudge_qsol) |
---|
| 376 | call getin('region_nudge_qsol',region_nudge_qsol) |
---|
| 377 | call getin('no_pce',no_pce) |
---|
| 378 | call getin('A_satlim',A_satlim) |
---|
| 379 | call getin('ok_restrict_A_satlim',ok_restrict_A_satlim) |
---|
| 380 | #ifdef ISOVERIF |
---|
| 381 | !call iso_verif_positif(1.0-A_satlim,'iso_init 158') |
---|
| 382 | if (A_satlim.gt.1.0) then |
---|
| 383 | write(*,*) 'iso_init 315: A_satlim=',A_satlim |
---|
| 384 | stop |
---|
| 385 | endif |
---|
| 386 | #endif |
---|
| 387 | ! call getin('slope_limiterxy',slope_limiterxy) |
---|
| 388 | ! call getin('slope_limiterz',slope_limiterz) |
---|
| 389 | call getin('modif_ratqs',modif_ratqs) |
---|
| 390 | call getin('Pcrit_ratqs',Pcrit_ratqs) |
---|
| 391 | call getin('ratqsbasnew',ratqsbasnew) |
---|
| 392 | call getin('fac_modif_evaoce',fac_modif_evaoce) |
---|
| 393 | call getin('ok_bidouille_wake',ok_bidouille_wake) |
---|
| 394 | call getin('cond_temp_env',cond_temp_env) |
---|
| 395 | if (use_iso(iso_HTO_possible)) then |
---|
| 396 | ok_prod_nucl_tritium=.true. |
---|
| 397 | call getin('ok_prod_nucl_tritium',ok_prod_nucl_tritium) |
---|
| 398 | endif |
---|
| 399 | |
---|
| 400 | write(*,*) 'lambda,thumxt1=',lambda_sursat,thumxt1 |
---|
| 401 | write(*,*) 'bidouille_anti_divergence=',bidouille_anti_divergence |
---|
| 402 | write(*,*) 'essai_convergence=',essai_convergence |
---|
| 403 | write(*,*) 'initialisation_iso=',initialisation_iso |
---|
| 404 | write(*,*) 'modif_sst=',modif_sst |
---|
| 405 | if (modif_sst.ge.1) then |
---|
| 406 | write(*,*) 'deltaTtest=',deltaTtest |
---|
| 407 | if (modif_sst.ge.2) then |
---|
| 408 | write(*,*) 'deltaTtestpoles,sstlatcrit=', & |
---|
| 409 | & deltaTtestpoles,sstlatcrit |
---|
| 410 | if (modif_sst.ge.3) then |
---|
| 411 | write(*,*) 'dsstlatcrit=',dsstlatcrit |
---|
| 412 | endif !if (modif_sst.ge.3) then |
---|
| 413 | endif !if (modif_sst.ge.2) then |
---|
| 414 | endif !if (modif_sst.ge.1) then |
---|
| 415 | write(*,*) 'modif_sic=',modif_sic |
---|
| 416 | if (modif_sic.ge.1) then |
---|
| 417 | write(*,*) 'deltasic=',deltasic |
---|
| 418 | endif !if (modif_sic.ge.1) then |
---|
| 419 | write(*,*) 'deltaO18_oce=',deltaO18_oce |
---|
| 420 | write(*,*) 'albedo_prescrit=',albedo_prescrit |
---|
| 421 | if (albedo_prescrit.eq.1) then |
---|
| 422 | write(*,*) 'lon_min_albedo,lon_max_albedo=', & |
---|
| 423 | & lon_min_albedo,lon_max_albedo |
---|
| 424 | write(*,*) 'lat_min_albedo,lat_max_albedo=', & |
---|
| 425 | & lat_min_albedo,lat_max_albedo |
---|
| 426 | endif !if (albedo_prescrit.eq.1) then |
---|
| 427 | write(*,*) 'deltaP_BL,ruissellement_pluie,alphak_stewart=', & |
---|
| 428 | & deltaP_BL,ruissellement_pluie,alphak_stewart |
---|
| 429 | write(*,*) 'cste_surf_cond=',cste_surf_cond |
---|
| 430 | write(*,*) 'mixlen=',mixlen |
---|
| 431 | write(*,*) 'tdifexp_sol=',tdifexp_sol |
---|
| 432 | write(*,*) 'calendrier_guide=',calendrier_guide |
---|
| 433 | write(*,*) 'evap_cont_cste=',evap_cont_cste |
---|
| 434 | write(*,*) 'deltaO18_evap_cont,d_evap_cont=', & |
---|
| 435 | & deltaO18_evap_cont,d_evap_cont |
---|
| 436 | write(*,*) 'nudge_qsol,region_nudge_qsol=', & |
---|
| 437 | & nudge_qsol,region_nudge_qsol |
---|
| 438 | write(*,*) 'nlevmaxO17=',nlevmaxO17 |
---|
| 439 | write(*,*) 'no_pce=',no_pce |
---|
| 440 | write(*,*) 'A_satlim=',A_satlim |
---|
| 441 | write(*,*) 'ok_restrict_A_satlim=',ok_restrict_A_satlim |
---|
| 442 | ! write(*,*) 'slope_limiterxy=',slope_limiterxy |
---|
| 443 | ! write(*,*) 'slope_limiterz=',slope_limiterz |
---|
| 444 | write(*,*) 'modif_ratqs=',modif_ratqs |
---|
| 445 | write(*,*) 'Pcrit_ratqs=',Pcrit_ratqs |
---|
| 446 | write(*,*) 'ratqsbasnew=',ratqsbasnew |
---|
| 447 | write(*,*) 'fac_modif_evaoce=',fac_modif_evaoce |
---|
| 448 | write(*,*) 'ok_bidouille_wake=',ok_bidouille_wake |
---|
| 449 | write(*,*) 'cond_temp_env=',cond_temp_env |
---|
| 450 | write(*,*) 'ok_prod_nucl_tritium=',ok_prod_nucl_tritium |
---|
| 451 | |
---|
| 452 | |
---|
| 453 | !-------------------------------------------------------------- |
---|
| 454 | ! Parameters that do not depend on the nature of water isotopes: |
---|
| 455 | !-------------------------------------------------------------- |
---|
| 456 | |
---|
| 457 | ! -- temperature at which ice condensate starts to form (valeur ECHAM?): |
---|
| 458 | pxtmelt=273.15 |
---|
| 459 | ! pxtmelt=273.15-10.0 ! test PHASE |
---|
| 460 | |
---|
| 461 | ! -- temperature at which all condensate is ice: |
---|
| 462 | pxtice=273.15-10.0 |
---|
| 463 | ! pxtice=273.15-30.0 ! test PHASE |
---|
| 464 | |
---|
| 465 | ! -- minimum temperature to calculate fractionation coeff |
---|
| 466 | pxtmin=273.15-120.0 ! On ne calcule qu'au dessus de -120°C |
---|
| 467 | pxtmax=273.15+60.0 ! On ne calcule qu'au dessus de +60°C |
---|
| 468 | ! remarque: les coeffs ont été mesurés seulement jusq'à -40! |
---|
| 469 | |
---|
| 470 | ! -- a constant for alpha_eff for equilibrium below cloud base: |
---|
| 471 | tdifexp=0.58 |
---|
| 472 | tv0cin=7.0 |
---|
| 473 | |
---|
| 474 | ! facteurs lambda et mu dans Si=musi-lambda*T |
---|
| 475 | musi=1.0 |
---|
| 476 | if (ok_nocinsat) then |
---|
| 477 | lambda_sursat = 0.0 ! no sursaturation effect |
---|
| 478 | endif |
---|
| 479 | |
---|
| 480 | |
---|
| 481 | ! diffusion dans le sol |
---|
| 482 | Kd=2.5e-9 ! m2/s |
---|
| 483 | |
---|
| 484 | ! cas où cste_surf_cond: on met rhs ou/et Ts cste pour voir |
---|
| 485 | rh_cste_surf_cond=0.6 |
---|
| 486 | T_cste_surf_cond=288.0 |
---|
| 487 | |
---|
| 488 | !-------------------------------------------------------------- |
---|
| 489 | ! Parameters that depend on the nature of water isotopes: |
---|
| 490 | !-------------------------------------------------------------- |
---|
| 491 | ! ** constantes locales |
---|
| 492 | fac_enrichoce18=0.0005 |
---|
| 493 | ! on a alors tcor018=1+fac_enrichoce18 |
---|
| 494 | ! tcorD=1+fac_enrichoce18*8 |
---|
| 495 | ! tcorO17=1+fac_enrichoce18*0.528 |
---|
| 496 | alpha_liq_sol_O18=1.00291 ! valeur de Lehmann & Siegenthaler, 1991, |
---|
| 497 | ! Journal of Glaciology, vol 37, p 23 |
---|
| 498 | talph1_O18=1137. |
---|
| 499 | talph2_O18=-0.4156 |
---|
| 500 | talph3_O18=-2.0667E-3 |
---|
| 501 | talps1_O18=11.839 |
---|
| 502 | talps2_O18=-0.028244 |
---|
| 503 | tkcin0_O18 = 0.006 |
---|
| 504 | tkcin1_O18 = 0.000285 |
---|
| 505 | tkcin2_O18 = 0.00082 |
---|
| 506 | tdifrel_O18= 1./0.9723 |
---|
| 507 | |
---|
| 508 | ! rapport des ln(alphaeq) entre O18 et O17 |
---|
| 509 | fac_coeff_eq17_liq=0.529 ! donné par Amaelle |
---|
| 510 | ! fac_coeff_eq17_ice=0.528 ! slope MWL |
---|
| 511 | fac_coeff_eq17_ice=0.529 |
---|
| 512 | |
---|
| 513 | |
---|
| 514 | write(*,*) 'iso_O18,iso_HDO,iso_eau=',iso_O18,iso_HDO,iso_eau |
---|
| 515 | do 999 ixt = 1, niso |
---|
| 516 | write(*,*) 'iso_init 80: ixt=',ixt |
---|
| 517 | |
---|
| 518 | |
---|
| 519 | ! -- kinetic factor for surface evaporation: |
---|
| 520 | ! (cf: kcin = tkcin0 if |V|<tv0cin |
---|
| 521 | ! kcin = tkcin1*|Vsurf| + tkcin2 if |V|>tv0cin ) |
---|
| 522 | ! (Rq: formula discontinuous for |V|=tv0cin... ) |
---|
| 523 | |
---|
| 524 | ! -- main: |
---|
| 525 | if (ixt.eq.iso_HTO) then ! Tritium |
---|
| 526 | tkcin0(ixt) = 0.01056 |
---|
| 527 | tkcin1(ixt) = 0.0005016 |
---|
| 528 | tkcin2(ixt) = 0.0014432 |
---|
| 529 | tnat(ixt)=0. |
---|
| 530 | !toce(ixt)=2.2222E-8 ! corrigé par Alex Cauquoin |
---|
| 531 | !toce(ixt)=1.0E-18 ! rapport 3H/1H ocean |
---|
| 532 | toce(ixt)=4.0E-19 ! rapport T/H = 0.2 TU Dreisigacker and Roether 1978 |
---|
| 533 | tcorr(ixt)=1. |
---|
| 534 | tdifrel(ixt)=1./0.968 |
---|
| 535 | talph1(ixt)=46480. |
---|
| 536 | talph2(ixt)=-103.87 |
---|
| 537 | talph3(ixt)=0. |
---|
| 538 | talps1(ixt)=46480. |
---|
| 539 | talps2(ixt)=-103.87 |
---|
| 540 | alpha_liq_sol(ixt)=1. |
---|
| 541 | Rdefault(ixt)=0.0 |
---|
| 542 | Rmethox(ixt)=0.0 |
---|
| 543 | striso(ixt)='HTO' |
---|
| 544 | endif |
---|
| 545 | if (ixt.eq.iso_O17) then ! Deuterium |
---|
| 546 | pente_MWL=0.528 |
---|
| 547 | ! tdifrel(ixt)=1./0.985452 ! donné par Amaelle |
---|
| 548 | tdifrel(ixt)=1./0.98555 ! valeur utilisée en 1D et dans modèle de LdG |
---|
| 549 | ! fac_kcin=0.5145 ! donné par Amaelle |
---|
| 550 | fac_kcin= (tdifrel(ixt)-1.0)/(tdifrel_O18-1.0) |
---|
| 551 | tkcin0(ixt) = tkcin0_O18*fac_kcin |
---|
| 552 | tkcin1(ixt) = tkcin1_O18*fac_kcin |
---|
| 553 | tkcin2(ixt) = tkcin2_O18*fac_kcin |
---|
| 554 | tnat(ixt)=0.004/100. ! O17 représente 0.004% de l'oxygène |
---|
| 555 | toce(ixt)=tnat(ixt)*(1.0+deltaO18_oce/1000.0)**pente_MWL |
---|
| 556 | tcorr(ixt)=1.0+fac_enrichoce18*pente_MWL ! donné par Amaelle |
---|
| 557 | talph1(ixt)=talph1_O18 |
---|
| 558 | talph2(ixt)=talph2_O18 |
---|
| 559 | talph3(ixt)=talph3_O18 |
---|
| 560 | talps1(ixt)=talps1_O18 |
---|
| 561 | talps2(ixt)=talps2_O18 |
---|
| 562 | alpha_liq_sol(ixt)=(alpha_liq_sol_O18)**fac_coeff_eq17_liq |
---|
| 563 | if (Rdefault_smow) then |
---|
| 564 | Rdefault(ixt)=tnat(ixt)*(-3.15/1000.0+1.0) |
---|
| 565 | else |
---|
| 566 | Rdefault(ixt)=0.0 |
---|
| 567 | endif |
---|
| 568 | Rmethox(ixt)=(230./1000.+1.)*tnat(ixt) !Zahn et al 2006 |
---|
| 569 | striso(ixt)='O17' |
---|
| 570 | endif |
---|
| 571 | |
---|
| 572 | if (ixt.eq.iso_O18) then ! Oxygene18 |
---|
| 573 | tkcin0(ixt) = tkcin0_O18 |
---|
| 574 | tkcin1(ixt) = tkcin1_O18 |
---|
| 575 | tkcin2(ixt) = tkcin2_O18 |
---|
| 576 | tnat(ixt)=2005.2E-6 |
---|
| 577 | toce(ixt)=tnat(ixt)*(1.0+deltaO18_oce/1000.0) |
---|
| 578 | tcorr(ixt)=1.0+fac_enrichoce18 |
---|
| 579 | tdifrel(ixt)=tdifrel_O18 |
---|
| 580 | talph1(ixt)=talph1_O18 |
---|
| 581 | talph2(ixt)=talph2_O18 |
---|
| 582 | talph3(ixt)=talph3_O18 |
---|
| 583 | talps1(ixt)=talps1_O18 |
---|
| 584 | talps2(ixt)=talps2_O18 |
---|
| 585 | alpha_liq_sol(ixt)=alpha_liq_sol_O18 |
---|
| 586 | if (Rdefault_smow) then |
---|
| 587 | Rdefault(ixt)=tnat(ixt)*(-6.0/1000.0+1.0) |
---|
| 588 | else |
---|
| 589 | Rdefault(ixt)=0.0 |
---|
| 590 | endif |
---|
| 591 | Rmethox(ixt)=(130./1000.+1.)*tnat(ixt) !Zahn et al 2006 |
---|
| 592 | ! write(*,*) 'iso_init 163: ZXalpha_liq_sol=',ZXalpha_liq_sol |
---|
| 593 | striso(ixt)='O18' |
---|
| 594 | write(*,*) 'isotopes_mod 519: ixt,striso(ixt)=',ixt,striso(ixt) |
---|
| 595 | endif |
---|
| 596 | |
---|
| 597 | if (ixt.eq.iso_HDO) then ! Deuterium |
---|
| 598 | pente_MWL=8.0 |
---|
| 599 | ! fac_kcin=0.88 |
---|
| 600 | tdifrel(ixt)=1./0.9755 |
---|
| 601 | fac_kcin= (tdifrel(ixt)-1)/(tdifrel_O18-1) |
---|
| 602 | tkcin0(ixt) = tkcin0_O18*fac_kcin |
---|
| 603 | tkcin1(ixt) = tkcin1_O18*fac_kcin |
---|
| 604 | tkcin2(ixt) = tkcin2_O18*fac_kcin |
---|
| 605 | tnat(ixt)=155.76E-6 |
---|
| 606 | toce(ixt)=tnat(ixt)*(1.0+pente_MWL*deltaO18_oce/1000.0) |
---|
| 607 | tcorr(ixt)=1.0+fac_enrichoce18*pente_MWL |
---|
| 608 | talph1(ixt)=24844. |
---|
| 609 | talph2(ixt)=-76.248 |
---|
| 610 | talph3(ixt)=52.612E-3 |
---|
| 611 | talps1(ixt)=16288. |
---|
| 612 | talps2(ixt)=-0.0934 |
---|
| 613 | !ZXalpha_liq_sol=1.0192 ! Weston, Ralph, 1955 |
---|
| 614 | alpha_liq_sol(ixt)=1.0212 |
---|
| 615 | ! valeur de Lehmann & Siegenthaler, 1991, Journal of |
---|
| 616 | ! Glaciology, vol 37, p 23 |
---|
| 617 | if (Rdefault_smow) then |
---|
| 618 | Rdefault(ixt)=tnat(ixt)*((-6.0*pente_MWL+10.0)/1000.0+1.0) |
---|
| 619 | else |
---|
| 620 | Rdefault(ixt)=0.0 |
---|
| 621 | endif |
---|
| 622 | Rmethox(ixt)=tnat(ixt)*(-25.0/1000.+1.) ! Zahn et al 2006 |
---|
| 623 | striso(ixt)='HDO' |
---|
| 624 | write(*,*) 'isotopes_mod 548: ixt,striso(ixt)=',ixt,striso(ixt) |
---|
| 625 | endif |
---|
| 626 | |
---|
| 627 | ! write(*,*) 'iso_init 163: ZXalpha_liq_sol=',ZXalpha_liq_sol |
---|
| 628 | if (ixt.eq.iso_eau) then ! Oxygene16 |
---|
| 629 | tkcin0(ixt) = 0.0 |
---|
| 630 | tkcin1(ixt) = 0.0 |
---|
| 631 | tkcin2(ixt) = 0.0 |
---|
| 632 | tnat(ixt)=1. |
---|
| 633 | toce(ixt)=tnat(ixt) |
---|
| 634 | tcorr(ixt)=1.0 |
---|
| 635 | tdifrel(ixt)=1. |
---|
| 636 | talph1(ixt)=0. |
---|
| 637 | talph2(ixt)=0. |
---|
| 638 | talph3(ixt)=0. |
---|
| 639 | talps1(ixt)=0. |
---|
| 640 | talph3(ixt)=0. |
---|
| 641 | alpha_liq_sol(ixt)=1. |
---|
| 642 | if (Rdefault_smow) then |
---|
| 643 | Rdefault(ixt)=tnat(ixt)*1.0 |
---|
| 644 | else |
---|
| 645 | Rdefault(ixt)=1.0 |
---|
| 646 | endif |
---|
| 647 | Rmethox(ixt)=1.0 |
---|
| 648 | striso(ixt)='eau' |
---|
| 649 | endif |
---|
| 650 | |
---|
| 651 | 999 continue |
---|
| 652 | |
---|
| 653 | ! test de sensibilité: |
---|
| 654 | if (ok_nocinsfc) then ! no kinetic effect in sfc evaporation |
---|
| 655 | do ixt=1,niso |
---|
| 656 | tkcin0(ixt) = 0.0 |
---|
| 657 | tkcin1(ixt) = 0.0 |
---|
| 658 | tkcin2(ixt) = 0.0 |
---|
| 659 | enddo |
---|
| 660 | endif |
---|
| 661 | |
---|
| 662 | ! fermeture fichier de paramètres |
---|
| 663 | close(unit=32) |
---|
| 664 | |
---|
| 665 | ! nom des isotopes |
---|
| 666 | |
---|
| 667 | ! verif |
---|
| 668 | write(*,*) 'iso_init 285: verif initialisation:' |
---|
| 669 | |
---|
| 670 | do ixt=1,niso |
---|
| 671 | write(*,*) '* striso(',ixt,')=<'//striso(ixt)//'>' |
---|
| 672 | write(*,*) 'tnat(',ixt,')=',tnat(ixt) |
---|
| 673 | ! write(*,*) 'alpha_liq_sol(',ixt,')=',alpha_liq_sol(ixt) |
---|
| 674 | ! write(*,*) 'tkcin0(',ixt,')=',tkcin0(ixt) |
---|
| 675 | ! write(*,*) 'tdifrel(',ixt,')=',tdifrel(ixt) |
---|
| 676 | enddo |
---|
| 677 | write(*,*) 'iso_init 69: lambda=',lambda_sursat |
---|
| 678 | write(*,*) 'iso_init 69: thumxt1=',thumxt1 |
---|
| 679 | write(*,*) 'iso_init 69: h_land_ice=',h_land_ice |
---|
| 680 | write(*,*) 'iso_init 69: P_veg=',P_veg |
---|
| 681 | |
---|
| 682 | |
---|
| 683 | END SUBROUTINE iso_init |
---|
| 684 | |
---|
| 685 | ! functions basiques mises ici pour éviter dépendances circulaires |
---|
| 686 | !*********** |
---|
| 687 | function double_to_real(a) |
---|
| 688 | implicit none |
---|
| 689 | double precision a |
---|
| 690 | real double_to_real |
---|
| 691 | |
---|
| 692 | double_to_real=a |
---|
| 693 | |
---|
| 694 | return |
---|
| 695 | end function double_to_real |
---|
| 696 | |
---|
| 697 | !*********** |
---|
| 698 | function real_to_double(a) |
---|
| 699 | implicit none |
---|
| 700 | real a |
---|
| 701 | double precision real_to_double |
---|
| 702 | |
---|
| 703 | real_to_double=a |
---|
| 704 | |
---|
| 705 | return |
---|
| 706 | end function real_to_double |
---|
| 707 | |
---|
| 708 | END MODULE isotopes_mod |
---|
| 709 | #endif |
---|
| 710 | |
---|
| 711 | |
---|