!> \file climat-forcage-mois_mod-0.2.f90 !! Module pour forcage avec champs mensuels !< !> \namespace climat_forcage_mois_mod !!Module pour forcage avec champs mensuels !! \author ... !! \date ... !!@note Ce qui a trait aux lacs proglaciaires passe dans un module separe. !! les tests sur geoplace sont enleves et sont remplaces par les !! lectures de fichers appropries. !! @note Used modules: !! @note - use module3D_phy !! @note - use printtable !< module climat_forcage_mois_mod ! forcage avec champs mensuels ! ce qui a trait aux lacs proglaciaires passe dans un module separe. ! les tests sur geoplace sont enleves et sont remplacés par les ! lectures de fichers appropries. USE module3D_phy USE printtable implicit none ! 1=decalaration variables !------------------------- integer :: nft !< NFT est le nombre de lignes a lire dans le fichier contenant le forcage climatique integer :: mo,ti,tj,la integer,parameter :: mois=12 integer,parameter :: NTR=1 !< nb of snapshot files : 1 pour stationnaire - ntr is now explicitely specified in the climat module integer :: itr !< index of snapshot real,dimension(:),allocatable :: TDATE !< time for climate forcing real,dimension(:),allocatable :: alphaT !< index temperature real,dimension(:),allocatable :: alphaP !< index precipitation real,dimension(:),allocatable :: SPERT !< sealevel forcing real ttr(ntr) !< la date des tranches (snapshots) (len=ntr) !real alphaTTR(ntr) ! Le alphaT de l'index glaciologiq. aux snapshots real,dimension(nx,ny,ntr) :: Ssnap !< altitude de surface dans le snapshot real,dimension(nx,ny,mois,ntr) :: Tm !< temperature mensuelle de chaque tranche real,dimension(nx,ny,mois,ntr) :: Pm !< precipitation mensuelle real,dimension(nx,ny,mois) :: Tm_time !< temperature mensuelle au temps time (non corrige altitude) real,dimension(nx,ny,mois) :: Pm_time !< precipitation mensuelle au temps time real,dimension(nx,ny,mois+1) :: Tm_surf !< surface temperature (after topo. correction) !< 13 mois pour modulo real,dimension(nx,ny,mois+1) :: Pm_surf !< surface precipitation (after topo. correction) real,dimension(nx,ny,mois) :: lapserate !< lapse rate character(len=100) :: filin !< nom temporaire character (len=100) :: file_temporel !< forcage temporel character (len=100) :: filtr_t(ntr), filtr_p(ntr),filtr_t1, filtr_p1 !snapshot file name (len=ntr) real :: T_surf_ref !< variable de travail real :: mincoefbmelt !< butoirs pour coefbmshelf real :: maxcoefbmelt contains ! 2=lecture des inputs !-------------------- !> SUBROUTINE: input_clim !! Routine qui permet d'initialiser les variables climatiques !> subroutine input_clim ! routine qui permet d'initialiser les variables climatiques ! fichiers snapshots namelist/snap_forcage_mois_1/filtr_t1,filtr_p1 ! ce bloc est a dupliquer pour chaque snapshot en changeant ! la numerotation. ntr snapshots ! forcage temporel !------------------ namelist/forc_temporel/file_temporel,mincoefbmelt,maxcoefbmelt ! variables locales !------------------- implicit none character(len=8) :: control !label to check clim. forc. file (filin) is usable integer :: l !In snapshot files:the first column is the mask, read but not used ! lecture par namelist !--------------------- ! formats pour les ecritures dans 42 428 format(A) rewind(num_param) ! pour revenir au debut du fichier param_list.dat read(num_param,snap_forcage_mois_1) filtr_t(1)=filtr_t1 filtr_p(1)=filtr_p1 write(num_rep_42,428)'!___________________________________________________________' write(num_rep_42,428) '&snap_forcage_mois_1 ! module climat_forcage_mois_mod' write(num_rep_42,'(A,A)') 'filtr_t1 =', filtr_t(1) write(num_rep_42,'(A,A)') 'filtr_p1 =', filtr_p(1) write(num_rep_42,*)'/' write(num_rep_42,428) '! fichiers temperature et precip : 12 mois' write(num_rep_42,428) '! faire un bloc namelist par snapshot' write(num_rep_42,*) call lect_lapserate_months ! lit les lasperate mensuels ! pour une version spatialisee ecrire une autre routine ! lecture des fichiers snapshots pour tout geoplace ! ------------------------------------------------- write(6,*) 'fichiers snapshots' do k=1,ntr !temperature filin=trim(dirnameinp)//trim(filtr_t(k)) write(6,*) filin open(20,file=filin) do j=1,ny do i=1,nx read(20,*) ti, tj, (Tm(i,j,mo,k),mo=1,12) end do end do close(20) !precipitation filin=trim(dirnameinp)//trim(filtr_p(k)) write(6,*) filin open(20,file=filin) do j=1,ny do i=1,nx read(20,*) ti, tj, (Pm(i,j,mo,k),mo=1,12) end do end do close(20) end do ! Correction d'altitude pour que la temperature des snapshots soit celle ! sur l'altitude de reference S0 ! ATTENTION. Pour l'instant Ssnap(:,:,itr)= S topo initiale ! ensuite il faudra lire Ssnap dans le fichier forcage ! corrections liees a la difference d'altitude ! Les champs sont remis a l'altitude de reference S0 (souvent c'est l'actuel) do itr=1,ntr ! boucle sur les snapshot do j=1,ny do i=1,nx do mo=1,mois T_surf_ref = - lapserate(i,j,mo) * (Ssnap(i,j,itr)-S0(i,j)) & ! T_surf_ref T a la surface de reference S0 + Tm(i,j,mo,itr) Pm(i,j,mo,itr)= Pm(i,j,mo,itr)*exp(0.05*(T_surf_ref-Tm(i,j,mo,itr))) Tm(i,j,mo,itr)=T_surf_ref end do end do end do ! fichiers donnant l'evolution temporelle ! ---------------------------- ------------ rewind(num_param) ! pour revenir au debut du fichier param_list.dat read(num_param,forc_temporel) write(num_rep_42,428)'!___________________________________________________________' write(num_rep_42,428) '&forc_temporel ! module climat_forcage_mois_mod' write(num_rep_42,'(A,A)') 'file_temporel =', file_temporel write(num_rep_42,*) 'mincoefbmelt =', mincoefbmelt write(num_rep_42,*) 'maxcoefbmelt =', maxcoefbmelt write(num_rep_42,*)'/' write(num_rep_42,428) '!fichier forcage temporel pour snapshot' write(num_rep_42,*) file_temporel=trim(dirforcage)//trim(file_temporel) open(20,file=file_temporel,status='old') read(20,*) control,nft print*,'control',control,nft ! Determination of file size (line nb), allocation of perturbation array if (control.ne.'nb_lines') then write(6,*) file_temporel,'indiquer le nb de ligne en debut de fichier:' write(6,*) 'le nb de lignes et le label de control nb_lines' stop endif if (.not.allocated(tdate)) then allocate(TDATE(nft),stat=err) if (err/=0) then print *,"Erreur à l'allocation du tableau TDATE",err stop 4 end if end if if (.not.allocated(alphat)) then allocate(alphaT(nft),stat=err) if (err/=0) then print *,"Erreur à l'allocation du tableau alphaT",err stop 4 end if end if if (.not.allocated(alphap)) then allocate(alphap(nft),stat=err) if (err/=0) then print *,"Erreur à l'allocation du tableau alphap",err stop 4 end if end if if (.not.allocated(spert)) THEN allocate(spert(nft),stat=err) if (err/=0) then print *,"Erreur à l'allocation du tableau SPERT",err stop 4 end if end if do I=1,nft read(20,*) TDATE(I),alphaT(I),SPERT(I) ! forc inso end do end do end subroutine input_clim !-------------------------------------------------------------------------------- !> SUBROUTINE: input_climat_ref !! Routine pour définir le climat de reference !! @note Quand on traite en absolu, pas besoin du climat de reference !> subroutine input_climat_ref ! quand on traite en absolu, pas besoin du climat de reference end subroutine input_climat_ref !> SUBROUTINE: init_forclim !! Routine d'initialisation du clacul du climat au cours du temps !> SUBROUTINE init_forclim alphaP(:)=1.0 end subroutine init_forclim !--------------------------------------------------------------------- !> SUBROUTINE: forclim !! Routine calcul le forcage climatique au cours du temps !> subroutine forclim implicit none real COEFT,COEFP ! integer l !< dumm index for loops on snapshots files l=ITR,NTR-1 integer itr !< index of the current snapshot file (change with time) integer ii,jj ! debut boucle sur itr ? !========================= ! Pour les runs avec plusieurs snapshots, il faudra utiliser alpha_t et alpha_p ! pour definir Tm_time comme une combinaison lineaire de 2 snapshots ! ex: Tm_time = alpha_T * Tm(:,:,itr) + (1-alpha_T) * Tm(:,:,itr+1) ! dans cet exemple alpha=0 pour le present ! run mensuels stationnaires pour le snapshot itr do mo=1,mois Tm_time(:,:,mo)=Tm(:,:,mo,itr) Pm_time(:,:,mo)=Pm(:,:,mo,itr) end do ! fin de la boucle sur les itr ! coefbmshelf coefficient pour la fusion basale sous les ice shelves coefbmshelf=max(coefbmshelf,mincoefbmelt) coefbmshelf=min(coefbmshelf,maxcoefbmelt) ! Correction d'altitude pour la temperature y compris sur les lacs ! Zs est l'altitude de la surface qu'elle soit mer, glace ou lac do j=1,ny do i=1,nx ZS(I,J)=max(slv(i,j),S(I,J)) do mo=1,mois Tm_surf(i,j,mo)= - lapserate(i,j,mo) * (Zs(i,j)-S0(i,j)) & ! correction d'altitude T + Tm_time(i,j,mo) Pm_surf(i,j,mo)= Pm_time(i,j,mo)*exp(0.05*(Tm_surf(i,j,mo)-Tm_time(i,j,mo))) end do end do end do ! POur les modulos Tm_surf(:,:,mois+1)=Tm_surf(:,:,1) Pm_surf(:,:,mois+1)=Pm_surf(:,:,1) call accum_month() ! dans SOURCES call ablation_month() END subroutine forclim !------------------------------------------------------------------------------------------------------------ !> SUBROUTINE: lect_lapserate_months !! Routine de lecture des lapserates mensuels !! @note Lapserates mensuels mais uniformes spatialement !> subroutine lect_lapserate_months ! lapserates mensuels mais uniformes spatialement implicit none real,dimension(12) :: lect_lapse ! pour la lecture namelist/lapse_month/lect_lapse ! lecture de la namelist ! formats pour les ecritures dans 42 428 format(A) rewind(num_param) ! pour revenir au debut du fichier param_list.dat read(num_param,lapse_month) write(num_rep_42,428)'!___________________________________________________________' write(num_rep_42,428) '&lapse_month ! module climat_forcage_mois_mod' write(num_rep_42,'(A,12(f0.2,","))') 'lapse_month = ', lect_lapse write(num_rep_42,*)'/' write(num_rep_42,428) '! laspe rates janvier -> decembre en deg/km' ! pour repasser en deg/m et copier dans lapserate do j=1,ny do i=1,nx lapserate(i,j,:)=lect_lapse(:)/1000. end do end do end subroutine lect_lapserate_months !-------------------------------------------------------------------------------------------------------- end module climat_forcage_mois_mod