Changeset 486
- Timestamp:
- 02/13/24 18:13:56 (5 months ago)
- Location:
- branches/GRISLIv3
- Files:
-
- 1 added
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/GRISLIv3/SOURCES/Makefile.grisli.inc
r478 r486 594 594 $(mod_communs) \ 595 595 $(mod_clim_tof) \ 596 $(mod_ no_tracers) \596 $(mod_tracers) \ 597 597 $(mod_ell) $(Liste_Ant40) \ 598 598 $(diagnoshelf) \ … … 606 606 $(mod_communs) \ 607 607 $(mod_clim_tof) \ 608 $(mod_ no_tracers) \608 $(mod_tracers) \ 609 609 $(mod_ell) $(Liste_Ant40) \ 610 610 $(diagnoshelf) \ -
branches/GRISLIv3/SOURCES/celltest_tracer.f90
r481 r486 20 20 21 21 integer :: kk ! indice vertical pour definition de E, mais on veut conserver la valeur de k 22 ! real,dimension(nz) :: E ! vertical coordinate in ice, scaled to H zeta23 24 E(1)=0.25 E(NZ)=1.26 do KK=1,NZ27 if ((KK.ne.1).and.(KK.ne.NZ)) E(KK)=(KK-1.)/(NZ-1.)28 end do29 30 22 31 23 if(v_x>0.0) then -
branches/GRISLIv3/SOURCES/interpolate_tracer.f90
r481 r486 4 4 use module3d_phy, only:e,H 5 5 use tracer_vars, only:tdepk,tdep,time_max_accu,accucumul,xdepk,ydepk,xdep,ydep 6 !cdc use climat_perturb_mois_mod ! on en a besoin, notamment pour NFT7 6 8 7 implicit none … … 16 15 17 16 integer :: kk ! indice vertical pour definition de E, mais on veut conserver la valeur de k 18 ! real,dimension(nz) :: E ! vertical coordinate in ice, scaled to H zeta 19 17 20 18 !! Note that input (im,jm,km) refer to points on (ij,jj) grid 21 19 !! whereas CellTest search was performed on (i,j) grid … … 73 71 al = abs(tdepk(kc,ic,jc) - a_tmp) 74 72 ac = abs(tdepk(kc,ic,jc) - (a_xy + fzz*fprime + fzz**2*fsec/2.)) 75 if (ac<(1.3*al)) then 73 if (ac<(1.3*al)) then 76 74 tdep(kc,ic,jc) = a_xy + fzz*fprime + fzz**2*fsec/2. 77 75 else … … 83 81 else 84 82 85 index1 = floor(-a_xy/100.) 83 index1 = floor(-a_xy/100.) ! gives the youngest: ind1+1 < tdepk < ind1 86 84 fra1 = real((-a_xy/100.) - index1) 87 85 accucumul1 = real( -fra1*(accucumul(index1)-accucumul(index1+1)) + accucumul(index1) ) … … 127 125 L4: do 128 126 index0 = index0 + 1 129 if ((index0>=NFT-1).or.(accucumul(index0) < f_k )) exit L4 127 if ((index0>=NFT-1).or.(accucumul(index0) < f_k )) exit L4 130 128 ! index < ind(t) < index-1, t(i+1) < t < t(i) 131 129 end do L4 … … 133 131 134 132 !========================================= 135 else 133 else ! fz> 0.5, probably downwards 136 134 137 135 if (km<nz-1) then … … 164 162 165 163 if ((index0==1).or.(index0==NFT-1)) then 166 164 fzz=2. 167 165 else 168 166 fzz = real( (accucumul(index0) - f_k)/ (accucumul(index0)-accucumul(index0+1)) ) -
branches/GRISLIv3/SOURCES/tracer_mod.f90
r465 r486 26 26 27 27 module tracer_mod 28 29 use module3d_phy, only: e,time,dtt,num_param,num_rep_42,acc,H,num_forc,&30 ux,uy,uzr,bmelt,S,flot,bm31 use geography, only: nx,ny,nz,dx,dy,dirforcage32 use runparam, only: itracebug,num_tracebug,xmin,ymin,tbegin,tend33 ! module de declaration de variables pour les traceurs34 use tracer_vars, only:file_tr_dat,file_tr_out,file_tr_dep,file_tr_dat,coeft_tra,rappact_tra,nij,&35 xgrid,ygrid,xdepk,ydepk,tdepk,nft_tra,tdate_tra,tpert_tra,accucumul,type_accum,time_max_accu,&36 uxsave,uysave,uzrsave,xdep,ydep,tdep,freezeon,xdep_out,ydep_out,tdep_out37 !cdc use climat_perturb_mois_mod ! on en a besoin, notamment pour NFT38 ! afq, new version of tracer, does not require climat_perturb39 28 40 29 implicit none 41 42 ! variables de travail43 integer :: i_ij, i_jj, ip, jp, im, jm, km ! indice dans les matrices des traceurs44 real :: v_xij, v_yij, v_zij ! vitesses 'cumulees'45 30 46 31 ! pour chaque point de grille on recherche ou etait la particule au pas de temps precedent … … 67 52 subroutine init_tracer 68 53 54 use module3d_phy, only: e,time,dtt,num_param,num_rep_42,acc,H,num_forc 55 use geography, only: nx,ny,nz,dx,dy,dirforcage 56 use runparam, only: itracebug,num_tracebug,xmin,ymin,tbegin,tend 57 use tracer_vars, only:file_tr_dat,coeft_tra,rappact_tra,nij,& 58 xgrid,ygrid,xdepk,ydepk,tdepk,nft_tra,tdate_tra,tpert_tra,accucumul,type_accum,time_max_accu,& 59 uxsave,uysave,uzrsave,xdep,ydep,tdep,freezeon 60 61 implicit none 62 69 63 ! formats pour les ecritures dans 42 70 64 428 format(A) 65 66 ! variables de travail 67 integer :: i_ij, i_jj 71 68 72 69 real :: lambdab ! fusion basale 'artificielle' pour age des couches … … 84 81 85 82 ! on lit les parametres par namelist dorenavant 86 namelist/tracer/file_tr_dat, file_tr_out,file_tr_dep,lambdab,agemax,coefT_tra,rappact_tra,filforc,pert_type83 namelist/tracer/file_tr_dat,lambdab,agemax,coefT_tra,rappact_tra,filforc,pert_type 87 84 88 85 … … 109 106 print* 110 107 print*, 'tracer .dat file: ', file_tr_dat 111 print*, 'tracer .out file: ', file_tr_out112 print*, 'tracer dep. file: ', file_tr_dep113 108 114 109 … … 116 111 write(num_rep_42,428) '&tracer ! module tracer_mod' 117 112 write(num_rep_42,'(A,A)') 'tracer .dat file : ', file_tr_dat 118 write(num_rep_42,'(A,A)') 'tracer .out file : ', file_tr_out119 write(num_rep_42,'(A,A)') 'tracer dep. file : ', file_tr_dep120 113 write(num_rep_42,'(A,A)') 'lambdab : ', lambdab 121 114 write(num_rep_42,'(A,A)') 'agemax : ', agemax … … 302 295 subroutine tracer 303 296 297 use geography, only: nx,ny,nz 298 use module3D_phy, only: E,time,dtt,ux,uy,uzr,h,s,flot,bmelt,bm 299 use runparam, only: itracebug,num_tracebug,tend 300 use tracer_vars, only: xgrid,ygrid,xdepk,ydepk,tdepk,xdep,ydep,tdep,xdep_out,ydep_out,tdep_out, & 301 uxsave,uysave,uzrsave,freezeon,nft_tra 302 303 304 implicit none 305 306 ! variables de travail 307 integer :: i_ij, i_jj , ip, jp , im, jm, km ! indice dans les matrices des traceurs 308 real :: v_xij, v_yij, v_zij ! vitesses 'cumulees' 309 310 real,parameter :: petit = 0.1 ! afq fev2024 - a smaller number breaks the test which is weird... 311 304 312 integer :: i,j,k 305 real,dimension(nz) :: E ! vertical coordinate in ice, scaled to H zeta306 307 E(1)=0.308 E(NZ)=1.309 do K=1,NZ310 if ((K.ne.1).and.(K.ne.NZ)) E(K)=(K-1.)/(NZ-1.)311 end do312 313 313 314 If (Itracebug.Eq.1) Write(num_tracebug,*)' Entree Dans Routine tracer at time=',Time … … 353 354 ! tdep(:,1,i_jj) = time_ 354 355 ! tdep(:,nx-2,i_jj) = time_ 355 tdep(:,1,i_jj) = time356 tdep(:,nx-2,i_jj) = time356 tdep(:,1,i_jj) = real(time) 357 tdep(:,nx-2,i_jj) = real(time) 357 358 end do 358 359 !=========== north and south boundaries … … 365 366 ! tdep(:,i_ij,1) = time_ 366 367 ! tdep(:,i_ij,ny-2) = time_ 367 tdep(:,i_ij,1) = time368 tdep(:,i_ij,ny-2) = time368 tdep(:,i_ij,1) = real(time) 369 tdep(:,i_ij,ny-2) = real(time) 369 370 end do 370 371 … … 380 381 xdep(:,i_ij,i_jj) = xgrid(i) 381 382 ydep(:,i_ij,i_jj) = ygrid(j) 382 tdep(:,i_ij,i_jj) = time383 tdep(:,i_ij,i_jj) = real(time) 383 384 cycle 384 385 end if … … 411 412 ! *1.001 proven to be dumb 412 413 ! if((tdep(k,i_ij,i_jj)<=time_ - 1500000.) .or. (tdep(k,i_ij,i_jj)>=tend+1.0)) then 413 if((tdep(k,i_ij,i_jj)<= time- 1500000.) .or. (tdep(k,i_ij,i_jj)>=tend+1.0)) then414 if((tdep(k,i_ij,i_jj)<=real(time) - 1500000.) .or. (tdep(k,i_ij,i_jj)>=tend+1.0)) then 414 415 print *,"tdep(",k,",",i_ij,",",i_jj,") range error at time=",time_tra 415 416 print *,"tdep(k,i_ij,i_jj) =",tdep(k,i_ij,i_jj), v_xij, v_yij, v_zij … … 420 421 end if 421 422 422 else if (k==1 .and. bm(i,j)>0.0) then 423 else if (k==1 .and. bm(i,j)>0.0) then !! surface mass balance 423 424 xdep(k,i_ij,i_jj) = xgrid(i) 424 425 ydep(k,i_ij,i_jj) = ygrid(j) 425 tdep(k,i_ij,i_jj) = time426 else if ( e_tra < e(1) ) then 427 xdep(k,i_ij,i_jj) = xgrid(i) 426 tdep(k,i_ij,i_jj) = real(time) 427 else if ( e_tra < e(1) ) then !! rapid thickening by 428 xdep(k,i_ij,i_jj) = xgrid(i) !! surface accumulation 428 429 ydep(k,i_ij,i_jj) = ygrid(j) 429 tdep(k,i_ij,i_jj) = time430 tdep(k,i_ij,i_jj) = real(time) 430 431 else 431 432 call celltest(time_tra,i,j,k,v_xij, v_yij, v_zij, x_tra, y_tra, e_tra, & 432 433 433 im,jm,km,fx,fy,fz) 434 !! convert seach results from (i,j) grid to (i_ij,i_jj) tracer grid 434 435 !print*,'i,j,k avt interp',i,j,k 435 436 436 437 call interpolate(i_ij, i_jj, k, im-1, jm-1, km, fx,fy,fz, e_tra, nft_tra) 437 438 438 if((tdep(k,i_ij,i_jj)<= time - 1500000.) .or. (tdep(k,i_ij,i_jj)> time)) then439 if((tdep(k,i_ij,i_jj)<=real(time) - 1500000.) .or. (tdep(k,i_ij,i_jj)> real(time)+petit)) then 439 440 print *,"tdep(",k,",",i_ij,",",i_jj,") range error at time=",time_tra 440 441 print *,"tdep(k,i_ij,i_jj) =",tdep(k,i_ij,i_jj), v_xij, v_yij, v_zij 441 442 443 444 442 print *, bmelt(i,j), s(i,j), h(i,j), e_tra, tdepk(k,i_ij,i_jj), tdepk(k,i,j) 443 print *, flot(im,jm), flot(im+1,jm), flot(im+1,jm+1), flot(im,jm+1) 444 if (k>1) tdep(k,i_ij,i_jj) = tdepk(k-1,i_ij,i_jj) - real(h(i,j)*(k-1)**2/30.) 445 print *, tdep(k,i_ij,i_jj) 445 446 end if 446 447 … … 460 461 end if !========== if deltracer 461 462 462 if (abs( time-tend)<19) then463 if (abs(real(time)-tend)<19) then 463 464 open(505,file="freezeonmap.out",status="replace") 464 465 print*,"save freezeon file" … … 516 517 517 518 518 519 520 521 522 523 524 525 526 527 528 529 530 !========================================================================531 !========================================================================532 subroutine get_date_time(yr, mon, iday, hr, minu, sec)533 534 implicit none535 integer, intent(out) :: yr, mon, iday, hr, minu, sec536 537 integer, dimension(8) :: values538 character :: date*8, chtime*10, zone*5539 540 call date_and_time(date, chtime, zone, values)541 542 yr = values(1)543 mon = values(2)544 iday = values(3)545 hr = values(5)546 minu = values(6)547 sec = values(7)548 549 end subroutine get_date_time550 551 519 !======================================================================== 552 520 subroutine read_tr_dat -
branches/GRISLIv3/SOURCES/tracer_vars_mod.f90
r465 r486 17 17 18 18 integer, parameter :: unit_tr_dat=572 19 integer, parameter :: unit_tr_out=57320 integer, parameter :: unit_tr_dep=57421 19 22 20 integer, parameter :: maxspectimes=31 … … 68 66 real , dimension(nz) :: lnzeta 69 67 70 character (LEN=60) :: file_tr_dat , file_tr_out, file_tr_dep68 character (LEN=60) :: file_tr_dat 71 69 72 70 real , dimension(nx,ny,nz) :: uxsave
Note: See TracChangeset
for help on using the changeset viewer.