[4] | 1 | ! ********************************************************************** |
---|
| 2 | ! * GRISLI Grenoble Ice Shelves-Land Ice |
---|
| 3 | ! ********************************************************************** |
---|
| 4 | |
---|
| 5 | |
---|
| 6 | ! Ont participe a l'ecriture de ce modele : |
---|
| 7 | ! |
---|
| 8 | ! Catherine Ritz (tout du long) |
---|
| 9 | ! Adeline Fabre (la partie Gremlins) |
---|
| 10 | ! Vincent Rommelaere (ice shelves et ice streams) |
---|
| 11 | ! Christophe Dumas (debut f90, (Antarctique) |
---|
| 12 | ! Vincent Peyaud (portage HN,calving, front, hydrol) |
---|
| 13 | ! Cyril Mazauric (AGRIF) |
---|
| 14 | ! Hassine Baya (netcdf, doxygen, icetemp,...) |
---|
| 15 | ! |
---|
| 16 | ! catritz@lgge.obs.ujf-grenoble.fr |
---|
| 17 | ! |
---|
| 18 | ! ********************************************************************** |
---|
| 19 | |
---|
| 20 | |
---|
| 21 | |
---|
| 22 | !> \mainpage GRISLI Modele 3D De Calotte Glaciaire |
---|
| 23 | !! |
---|
| 24 | !! \section start Pour commencer |
---|
| 25 | !! Le programme principal est dans le module main3D. |
---|
| 26 | !! Ce module est dans le fichier main3D-0.4-40km.f90. |
---|
| 27 | !! |
---|
| 28 | !! \section tree Arbre d'appel |
---|
| 29 | !! |
---|
| 30 | !! - call grisli_init() |
---|
| 31 | !! - step_grisli() |
---|
| 32 | !! - sortie_ncdf_cat() |
---|
| 33 | !! - testsort_time_ncdf() |
---|
| 34 | !! - initial() |
---|
| 35 | !! - sortie_hz_multi() |
---|
| 36 | !! - call step_grisli1() |
---|
| 37 | !! |
---|
| 38 | !< |
---|
| 39 | |
---|
| 40 | |
---|
| 41 | !> \file main3D-0.4-40km.f90 GRISLI Modele 3D De Calotte Glaciaire |
---|
| 42 | !! programme principal |
---|
| 43 | !! (voir l'\ref tree) |
---|
| 44 | !! |
---|
| 45 | !! @brief modele flow line d'evolution de calotte |
---|
| 46 | !! @authors Catherine Ritz catritz@lgge.obs.ujf-grenoble.fr (tout du long) |
---|
| 47 | !! @authors Adeline Fabre (la partie Gremlins) |
---|
| 48 | !! @authors Vincent Rommelaere (ice shelves et ice streams) |
---|
| 49 | !! @authors Christophe Dumas (debut f90, (Antarctique) |
---|
| 50 | !! @authors Vincent Peyaud (portage HN,calving, front, hydrol) |
---|
| 51 | !! @authors Cyril Mazauric (AGRIF) |
---|
| 52 | !! |
---|
| 53 | !! |
---|
| 54 | !! @note use module3D_phy |
---|
| 55 | !! @note use module_choix |
---|
| 56 | !! @note use flottab_mod |
---|
[24] | 57 | !! @note use icetempmod |
---|
[4] | 58 | !! @note use sorties_ncdf_grisli |
---|
| 59 | !! @note use diagno_mod |
---|
| 60 | !! @note use resolmeca_SIA_L1 |
---|
| 61 | !! |
---|
| 62 | !! |
---|
| 63 | !! Ce module appelle les routines suivantes : |
---|
| 64 | !! - grisli_init() |
---|
| 65 | !! - step_grisli1() |
---|
| 66 | !! - step_output() |
---|
| 67 | !! |
---|
| 68 | !< |
---|
| 69 | |
---|
| 70 | !> \namespace main3D GRISLI Modele 3D De Calotte Glaciaire |
---|
| 71 | !! programme principal |
---|
| 72 | !! (voir l'\ref tree) |
---|
| 73 | !! |
---|
| 74 | !! |
---|
| 75 | !! @brief modele flow line d'evolution de calotte |
---|
| 76 | !! @authors Catherine Ritz catritz@lgge.obs.ujf-grenoble.fr (tout du long) |
---|
| 77 | !! @authors Adeline Fabre (la partie Gremlins) |
---|
| 78 | !! @authors Vincent Rommelaere (ice shelves et ice streams) |
---|
| 79 | !! @authors Christophe Dumas (debut f90, (Antarctique) |
---|
| 80 | !! @authors Vincent Peyaud (portage HN,calving, front, hydrol) |
---|
| 81 | !! @authors Cyril Mazauric (AGRIF) |
---|
| 82 | !! |
---|
| 83 | !! |
---|
| 84 | !! @note use module3D_phy |
---|
| 85 | !! @note use module_choix |
---|
| 86 | !! @note use flottab_mod |
---|
[24] | 87 | !! @note use icetempmod |
---|
[4] | 88 | !! @note use sorties_ncdf_grisli |
---|
| 89 | !! @note use diagno_mod |
---|
| 90 | !! @note use resolmeca_SIA_L1 |
---|
| 91 | !! |
---|
| 92 | !! |
---|
| 93 | !! @todo itracebug : faire une routine |
---|
| 94 | !! |
---|
| 95 | !! Ce module appelle les routines suivantes : |
---|
| 96 | !! - grisli_init() |
---|
| 97 | !! - step_grisli1() |
---|
| 98 | !! |
---|
| 99 | !! Defined in file main3D-0.4-40km.f90 |
---|
| 100 | !< |
---|
| 101 | |
---|
| 102 | program main3D |
---|
| 103 | |
---|
| 104 | USE module3D_phy |
---|
| 105 | USE module_choix ! module de choix du type de run |
---|
| 106 | ! module_choix donne acces a tous les modules |
---|
| 107 | ! de declaration des packages |
---|
| 108 | use flottab_mod |
---|
[24] | 109 | use icetempmod |
---|
[4] | 110 | use sorties_ncdf_grisli |
---|
| 111 | use diagno_mod |
---|
| 112 | use resolmeca_SIA_L1 |
---|
[112] | 113 | use bilan_eau_mod |
---|
[4] | 114 | ! use track_debug |
---|
| 115 | |
---|
| 116 | implicit none |
---|
| 117 | |
---|
| 118 | |
---|
| 119 | ! good luck |
---|
| 120 | |
---|
| 121 | call grisli_init ! Initializations |
---|
| 122 | |
---|
| 123 | time_loop: do nt=1,ntmax !____________________________ debut boucle temporelle |
---|
| 124 | |
---|
| 125 | if (time.ge.tend) exit |
---|
| 126 | if (time.gt.10) itracebug = 0 |
---|
| 127 | call step_time_loop() |
---|
| 128 | |
---|
| 129 | end do time_loop |
---|
| 130 | if (itracebug.eq.1) call tracebug('dans main avant call out_recovery ') |
---|
| 131 | call out_recovery(iout) |
---|
| 132 | |
---|
| 133 | write(6,*) "end of the run at time = ",time |
---|
| 134 | write(6,*) "_____________________________________________________________________" |
---|
| 135 | |
---|
| 136 | end program main3D |
---|
| 137 | |
---|
| 138 | |
---|
| 139 | !--------------------------------------------------------------------------------------- |
---|
| 140 | subroutine grisli_init |
---|
| 141 | |
---|
| 142 | USE module3D_phy |
---|
| 143 | USE module_choix ! module de choix du type de run |
---|
| 144 | ! module_choix donne acces a tous les modules |
---|
| 145 | ! de declaration des packages |
---|
| 146 | use flottab_mod |
---|
[24] | 147 | use icetempmod |
---|
[4] | 148 | use sorties_ncdf_grisli |
---|
| 149 | use util_recovery |
---|
| 150 | use diagno_mod |
---|
| 151 | ! use track_debug |
---|
| 152 | |
---|
| 153 | implicit none |
---|
| 154 | |
---|
| 155 | if (itracebug.eq.1) call tracebug(' Entree dans routine grisli_init') |
---|
| 156 | ! switch pour passer ou non par T lliboutry calcule => 0, ne passe pas, |
---|
| 157 | ! 1 ou 2 passe (se met a 0 tout seul si on prend un fichier .cptr) |
---|
| 158 | |
---|
| 159 | ITEMP=0 |
---|
| 160 | |
---|
| 161 | ! switch couple physique faible => CP et CT independant T |
---|
| 162 | ! 0 pas de trait. vert. A FAIRE niveau L0 |
---|
| 163 | ! 1 pas de couplage , faible physique niveau L1 |
---|
| 164 | ! 2 couplage, faible physique niveau L2 |
---|
| 165 | ! 3 couplage, physique complete sans CBT niveau L3 |
---|
| 166 | ! 4 idem 3 mais loi de def. Duval niveau L4 |
---|
| 167 | ICOUPLE=4 |
---|
| 168 | ! switch margin IMARGIN=0 fixed, IMARGIN=1 moving |
---|
| 169 | IMARGIN=1 |
---|
| 170 | |
---|
| 171 | TIMECG=TBEGIN |
---|
| 172 | nt=-1 ! utilisee dans initialisation flottab |
---|
| 173 | ! sortie profile tous les dtprofile |
---|
| 174 | DTPROFILE=50000. |
---|
| 175 | marine=.true. |
---|
| 176 | ! ----------------------------------fin des modifs run les plus usuelles |
---|
[157] | 177 | !DIRNAMEOUT='../RESULTATS/' |
---|
[10] | 178 | DIRNAMEOUT='./' |
---|
[4] | 179 | |
---|
| 180 | call initial ! routine qui appel toutes les routines d'initialisation |
---|
| 181 | |
---|
| 182 | |
---|
| 183 | ! call init_sortie_ncdf |
---|
| 184 | ! call sortie_ncdf_cat |
---|
| 185 | ! STOP |
---|
| 186 | |
---|
| 187 | ! compteur tous les DTCPT |
---|
| 188 | DTCPT=dtout |
---|
| 189 | |
---|
| 190 | |
---|
| 191 | ! ************ OPEN FILES.RITZ **************** |
---|
| 192 | |
---|
| 193 | if ((geoplace.eq.'anteis1').or.(geoplace.eq.'ant20km')) then |
---|
| 194 | ! fichier de reference pour le niveau des mers |
---|
| 195 | open(num_sealevel,file=TRIM(DIRNAMEOUT)//'sealevel'//runname//'.ritz',position="append") |
---|
| 196 | open(num_ts_ritz,file=TRIM(DIRNAMEOUT)//'ts_'//runname//'.ritz',position="append") |
---|
| 197 | open(num_ic_vo,file=TRIM(DIRNAMEOUT)//'ic_'//runname//'vo.ritz',position="append") |
---|
| 198 | open(num_ic_by,file=TRIM(DIRNAMEOUT)//'ic_'//runname//'by.ritz',position="append") |
---|
| 199 | open(num_ic_dm,file=TRIM(DIRNAMEOUT)//'ic_'//runname//'dm.ritz',position="append") |
---|
| 200 | open(num_ic_dc,file=TRIM(DIRNAMEOUT)//'ic_'//runname//'dc.ritz',position="append") |
---|
| 201 | open(num_ic_df,file=TRIM(DIRNAMEOUT)//'ic_'//runname//'df.ritz',position="append") |
---|
| 202 | endif |
---|
| 203 | |
---|
| 204 | !------------------------------ INITIALISATION ---------------------------- |
---|
| 205 | ! |
---|
| 206 | ! ecriture netcdf apres initialisation |
---|
| 207 | |
---|
| 208 | |
---|
| 209 | |
---|
[19] | 210 | call testsort_time_ncdf(dble(tbegin)) |
---|
[4] | 211 | if (iglob_ncdf .EQ. 1) call sortie_ncdf_cat |
---|
| 212 | |
---|
| 213 | |
---|
[142] | 214 | !cdc supprime pour initialisation propre |
---|
| 215 | !~ if (iter_beta.eq.0) then |
---|
[4] | 216 | |
---|
[142] | 217 | !~ if (itracebug.eq.1) call tracebug(' Avant appel routine icethick3') |
---|
| 218 | !~ call icethick3 |
---|
| 219 | !~ debug_3D(:,:,88) = S(:,:) |
---|
| 220 | !~ if (itracebug.eq.1) call tracebug(' Apres appel routine icethick3') |
---|
| 221 | !~ end if |
---|
[4] | 222 | |
---|
| 223 | |
---|
| 224 | ! Tgrounded, temps pendant lequel la calotte est terrestre |
---|
| 225 | tgrounded=tbegin-10. |
---|
| 226 | !if (tgrounded.le.tbegin) then |
---|
| 227 | marine=.true. ! Cas la calotte est terrestre |
---|
| 228 | !end if |
---|
| 229 | |
---|
| 230 | ! test vincent car certains H(i,j)=0 dans fichier de reprise |
---|
| 231 | do j=1,ny |
---|
| 232 | do i=1,nx |
---|
[113] | 233 | H(i,j)=max(0.,H(i,j)) |
---|
[4] | 234 | enddo |
---|
| 235 | enddo |
---|
| 236 | |
---|
| 237 | |
---|
| 238 | ! call firstoutput() ! ouverture fichier temporel et premieres ecritures |
---|
| 239 | |
---|
[9] | 240 | call forclim ! initialisation BM et TS |
---|
[4] | 241 | call ablation |
---|
| 242 | |
---|
| 243 | |
---|
| 244 | |
---|
| 245 | ! ----------- CALCULATION OF INITIAL TEMPERATURES |
---|
| 246 | |
---|
| 247 | tcpt:if (ICOMPTEUR.eq.0) then |
---|
| 248 | |
---|
| 249 | |
---|
| 250 | if ((GEOPLACE.ne.'eismint').and.(GEOPLACE(1:6).ne.'marine')) then |
---|
| 251 | ! ITEMP=1 => calcul de T lliboutry; ITEMP=2 => reprise d'un fichier cptr |
---|
| 252 | ! ITEMP=0 => on ne prend pas en compte T Lliboutry |
---|
| 253 | ! ITEMP=3 => on prend les temperatures d'un fichier cptr |
---|
| 254 | |
---|
| 255 | |
---|
| 256 | |
---|
| 257 | if ((ITEMP.eq.0).or.(ITEMP.eq.3)) then |
---|
| 258 | call masque() |
---|
| 259 | |
---|
| 260 | call Neffect() |
---|
| 261 | |
---|
| 262 | call flottab() |
---|
| 263 | |
---|
| 264 | call Neffect() |
---|
| 265 | |
---|
| 266 | |
---|
| 267 | ! call vitbilan_lect ! routine de lecture des vitesses de bilan |
---|
| 268 | ! ======================================================== |
---|
| 269 | |
---|
| 270 | if (ITEMP.eq.0) call lineartemp() |
---|
| 271 | |
---|
| 272 | call bmelt_grounded |
---|
| 273 | call bmeltshelf |
---|
| 274 | |
---|
| 275 | |
---|
| 276 | call flow_general |
---|
| 277 | |
---|
| 278 | do iglen=n1poly,n2poly |
---|
| 279 | call flowlaw(iglen) |
---|
| 280 | end do |
---|
| 281 | |
---|
| 282 | call Neffect() |
---|
| 283 | call flottab() |
---|
[128] | 284 | call calving |
---|
| 285 | call ablation_bord |
---|
| 286 | call flottab |
---|
[4] | 287 | call Neffect() |
---|
| 288 | call diffusiv() |
---|
| 289 | call SIA_velocities() |
---|
| 290 | endif |
---|
| 291 | |
---|
| 292 | |
---|
| 293 | endif |
---|
| 294 | ! fin du test geoplace |
---|
| 295 | |
---|
| 296 | else ! tcpt on reprend un fichier compteur (ICOMPTEUR.eq.1) |
---|
| 297 | |
---|
| 298 | time=tbegin ! prend le temps du compteur |
---|
| 299 | |
---|
| 300 | |
---|
| 301 | call masque() |
---|
| 302 | call flottab() |
---|
| 303 | call neffect() |
---|
| 304 | call flottab() |
---|
| 305 | call masque() |
---|
| 306 | |
---|
| 307 | do i=1,nx |
---|
| 308 | do j=1,ny |
---|
| 309 | if (S(i,j).lt.0) then |
---|
| 310 | print*,i,j,S(i,j) |
---|
| 311 | goto 11115 |
---|
| 312 | endif |
---|
| 313 | enddo |
---|
| 314 | enddo |
---|
| 315 | 11115 continue |
---|
| 316 | |
---|
[150] | 317 | call bmeltshelf ! afq -- |
---|
| 318 | |
---|
[4] | 319 | ! ======================================================== |
---|
| 320 | call flow_general |
---|
| 321 | |
---|
| 322 | do iglen=n1poly,n2poly |
---|
| 323 | call flowlaw(iglen) |
---|
| 324 | end do |
---|
| 325 | |
---|
| 326 | |
---|
| 327 | call Neffect() |
---|
| 328 | call flottab |
---|
| 329 | call diffusiv() |
---|
| 330 | call SIA_velocities() |
---|
| 331 | call strain_rate |
---|
| 332 | |
---|
| 333 | endif tcpt |
---|
| 334 | ! fin du test sur icompteur |
---|
| 335 | |
---|
| 336 | ! call init_sortie_ncdf |
---|
| 337 | ! call sortie_ncdf_cat |
---|
| 338 | |
---|
| 339 | call flottab() |
---|
| 340 | call Neffect() |
---|
| 341 | call flottab() |
---|
| 342 | |
---|
| 343 | if (icompteur.eq.0) then |
---|
| 344 | do i=1,nx |
---|
| 345 | do j=1,ny |
---|
| 346 | if (.not.flot(i,j)) then |
---|
| 347 | B(i,j) = Bsoc(i,j) |
---|
| 348 | Uxbar(i,j) = 0. |
---|
| 349 | Uybar(i,j) = 0. |
---|
| 350 | end if |
---|
| 351 | end do |
---|
| 352 | end do |
---|
| 353 | endif |
---|
| 354 | |
---|
| 355 | boost = .false. |
---|
| 356 | |
---|
| 357 | do i=2,nx-1 |
---|
| 358 | do j=2,ny-1 |
---|
| 359 | hwater(i,j)=max(hwater(i,j),0.) |
---|
| 360 | enddo |
---|
| 361 | enddo |
---|
| 362 | timemax=time |
---|
| 363 | isynchro=1 |
---|
| 364 | ndebug=0 |
---|
| 365 | ndebug_max=9 |
---|
| 366 | |
---|
| 367 | call step_thermomeca() ! un tour dans la boucle temporelle, partie avant icethick |
---|
| 368 | call init_sortie_ncdf |
---|
[112] | 369 | call init_bilan_eau |
---|
[4] | 370 | if (itracebug.eq.1) call tracebug(' fin routine grisli_init') |
---|
[19] | 371 | call testsort_time_ncdf(dble(tbegin)) |
---|
[4] | 372 | |
---|
| 373 | if (iglob_ncdf .EQ. 1) call sortie_ncdf_cat |
---|
| 374 | |
---|
| 375 | return |
---|
| 376 | end subroutine grisli_init |
---|