Changeset 11 for trunk/SOURCES/GrIce2sea_files
- Timestamp:
- 02/19/15 10:07:06 (9 years ago)
- Location:
- trunk/SOURCES/GrIce2sea_files
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SOURCES/GrIce2sea_files/climat_GrIce2sea_years_mod.f90
r4 r11 1 1 !> \file climat_GrIce2sea_mod.f90 2 ! forcage avec BM 2 3 !! Module ou les variations temporelles des variables climatiques 3 4 !! sont directement imposees … … 15 16 16 17 17 use module3d_phy 18 use lect_climref_Ice2sea18 use module3d_phy,only: nx,ny,S,S0,H,Bsoc,acc,abl,BM,Tann,Tjuly,Ts,time,dt,num_param,num_rep_42,dirnameinp 19 !use lect_climref_Ice2sea 19 20 use netcdf 20 21 use io_netcdf_grisli … … 51 52 real :: grad_S_smb_neg !> SMB < 0 South 52 53 real :: grad_S_smb_pos !> SMB >= 0 South 53 54 real :: coef_smb_unit ! pour corriger l'unite 55 56 real,dimension(nx,ny) :: TA0 !> Temp annuelle sur S0 54 57 55 58 56 59 ! pour les lectures ncdf 57 60 real*8, dimension(:,:,:), pointer :: tab3D !< tableau 3d real pointer 61 real*8, dimension(:,:), pointer :: tab !< tableau 2d real pointer 58 62 Character(len=10), dimension(3) :: dimtestname !> pour la sortie test netcdf 59 63 integer :: ncidloc !> pour la sortie test netcdf 60 64 integer :: status !> pour la sortie test netcdf 61 65 66 integer :: massb !< pour selectionner le type de calcul de smb 62 67 ! On a deux routines : celle avec un seul fichier (donnees observees) : massb_Ice2sea_fixe 63 68 ! Celle avec le bilan de masse sur plusieurs snapshots (annuels par ex.) entre lesquels on interpole. … … 73 78 subroutine input_clim 74 79 75 76 character (len=100) :: file_smb_snap !> nom du fichier dans lequel sont les snapshots 77 78 !lecture namelist 79 80 namelist/clim_snap/nb_snap,time_depart_snaps,ecart_snap,file_smb_snap 81 82 rewind(num_param) ! pour revenir au debut du fichier param_list.dat 83 read(num_param,clim_snap) 80 character(len=100) :: smb_file ! fichier smb 81 character(len=100) :: temp_annual_file ! temperature annuelles 82 character(len=100) :: file_smb_snap !> nom du fichier dans lequel sont les snapshots 83 84 integer :: err ! recuperation d'erreur 85 integer :: i,j,k 86 87 namelist/clim_smb_T_gen/smb_file,coef_smb_unit,temp_annual_file 88 89 428 format(A) 90 rewind(num_param) ! pour revenir au debut du fichier param_list.dat 91 read(num_param,clim_smb_T_gen) 92 93 write(num_rep_42,428)'!________________________________________________________________' 94 write(num_rep_42,428)'! module climat_Grice2sea_years_mod lecture climat ref ' 95 write(num_rep_42,clim_smb_T_gen) 96 write(num_rep_42,428)'! smb_file = fichier SMB (kg/m2/an) ' 97 write(num_rep_42,428)'! coef_smb_unit = coef passage m glace/an (1/910 ou 1/918) ' 98 write(num_rep_42,428)'! temp_annual_file = Temp moy annuelle (°C) ' 99 write(num_rep_42,428)'!________________________________________________________________' 100 101 ! smb : surface mass balance 102 smb_file = trim(dirnameinp)//trim(smb_file) 103 104 call Read_Ncdf_var('z',smb_file,tab) 105 106 ! call lect_input(3,'smb',1,bm,smb_file,trim(dirnameinp)//trim(runname)//'.nc') 107 108 bm(:,:) = tab(:,:) * coef_smb_unit 109 110 where ((H(:,:).lt.1.).and.(Bsoc(:,:).gt.0.)) 111 bm(:,:) = bm(:,:) - 5. ! pour faire un masque a l'exterieur du Groenland actuel 112 end where 113 114 acc(:,:) = 0. 115 abl(:,:) = 0. 116 117 where (bm(:,:).gt.0.) 118 acc(:,:) = bm(:,:) ! accumulation quand positif 119 elsewhere 120 abl(:,:) = - bm(:,:) ! ablation quand negatif 121 end where 122 123 124 ! surface temperature Tann 125 126 temp_annual_file = trim(dirnameinp)//trim(temp_annual_file) 127 128 call Read_Ncdf_var('z',temp_annual_file,tab) 129 Tann(:,:) = tab(:,:) 130 ! call lect_input(3,'Tann',1,Tann,temp_annual_file,trim(dirnameinp)//trim(runname)//'.nc') 131 132 ta0(:,:) = Tann(:,:) 133 Tjuly(:,:) = Tann(:,:) 134 135 136 137 !lecture namelist 138 139 namelist/clim_snap/nb_snap,time_depart_snaps,ecart_snap,file_smb_snap,massb 140 141 rewind(num_param) ! pour revenir au debut du fichier param_list.dat 142 read(num_param,clim_snap) 84 143 85 144 ! formats pour les ecritures dans 42 86 428 format(A) 87 88 rewind(num_param) ! pour revenir au debut du fichier param_list.dat 89 read(num_param,clim_snap) 90 91 write(num_rep_42,428)'!___________________________________________________________' 92 write(num_rep_42,428)'! module climat_Grice2sea_years_mod ' 93 write(num_rep_42,clim_snap) 94 write(num_rep_42,428)'! nb_snap = nombre de snapshots ' 95 write(num_rep_42,428)'! time_depart_snaps = debut du forçage ' 96 write(num_rep_42,428)'! ecart_snap = ecart entre les snapshots ' 97 write(num_rep_42,428)'! file_smb_snap = nom du fichier ' 98 write(num_rep_42,428)'!___________________________________________________________' 145 rewind(num_param) ! pour revenir au debut du fichier param_list.dat 146 read(num_param,clim_snap) 147 148 write(num_rep_42,428)'!________________________________________________________________' 149 write(num_rep_42,428)'! module climat_Grice2sea_years_mod ' 150 write(num_rep_42,clim_snap) 151 write(num_rep_42,428)'! nb_snap = nombre de snapshots ' 152 write(num_rep_42,428)'! time_depart_snaps = debut du forçage ' 153 write(num_rep_42,428)'! ecart_snap = ecart entre les snapshots ' 154 write(num_rep_42,428)'! file_smb_snap = fichier serie temp anomalie SMB de GCM ' 155 write(num_rep_42,428)'! massb = 0:fixe, 1:interp snapshots ' 156 write(num_rep_42,428)'!________________________________________________________________' 99 157 100 158 … … 166 224 167 225 ! ecriture de verification 168 file_smb_snap = 'test_sortie_smb.nc'169 file_smb_snap = trim(dirnameout)//trim(file_smb_snap)226 !file_smb_snap = 'test_sortie_smb.nc' 227 !file_smb_snap = trim(dirnameout)//trim(file_smb_snap) 170 228 171 229 !ncidloc = 501 172 230 173 call lect_netcdf_type174 write(6,*) 'ncdf_type'175 176 if (ncdf_type.eq.32) then177 status = nf90_create(TRIM(file_smb_snap),NF90_WRITE,ncidloc) ! ouverture du fichier178 else if (ncdf_type.eq.64) then179 status = nf90_create(trim(file_smb_snap),and(nf90_write,nf90_64bit_offset),ncidloc) ! r2d2180 end if181 182 status = nf90_close(ncidloc) ! fermeture183 184 call write_ncdf_dim('x',trim(file_smb_snap),nx) ! dimensions des tableaux185 call write_ncdf_dim('y',trim(file_smb_snap),ny)186 call write_ncdf_dim('time',trim(file_smb_snap),nb_snap)187 188 Tab3D(:,:,:) = smb_snap (:,:,:)189 dimtestname(1) = 'x'190 dimtestname(2) = 'y'191 dimtestname(3) = 'time'192 193 call write_ncdf_var(trim('smb'),dimtestname,trim(file_smb_snap),tab3D,'double')231 !call lect_netcdf_type 232 !write(6,*) 'ncdf_type' 233 234 !if (ncdf_type.eq.32) then 235 ! status = nf90_create(TRIM(file_smb_snap),NF90_WRITE,ncidloc) ! ouverture du fichier 236 !else if (ncdf_type.eq.64) then 237 ! status = nf90_create(trim(file_smb_snap),and(nf90_write,nf90_64bit_offset),ncidloc) ! r2d2 238 !end if 239 240 ! status = nf90_close(ncidloc) ! fermeture 241 242 ! call write_ncdf_dim('x',trim(file_smb_snap),nx) ! dimensions des tableaux 243 ! call write_ncdf_dim('y',trim(file_smb_snap),ny) 244 ! call write_ncdf_dim('time',trim(file_smb_snap),nb_snap) 245 246 !Tab3D(:,:,:) = smb_snap (:,:,:) 247 !dimtestname(1) = 'x' 248 !dimtestname(2) = 'y' 249 !dimtestname(3) = 'time' 250 251 !call write_ncdf_var(trim('smb'),dimtestname,trim(file_smb_snap),tab3D,'double') 194 252 195 253 end subroutine input_clim … … 201 259 subroutine init_forclim 202 260 203 204 namelist/lapse_rates/T_lapse_rate205 206 rewind(num_param) ! pour revenir au debut du fichier param_list.dat207 read(num_param,lapse_rates)261 implicit none 262 namelist/lapse_rates/T_lapse_rate 263 264 rewind(num_param) ! pour revenir au debut du fichier param_list.dat 265 read(num_param,lapse_rates) 208 266 209 267 ! formats pour les ecritures dans 42 210 268 428 format(A) 211 269 212 rewind(num_param) ! pour revenir au debut du fichier param_list.dat 213 read(num_param,lapse_rates) 214 215 write(num_rep_42,428)'!___________________________________________________________' 216 write(num_rep_42,428)'! module climat_Grice2sea_mod ' 217 write(num_rep_42,lapse_rates) 218 write(num_rep_42,428)'!___________________________________________________________' 270 rewind(num_param) ! pour revenir au debut du fichier param_list.dat 271 read(num_param,lapse_rates) 272 273 write(num_rep_42,428)'!________________________________________________________________' 274 write(num_rep_42,428)'! module climat_Grice2sea_years_mod ' 275 write(num_rep_42,lapse_rates) 276 write(num_rep_42,428)'!T_lapse_rate = lapse rate temp annuelle ' 277 write(num_rep_42,428)'!________________________________________________________________' 219 278 220 279 ! appelle la routine de lecture des smb annuels 221 222 call input_clim 223 call init_grad_smb 224 225 return 280 call input_clim 281 call init_grad_smb 282 283 return 226 284 end subroutine init_forclim 227 285 … … 237 295 subroutine forclim ! au temps considere (time) 238 296 239 use module3d_phy240 297 implicit none 241 298 242 ! call massb_Ice2sea_fixe 243 call massb_Ice2sea_RCM 244 299 select case (massb) 300 case(0) 301 ! surface temperature et accumulation massb_Ice2sea_fixe 302 ! smb fixe et Tann avec lapse rate 303 Tann (:,:) = Ta0 (:,:) + T_lapse_rate * (S(:,:)-S0(:,:)) 304 Ts(:,:) = Tann(:,:) 305 306 case(1) 307 call massb_Ice2sea_RCM 308 case default 309 print *, 'Numero de massb invalide dans climat_Grice2sea_years_mod' 310 stop 311 end select 245 312 end subroutine forclim 246 313 247 314 248 249 315 subroutine massb_Ice2sea_RCM ! calcule le mass balance 316 317 implicit none 318 integer :: k_snap ! pour calculer les indices de temps 319 real :: time_bis ! pour repliquer les dernieres annees 320 integer :: k 321 322 ! calcul smb a partir fichier snapshots massb_Ice2sea_RCM 323 ! Calcule le mass balance d'apres un fichier de snapshots 324 ! avec la temperature parametree 325 ! surface temperature et accumulation 326 Tann (:,:) = Ta0 (:,:) + T_lapse_rate * (S(:,:)-S0(:,:)) 327 Ts(:,:) = Tann(:,:) 328 ! calcule bm_time par interpolation entre deux snapshots 329 ! avant prend la valeur de reference 330 ! apres prend la derniere valeur 331 ! en general les snapshots vont de 2000 a 2200 332 if(time.lt.time_snap(1)) then ! time avant le forcage 333 bm_time(:,:) = bm_0(:,:) 334 k_snap = 1 335 S_ref(:,:) = S(:,:) ! du coup sera la surface de reference avant le forcage 336 icum = 0 337 i_moy = 0 338 bm_ref_t(:,:)= bm_0(:,:) ! bilan de masse de reference 339 time_prec = time 340 else if (time.ge.time_snap(nb_snap)) then ! time apres le forcage 341 k_snap = nb_snap 342 bm_time(:,:) = smb_snap (:,:,k_snap) 343 if (abs(time-time_prec-1.).lt.dt) then ! 344 time_prec = time_prec + 1 345 icum = 1 346 else 347 icum = 0 348 endif 349 else ! cas general 350 do k = 1 , nb_snap-1 351 if((time.ge.time_snap(k)).and.(time.lt.time_snap(k+1))) then ! entre k et k+1 352 bm_time(:,:) = smb_snap(:,:,k)+(smb_snap(:,:,k+1)-smb_snap(:,:,k)) * & 353 (time-time_snap(k))/(time_snap(k+1)-time_snap(k)) 354 ! exactement sur le snapshot et avec un ecart 1 an par rapport au precedent stockage 355 ! write(6,*) 'time,tests',k,time,time-time_snap(k),time-time_prec-1. 356 if ((abs(time-time_snap(k)).le.dt).and.(abs(time-time_prec-1.).lt.dt)) then 357 k_snap = k 358 icum = 1 359 time_prec = time_snap(k) ! time_prec est le temps du precedent 360 ! snapshot garde 361 else 362 icum = 0 363 endif 364 exit 365 endif 366 end do 367 endif 368 call grad_smb !-----------------------------> A faire 369 370 ! ajuste bm en fonction du temps et du gradient 371 bm(:,:) = bm_time(:,:) + grad_bm(:,:) *(S(:,:) - S_ref(:,:)) 372 373 write(6,897) time, time_prec, icum, i_moy 374 897 format('test temps smb ',2(f0.3,1x),2(i0,1x)) 375 376 ! garde les 10 dernieres annees et calcule la moyenne 377 if (icum.eq.1) then ! stockage dans le tableau bm_ref_10 378 do k = 9,1,-1 379 bm_ref_10(:,:,k+1) = bm_ref_10(:,:,k) ! on decale tous les elements 380 end do 381 bm_ref_10(:,:,k+1) = bm(:,:) ! le plus recent est en position 1 382 i_moy = i_moy +1 ! compte combien il y en a pour la moyenne 383 i_moy = min(i_moy,10) 384 bm_ref_t(:,:) = 0. 385 do k = 1,i_moy 386 bm_ref_t(:,:) = bm_ref_t(:,:) + bm_ref_10(:,:,k) 387 end do 388 bm_ref_t(:,:) = bm_ref_t(:,:)/i_moy 389 write(6,898) time, time_prec, icum, i_moy 390 898 format('cumul pour gradient ',2(f0.3,1x),2(i0,1x)) 391 end if 392 end subroutine massb_Ice2sea_RCM 393 394 !------------------------------------------------------------------------------ 395 !> initialise le calcul du gradient vertical de smb 396 subroutine init_grad_smb 397 398 use module3D_phy 399 implicit none 400 401 character(len=120) :: file_grad_smb ! nom du fichier gradients de Tamsin 402 character(len=40) :: fin_ligne ! fin de la ligne 403 real :: grad 404 405 namelist/grad_smb/file_grad_smb 406 407 ! Dans lequel sont : 408 ! grad_N_smb_pos,grad_N_smb_neg,grad_S_smb_pos,grad_S_smb_neg,lim_lat 409 410 rewind(num_param) ! pour revenir au debut du fichier param_list.dat 411 read(num_param,grad_smb) 412 413 414 ! formats pour les ecritures dans 42 415 428 format(A) 416 417 rewind(num_param) ! pour revenir au debut du fichier param_list.dat 418 read(num_param,grad_smb) 419 420 write(num_rep_42,428)'!________________________________________________________________' 421 write(num_rep_42,428)'! gradient smb climat_Grice2sea_years_mod ' 422 write(num_rep_42,grad_smb) 423 write(num_rep_42,428)'!grad_smb = fichier gradient SMB ' 424 write(num_rep_42,428)'!________________________________________________________________' 425 426 427 file_grad_smb=trim(dirnameinp)//'SMB-H-Feedback/gradients_18_07_2012/'//trim(file_grad_smb) 428 open(622,file=file_grad_smb) 429 do i=1,4 430 read(622,'(f9.4,A)') grad,fin_ligne 431 write(6,*) grad,fin_ligne 432 433 if (index(fin_ligne, "North").ne.0) then ! North est dans la ligne 434 if (index(fin_ligne, "<").ne.0) then ! smb negatif 435 grad_N_smb_neg = grad 436 else if (index(fin_ligne, ">=").ne.0) then ! smb positif 437 grad_N_smb_pos = grad 438 else 439 write(6,*) 'probleme lecture North fichier smb', file_grad_smb 440 STOP 441 end if 442 443 else if (index(fin_ligne, "South").ne.0) then !South est dans la ligne 444 if (index(fin_ligne, "<").ne.0) then ! smb negatif 445 grad_S_smb_neg = grad 446 else if (index(fin_ligne, ">=").ne.0) then ! smb positif 447 grad_S_smb_pos = grad 448 else 449 write(6,*) 'probleme lecture South fichier smb ', file_grad_smb 450 STOP 451 end if 452 453 else 454 write(6,*) 'probleme lecture ni North ni South fichier smb ', file_grad_smb 455 write(6,*) 'fin_ligne',fin_ligne,' index North', index(fin_ligne, "North"),' index South', index(fin_ligne, "South") 456 STOP 457 end if 458 end do 459 460 write(6,*) 'coefficients lus ' 461 write(6,*) 'grad_N_smb_pos', grad_N_smb_pos 462 write(6,*) 'grad_N_smb_neg', grad_N_smb_neg 463 write(6,*) 'grad_S_smb_pos', grad_S_smb_pos 464 write(6,*) 'grad_S_smb_neg', grad_S_smb_neg 465 466 grad_N_smb_pos = coef_smb_unit * grad_N_smb_pos 467 grad_N_smb_neg = coef_smb_unit * grad_N_smb_neg 468 grad_S_smb_pos = coef_smb_unit * grad_S_smb_pos 469 grad_S_smb_neg = coef_smb_unit * grad_S_smb_neg 470 471 write(6,*) 'coefficients *coef_smb_unit ' 472 write(6,*) 'grad_N_smb_pos', grad_N_smb_pos 473 write(6,*) 'grad_N_smb_neg', grad_N_smb_neg 474 write(6,*) 'grad_S_smb_pos', grad_S_smb_pos 475 write(6,*) 'grad_S_smb_neg', grad_S_smb_neg 476 477 478 end subroutine init_grad_smb 479 480 481 !------------------------------------------------------------------------------ 482 !> Calcule le gradient vertical de smb 483 484 subroutine grad_smb 485 486 use module3D_phy 487 implicit none 488 489 do j = 1,ny 490 do i = 1,nx 491 if (Ylat(i,j).gt.77.) then ! region nord 492 if (bm_ref_t(i,j).lt. 0.) then ! smb negatif 493 grad_bm (i,j) = grad_N_smb_neg 494 495 else if (bm_ref_t(i,j).ge. 0.) then ! smb positif 496 grad_bm (i,j) = grad_N_smb_pos 497 498 end if 499 500 else if (Ylat(i,j).le.77.) then ! region sud 501 if (bm_ref_t(i,j).lt. 0.) then ! smb negatif 502 grad_bm (i,j) = grad_S_smb_neg 503 504 else if (bm_ref_t(i,j).ge. 0.) then ! smb positif 505 grad_bm (i,j) = grad_S_smb_pos 506 507 end if 508 end if 509 end do 510 end do 511 512 end subroutine grad_smb 250 513 251 514 end module climat_Grice2sea_years_mod -
trunk/SOURCES/GrIce2sea_files/module_choix_GrIce2sea.f90
r4 r11 49 49 ! use lect_clim_acc_T_ant_gen 50 50 51 use lect_climref_Ice2sea ! pour les experiences avec le climat de reference51 ! use lect_climref_Ice2sea ! pour les experiences avec le climat de reference 52 52 53 53 ! use lect_clim_act_nord40 ! pour l'hemisphere nord et l'eurasie … … 63 63 64 64 use climat_Grice2sea_years_mod 65 66 ! calcul de l'ablation 67 use no_ablation ! pas de calcul de l'ablation => lecture fichier SMB 65 68 66 69 ! pas de lacs proglaciaires -
trunk/SOURCES/GrIce2sea_files/output_Grice2sea_mod.f90
r4 r11 125 125 126 126 filout = runname//'_vol_regions.dat' 127 filout = TRIM(DIRNAMEOUT)// 'time-series/'//TRIM(filout)127 filout = TRIM(DIRNAMEOUT)//TRIM(filout) 128 128 open(nvol,file=filout) 129 129 130 130 filout = runname// '_volbuoy_regions.dat' 131 filout = TRIM(DIRNAMEOUT)// 'time-series/'//TRIM(filout)131 filout = TRIM(DIRNAMEOUT)//TRIM(filout) 132 132 open(nvolbuoy,file=filout) 133 133 134 134 filout = runname//'_meanhdot_regions.dat' 135 filout = TRIM(DIRNAMEOUT)// 'time-series/'//TRIM(filout)135 filout = TRIM(DIRNAMEOUT)//TRIM(filout) 136 136 open(nhdot,file=filout) 137 137 138 138 filout = runname//'_sigmahdot_regions.dat' 139 filout = TRIM(DIRNAMEOUT)// 'time-series/'//TRIM(filout)139 filout = TRIM(DIRNAMEOUT)//TRIM(filout) 140 140 open(nsigma_hdot,file=filout) 141 141 142 142 filout = runname//'_nbpoints_regions.dat' 143 filout = TRIM(DIRNAMEOUT)// 'time-series/'//TRIM(filout)143 filout = TRIM(DIRNAMEOUT)//TRIM(filout) 144 144 open(npoints,file=filout) 145 145 146 146 filout = runname//'_smb_regions.dat' 147 filout = TRIM(DIRNAMEOUT)// 'time-series/'//TRIM(filout)147 filout = TRIM(DIRNAMEOUT)//TRIM(filout) 148 148 open(nsmb,file=filout) 149 149 -
trunk/SOURCES/GrIce2sea_files/paradim-GrIce2sea-cut_Tamsin.f90
r4 r11 17 17 ! character 18 18 character(len=7), parameter :: geoplace='GI2S_5T' 19 character(len=53), parameter :: dirnameinp='../ INPUT/GrIce2sea-5km-cut-Tamsin/' !< input directory20 character(len=17), parameter :: dirforcage='../ INPUT/Forcage/' !< input directory19 character(len=53), parameter :: dirnameinp='../../INPUT/GrIce2sea-5km-cut-Tamsin/' !< input directory 20 character(len=17), parameter :: dirforcage='../../INPUT/Forcage/' !< input directory 21 21 22 22 ! dimensionnement grilles
Note: See TracChangeset
for help on using the changeset viewer.