Changeset 146 for branches/iLoveclim/SOURCES/bmelt-seuil-profondeur_mod.f90
- Timestamp:
- 10/20/17 09:31:39 (7 years ago)
- Location:
- branches/iLoveclim
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/iLoveclim
- Property svn:mergeinfo changed
/trunk merged: 124,127-145
- Property svn:mergeinfo changed
-
branches/iLoveclim/SOURCES/bmelt-seuil-profondeur_mod.f90
r77 r146 16 16 module bmelt_seuil_prof 17 17 18 ! prametrise la fusion basale (ice shelves)19 ! Pour l'actuel : 2 valeurs pour 2 domaines de profondeur20 ! + une valeur pour bmgrz21 ! A choisir dans le module_choix18 ! prametrise la fusion basale (ice shelves) 19 ! Pour l'actuel : 2 valeurs pour 2 domaines de profondeur 20 ! + une valeur pour bmgrz 21 ! A choisir dans le module_choix 22 22 23 use module3d_phy23 use module3d_phy 24 24 25 25 26 implicit none26 implicit none 27 27 28 real :: bm_grz !< valeur prescrite a la grounding zone29 real,dimension(nx,ny) :: bmgrz !< tabelau fusion basale a la grounding zone28 real :: bm_grz !< valeur prescrite a la grounding zone 29 real,dimension(nx,ny) :: bmgrz !< tabelau fusion basale a la grounding zone 30 30 31 real :: bmshelf_plateau !< valeur prescrite sur le plateau cont.32 real :: bmshelf_abysses !< valeur prescrite au dessus de l'ocean profond33 real :: depth_talus !< profondeur de transition34 real,dimension(nx,ny) :: bmshelf !< tableau fusion basale sous shelf31 real :: bmshelf_plateau !< valeur prescrite sur le plateau cont. 32 real :: bmshelf_abysses !< valeur prescrite au dessus de l'ocean profond 33 real :: depth_talus !< profondeur de transition 34 real,dimension(nx,ny) :: bmshelf !< tableau fusion basale sous shelf 35 35 36 36 37 37 contains 38 !-------------------------------------------------------------------------------39 !> SUBROUTINE: init_bmelt40 !! Cette routine fait l'initialisation pour la fusion basale.41 !! @note Elle est appelée par inputfile-vec-0.5.f9042 !!43 !>44 subroutine init_bmelt38 !------------------------------------------------------------------------------- 39 !> SUBROUTINE: init_bmelt 40 !! Cette routine fait l'initialisation pour la fusion basale. 41 !! @note Elle est appelée par inputfile-vec-0.5.f90 42 !! 43 !> 44 subroutine init_bmelt 45 45 46 46 47 47 48 ! Cette routine fait l'initialisation pour la fusion basale.49 ! Elle est appelée par inputfile-vec-0.5.f9048 ! Cette routine fait l'initialisation pour la fusion basale. 49 ! Elle est appelée par inputfile-vec-0.5.f90 50 50 51 51 52 namelist/bmelt_seuil/bm_grz,bmshelf_plateau,bmshelf_abysses,depth_talus52 namelist/bmelt_seuil/bm_grz,bmshelf_plateau,bmshelf_abysses,depth_talus 53 53 54 if (itracebug.eq.1) call tracebug('entree dans init_bmelt de bmelt_seuil_prof')54 if (itracebug.eq.1) call tracebug('entree dans init_bmelt de bmelt_seuil_prof') 55 55 56 rewind(num_param) ! pour revenir au debut du fichier param_list.dat57 read(num_param,bmelt_seuil)58 write(num_rep_42,bmelt_seuil)56 rewind(num_param) ! pour revenir au debut du fichier param_list.dat 57 read(num_param,bmelt_seuil) 58 write(num_rep_42,bmelt_seuil) 59 59 60 ! ecriture dans le fichier parametres60 ! ecriture dans le fichier parametres 61 61 62 62 428 format(A) 63 63 64 write(num_rep_42,428)'!___________________________________________________________'65 write(num_rep_42,428) '&bmelt_seuil ! module bmelt_seuil_prof'66 write(num_rep_42,*) 'bm_grz =',bm_grz67 write(num_rep_42,*) 'bmshelf_plateau =',bmshelf_plateau68 write(num_rep_42,*) 'bmshelf_abysses =',bmshelf_abysses69 write(num_rep_42,*) 'depth_talus =',depth_talus70 write(num_rep_42,*)'/'71 write(num_rep_42,428) '! Pour l actuel : bm_grz a la grounding line'72 write(num_rep_42,428) '! bmshelf_plateau sur le plateau continental'73 write(num_rep_42,428) '! bmshelf_abysses pour les grandes profondeurs'74 write(num_rep_42,428) '! depth_talus, negative, separation entre les 2 domaines'75 write(num_rep_42,*)76 write(num_rep_42,428)'!___________________________________________________________'64 write(num_rep_42,428)'!___________________________________________________________' 65 write(num_rep_42,428) '&bmelt_seuil ! module bmelt_seuil_prof' 66 write(num_rep_42,*) 'bm_grz =',bm_grz 67 write(num_rep_42,*) 'bmshelf_plateau =',bmshelf_plateau 68 write(num_rep_42,*) 'bmshelf_abysses =',bmshelf_abysses 69 write(num_rep_42,*) 'depth_talus =',depth_talus 70 write(num_rep_42,*)'/' 71 write(num_rep_42,428) '! Pour l actuel : bm_grz a la grounding line' 72 write(num_rep_42,428) '! bmshelf_plateau sur le plateau continental' 73 write(num_rep_42,428) '! bmshelf_abysses pour les grandes profondeurs' 74 write(num_rep_42,428) '! depth_talus, negative, separation entre les 2 domaines' 75 write(num_rep_42,*) 76 write(num_rep_42,428)'!___________________________________________________________' 77 77 78 78 79 79 80 bmgrz(:,:) = bm_grz80 bmgrz(:,:) = bm_grz 81 81 82 where (Bsoc0(:,:).lt.depth_talus)83 bmshelf(:,:)=bmshelf_abysses84 elsewhere85 bmshelf(:,:)=bmshelf_plateau86 end where82 where (Bsoc0(:,:).lt.depth_talus) 83 bmshelf(:,:)=bmshelf_abysses 84 elsewhere 85 bmshelf(:,:)=bmshelf_plateau 86 end where 87 87 88 debug_3D(:,:,34)=bmshelf(:,:)89 return90 end subroutine init_bmelt88 debug_3D(:,:,34)=bmshelf(:,:) 89 return 90 end subroutine init_bmelt 91 91 92 !________________________________________________________________________________92 !________________________________________________________________________________ 93 93 94 !> SUBROUTINE: bmeltshelf95 !! Cette routine calcule la fusion basale proprement dite pour les points flottants96 !! @note coefbmshelf a ete calcule par forclim et permet de faire varier en fonction du climat97 !>94 !> SUBROUTINE: bmeltshelf 95 !! Cette routine calcule la fusion basale proprement dite pour les points flottants 96 !! @note coefbmshelf a ete calcule par forclim et permet de faire varier en fonction du climat 97 !> 98 98 99 subroutine bmeltshelf99 subroutine bmeltshelf 100 100 101 101 102 ! cette routine calcule la fusion basale proprement dite pour les points flottants103 ! coefbmshelf a ete calcule par forclim et permet de faire varier en fonction du climat102 ! cette routine calcule la fusion basale proprement dite pour les points flottants 103 ! coefbmshelf a ete calcule par forclim et permet de faire varier en fonction du climat 104 104 105 integer :: ngr ! nombre de voisins flottants106 real :: coef_talus ! pour ne pas changer la fusion au dessus de l'ocean profond105 integer :: ngr ! nombre de voisins flottants 106 real :: coef_talus ! pour ne pas changer la fusion au dessus de l'ocean profond 107 107 108 if (itracebug.eq.1) call tracebug('entree dans bmeltshelf de bmelt_seuil_prof')108 if (itracebug.eq.1) call tracebug('entree dans bmeltshelf de bmelt_seuil_prof') 109 109 110 where (Bsoc0(:,:).lt.depth_talus)111 bmshelf(:,:)=bmshelf_abysses112 elsewhere113 bmshelf(:,:)=bmshelf_plateau114 end where110 where (Bsoc0(:,:).lt.depth_talus) 111 bmshelf(:,:)=bmshelf_abysses 112 elsewhere 113 bmshelf(:,:)=bmshelf_plateau 114 end where 115 115 116 do j=1,ny117 do i=1,nx116 do j=1,ny 117 do i=1,nx 118 118 119 talus_nochange: if (Bsoc0(i,j).lt.depth_talus) then120 coef_talus = 1 ! pas de changement au dessus de l'ocecan profond119 talus_nochange: if (Bsoc0(i,j).lt.depth_talus) then 120 coef_talus = 1 ! pas de changement au dessus de l'ocecan profond 121 121 else 122 coef_talus = coefbmshelf122 coef_talus = coefbmshelf 123 123 endif talus_nochange 124 124 125 125 126 shelf:if (flot(i,j)) then ! partie flottante126 shelf: if (flot(i,j)) then ! partie flottante 127 127 128 128 bmelt(i,j)=coef_talus*bmshelf(i,j) 129 129 130 ! fbm est vrai si le point est flottant mais un des voisins est pose131 ! calcule dans flottab130 ! fbm est vrai si le point est flottant mais un des voisins est pose 131 ! calcule dans flottab 132 132 133 133 if (fbm(i,j)) then 134 bmelt(i,j)=coef_talus*bmgrz(i,j)135 endif 134 bmelt(i,j)=coef_talus*bmgrz(i,j) 135 endif 136 136 137 137 138 138 139 ! ATTENTION le bloc suivant sert a determiner la fusion basale d'equilibre140 ! pour les shelves stationnaires139 ! ATTENTION le bloc suivant sert a determiner la fusion basale d'equilibre 140 ! pour les shelves stationnaires 141 141 142 if (igrdline.eq.1) then 143 corrbmelt(i,j)=hdot(i,j)+bmelt(i,j) ! le bmelt d'equilibre 144 debug_3D(i,j,28)=corrbmelt(i,j) 145 endif 142 if ((igrdline.eq.1).and.(ibmelt_inv.eq.1)) then 143 ! corrbmelt(i,j)=hdot(i,j)+bmelt(i,j) ! le bmelt d'equilibre 144 ! bmelt(i,j)=corrbmelt(i,j) 145 corrbmelt(i,j)=corrbmelt(i,j)+hdot(i,j)*0.85 146 bmelt(i,j)=bmelt(i,j)+corrbmelt(i,j) 147 endif 146 148 147 149 148 150 else ! point posé, on compte le nombre de voisins flottants 149 ngr=0 150 if ((i.ne.1).and.(i.ne.nx).and.(j.ne.1).and.(j.ne.ny)) then 151 if (flot(i+1,j)) ngr=ngr+1 152 if (flot(i-1,j)) ngr=ngr+1 153 if (flot(i,j+1)) ngr=ngr+1 154 if (flot(i,j-1)) ngr=ngr+1 155 end if 156 151 ngr=0 152 if ((i.ne.1).and.(i.ne.nx).and.(j.ne.1).and.(j.ne.ny)) then 153 if (flot(i+1,j)) ngr=ngr+1 154 if (flot(i-1,j)) ngr=ngr+1 155 if (flot(i,j+1)) ngr=ngr+1 156 if (flot(i,j-1)) ngr=ngr+1 157 end if 157 158 158 ! la fusion des points limites est une combinaison entre valeur posée et valeur flottante159 ! en fonction du nombre de points flottants160 159 161 bmelt(i,j)= ngr/4.*bmgrz(i,j)*coef_talus+(1.-ngr/4.)*bmelt(i,j)162 160 ! la fusion des points limites est une combinaison entre valeur posée et valeur flottante 161 ! en fonction du nombre de points flottants 163 162 163 bmelt(i,j)= ngr/4.*bmgrz(i,j)*coef_talus+(1.-ngr/4.)*bmelt(i,j) 164 165 if ((igrdline.eq.1).and.(ibmelt_inv.eq.1)) then 166 corrbmelt(i,j)=corrbmelt(i,j)+hdot(i,j) !*0.85 167 bmelt(i,j)=bmelt(i,j)+corrbmelt(i,j) 168 endif 164 169 endif shelf 165 166 end do 170 end do 167 171 end do 168 172 169 170 if (igrdline.eq.1) then 171 bmelt(:,:)=0. ! hdot donne alors le -bmelt 173 if ((igrdline.eq.1).and.(ibmelt_inv.eq.0)) then 174 where (i_Hp(:,:).eq.1) 175 bmelt(:,:)=0. ! hdot donne alors le -bmelt 176 endwhere 172 177 endif 173 174 178 175 179 return
Note: See TracChangeset
for help on using the changeset viewer.