Changeset 393
- Timestamp:
- 03/23/23 18:13:47 (13 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/GRISLIv3/SOURCES/dragging_param_beta_mod.f90
r333 r393 18 18 module dragging_param_beta 19 19 20 ! Defini les zones de stream avec : 21 ! * un critere sur la pression effective 22 ! * un critere de continuite depuis la cote 23 ! * un critere sur la courbure du socle (si negatif, vallees) 24 25 use module3d_phy 26 use param_phy_mod 27 use interface_input 28 use io_netcdf_grisli 29 use fake_beta_iter_vitbil_mod 30 31 implicit none 32 33 logical,dimension(nx,ny) :: cote 34 35 real,dimension(nx,ny) :: beta_param ! local variable 36 37 real :: betamin ! betamin : (Pa) frottement mini sous les streams 38 39 real :: beta_slope ! = A in: B = A x Neff ** K 40 real :: beta_expo ! = K in: B = A x Neff ** K 41 42 real,dimension(nx,ny) :: neff ! pression effective noeuds majeurs 43 real,dimension(nx,ny) :: hwatmx ! hauteur d'eau staggered grille - afq 44 real,dimension(nx,ny) :: hwatmy ! hauteur d'eau staggered grille - afq 45 46 real :: coef_ile ! coef frottement zones iles (0.1) 47 48 real, dimension(nx,ny) :: Vcol_x !< uniquement pour compatibilite avec spinup cat 49 real, dimension(nx,ny) :: Vcol_y !< uniquement pour compatibilite avec spinup cat 50 real, dimension(nx,ny) :: Vsl_x !< uniquement pour compatibilite avec spinup cat 51 real, dimension(nx,ny) :: Vsl_y !< uniquement pour compatibilite avec spinup cat 52 logical :: corr_def = .false. !< for deformation correction, pour compatibilite beta 20 ! Defini les zones de stream avec : 21 ! * un critere sur la pression effective 22 ! * un critere de continuite depuis la cote 23 ! * un critere sur la courbure du socle (si negatif, vallees) 24 25 use module3d_phy, only:nx,ny,betamax,num_param,num_rep_42,inv_beta,mstream_mx,mstream_my,drag_mx,drag_my,& 26 betamax_2d,neffmx,neffmy,niter_nolin,hwater,betamx,betamy,ilemx,ilemy,flot,beta_centre,fleuvemx,fleuvemy,& 27 gzmx,gzmy,flgzmx,flgzmy,flotmx,flotmy 28 use runparam, only:itracebug 29 use param_phy_mod, only: 30 use interface_input, only: 31 use io_netcdf_grisli 32 use fake_beta_iter_vitbil_mod, only:time_iter,time_iter_end,nb_iter_vitbil,beta_iter_vitbil 33 34 implicit none 35 36 logical,dimension(nx,ny) :: cote 37 38 real,dimension(nx,ny) :: beta_param ! local variable 39 40 real :: betamin ! betamin : (Pa) frottement mini sous les streams 41 42 real :: beta_slope ! = A in: B = A x Neff ** K 43 real :: beta_expo ! = K in: B = A x Neff ** K 44 45 real,dimension(nx,ny) :: neff ! pression effective noeuds majeurs 46 real,dimension(nx,ny) :: hwatmx ! hauteur d'eau staggered grille - afq 47 real,dimension(nx,ny) :: hwatmy ! hauteur d'eau staggered grille - afq 48 49 real :: coef_ile ! coef frottement zones iles (0.1) 50 51 real, dimension(nx,ny) :: Vcol_x !< uniquement pour compatibilite avec spinup cat 52 real, dimension(nx,ny) :: Vcol_y !< uniquement pour compatibilite avec spinup cat 53 real, dimension(nx,ny) :: Vsl_x !< uniquement pour compatibilite avec spinup cat 54 real, dimension(nx,ny) :: Vsl_y !< uniquement pour compatibilite avec spinup cat 55 logical :: corr_def = .false. !< for deformation correction, pour compatibilite beta 53 56 54 57 contains 55 !-------------------------------------------------------------------------------56 57 !> SUBROUTINE: init_dragging58 !! Cette routine fait l'initialisation du dragging.59 !>60 subroutine init_dragging ! Cette routine fait l'initialisation du dragging.61 62 implicit none63 64 namelist/drag_param_beta/beta_slope,beta_expo,betamax,betamin,coef_ile65 66 if (itracebug.eq.1) call tracebug(' dragging avec neff et slope')67 68 69 ! formats pour les ecritures dans 4258 !------------------------------------------------------------------------------- 59 60 !> SUBROUTINE: init_dragging 61 !! Cette routine fait l'initialisation du dragging. 62 !> 63 subroutine init_dragging ! Cette routine fait l'initialisation du dragging. 64 65 implicit none 66 67 namelist/drag_param_beta/beta_slope,beta_expo,betamax,betamin,coef_ile 68 69 if (itracebug.eq.1) call tracebug(' dragging avec neff et slope') 70 71 72 ! formats pour les ecritures dans 42 70 73 428 format(A) 71 74 72 ! lecture des parametres du run block drag neff 73 !-------------------------------------------------------------------- 74 75 rewind(num_param) ! pour revenir au debut du fichier param_list.dat 76 read(num_param,drag_param_beta) 77 78 write(num_rep_42,428)'!___________________________________________________________' 79 write(num_rep_42,428) '&drag_param_beta ! nom du bloc dragging param beta' 80 write(num_rep_42,*) 81 write(num_rep_42,*) 'beta_slope = ', beta_slope 82 write(num_rep_42,*) 'beta_expo = ', beta_expo 83 write(num_rep_42,*) 'betamax = ', betamax 84 write(num_rep_42,*) 'betamin = ', betamin 85 write(num_rep_42,*)'/' 86 write(num_rep_42,428) '! Slope & expo of beta = - slope x Neff ** expo' 87 88 inv_beta=0 89 !------------------------------------------------------------------- 90 ! masque stream 91 mstream_mx(:,:)=1 92 mstream_my(:,:)=1 93 94 95 ! coefficient permettant de modifier le basal drag. 96 drag_mx(:,:)=1. 97 drag_my(:,:)=1. 98 99 betamax_2d(:,:) = betamax 100 101 !afq -- toblim = 0. !0.7e5 ! afq -- pour les iles, mais est-ce vraiment utile? 102 103 niter_nolin = 1 104 105 return 106 end subroutine init_dragging 107 !________________________________________________________________________________ 108 109 !> SUBROUTINE: dragging 110 !! Defini la localisation des streams et le frottement basal 111 !> 112 !------------------------------------------------------------------------- 113 subroutine dragging ! defini le frottement basal 114 !$ USE OMP_LIB 115 116 ! les iles n'ont pas de condition neff mais ont la condition toblim 117 ! (ce bloc etait avant dans flottab) 118 119 !$OMP PARALLEL 120 121 ! -- !$OMP DO 122 ! -- do j=2,ny 123 ! -- do i=2,nx 124 ! -- ilemx(i,j)=ilemx(i,j).and.(abs(rog*Hmx(i,j)*sdx(i,j)).lt.toblim) 125 ! -- ilemy(i,j)=ilemy(i,j).and.(abs(rog*Hmy(i,j)*sdy(i,j)).lt.toblim) 126 ! -- end do 127 ! -- end do 128 ! -- !$OMP END DO 129 130 131 132 ! calcul de neff (pression effective sur noeuds majeurs) 133 if (sum(neffmx(:,:)).le.0.) neffmx(:,:) =1.e8 134 if (sum(neffmy(:,:)).le.0.) neffmy(:,:) =1.e8 135 136 !$OMP DO 137 do j=1,ny-1 138 do i=1,nx-1 139 neff(i,j)=(neffmx(i,j)+neffmx(i+1,j)+neffmy(i,j)+neffmy(i,j+1))/4 140 enddo 141 enddo 142 !$OMP END DO 143 !aurel, for the borders: 144 !$OMP WORKSHARE 145 neff(:,ny)=1.e5 146 neff(nx,:)=1.e5 147 ! calcul de hwat (staggered) 148 hwatmx(:,:)=0. 149 hwatmy(:,:)=0. 150 !$OMP END WORKSHARE 151 !$OMP DO 152 do i=2,nx 153 hwatmx(i,:)=(hwater(i-1,:)+hwater(i,:))/2. 154 enddo 155 !$OMP END DO 156 !$OMP DO 157 do j=2,ny 158 hwatmy(:,j)=(hwater(:,j-1)+hwater(:,j))/2. 159 enddo 160 !$OMP END DO 161 162 !$OMP WORKSHARE 163 164 ! new parametrisation of beta on Neff: 165 betamx(:,:)= beta_slope*(neffmx(:,:)**beta_expo) 166 betamy(:,:)= beta_slope*(neffmy(:,:)**beta_expo) 167 168 where (ilemx(:,:)) betamx(:,:) = betamx(:,:) * coef_ile 169 where (ilemy(:,:)) betamy(:,:) = betamy(:,:) * coef_ile 170 171 172 betamx(:,:)=max(betamx(:,:),betamin) 173 betamy(:,:)=max(betamy(:,:),betamin) 174 betamx(:,:)=min(betamx(:,:),betamax) 175 betamy(:,:)=min(betamy(:,:),betamax) 176 177 where ( hwatmx(:,:) .lt. 0.5 ) betamx(:,:) = betamax 178 where ( hwatmy(:,:) .lt. 0.5 ) betamy(:,:) = betamax 179 180 !$OMP END WORKSHARE 181 182 ! points flottants 183 !$OMP DO 184 do j=2,ny 185 do i=2,nx 186 if (flot(i,j).and.(flot(i-1,j))) then 187 betamx(i,j)=0. 188 end if 189 if (flot(i,j).and.(flot(i,j-1))) then 190 betamy(i,j)=0. 191 end if 192 end do 193 end do 194 !$OMP END DO 195 196 197 !$OMP DO 198 do j=2,ny-1 199 do i=2,nx-1 200 beta_centre(i,j) = ((betamx(i,j)+betamx(i+1,j)) & 201 + (betamy(i,j)+betamy(i,j+1)))*0.25 202 end do 203 end do 204 !$OMP END DO 205 !$OMP END PARALLEL 206 207 return 208 end subroutine dragging 209 !________________________________________________________________________________ 210 211 !> SUBROUTINE: mstream_dragging 212 !! Defini la localisation des streams 213 !> 214 !------------------------------------------------------------------------- 215 subroutine mstream_dragging ! defini la localisation des streams 216 217 !$OMP PARALLEL 218 219 !$OMP WORKSHARE 220 fleuvemx(:,:)=.false. 221 fleuvemy(:,:)=.false. 222 cote(:,:)=.false. 223 gzmx(:,:)=.true. 224 gzmy(:,:)=.true. 225 flgzmx(:,:)=.false. 226 flgzmy(:,:)=.false. 227 !$OMP END WORKSHARE 228 229 ! detection des cotes 230 !$OMP DO 231 do j=2,ny-1 232 do i=2,nx-1 233 if ((.not.flot(i,j)).and. & 234 ((flot(i+1,j)).or.(flot(i,j+1)).or.(flot(i-1,j)).or.(flot(i,j-1)))) then 235 cote(i,j)=.true. 236 endif 237 end do 238 end do 239 !$OMP END DO 240 241 242 ! calcul de gzmx 243 244 ! points flottants : flgzmx mais pas gzmx 245 !$OMP DO 246 do j=2,ny 247 do i=2,nx 248 if (flot(i,j).and.(flot(i-1,j))) then 249 flotmx(i,j)=.true. 250 flgzmx(i,j)=.true. 251 gzmx(i,j)=.false. 252 betamx(i,j)=0. 253 end if 254 if (flot(i,j).and.(flot(i,j-1))) then 255 flotmy(i,j)=.true. 256 flgzmy(i,j)=.true. 257 gzmy(i,j)=.false. 258 betamy(i,j)=0. 259 end if 260 end do 261 end do 262 !$OMP END DO 263 264 !--------- autres criteres 265 266 ! points poses 267 !$OMP WORKSHARE 268 gzmx(:,:)=gzmx(:,:).and.(betamx(:,:).lt.betamax) ! Pas de calcul pour les points 269 gzmy(:,:)=gzmy(:,:).and.(betamy(:,:).lt.betamax) ! au fort beta 270 271 flgzmx(:,:) = flgzmx(:,:) .or. gzmx(:,:) 272 flgzmy(:,:) = flgzmy(:,:) .or. gzmy(:,:) 273 274 fleuvemx(:,:)=gzmx(:,:) 275 fleuvemy(:,:)=gzmy(:,:) 276 !$OMP END WORKSHARE 277 278 !$OMP END PARALLEL 279 280 return 281 end subroutine mstream_dragging 75 ! lecture des parametres du run block drag neff 76 !-------------------------------------------------------------------- 77 78 rewind(num_param) ! pour revenir au debut du fichier param_list.dat 79 read(num_param,drag_param_beta) 80 81 write(num_rep_42,428)'!___________________________________________________________' 82 write(num_rep_42,428) '&drag_param_beta ! nom du bloc dragging param beta' 83 write(num_rep_42,*) 84 write(num_rep_42,*) 'beta_slope = ', beta_slope 85 write(num_rep_42,*) 'beta_expo = ', beta_expo 86 write(num_rep_42,*) 'betamax = ', betamax 87 write(num_rep_42,*) 'betamin = ', betamin 88 write(num_rep_42,*)'/' 89 write(num_rep_42,428) '! Slope & expo of beta = - slope x Neff ** expo' 90 91 inv_beta=0 92 !------------------------------------------------------------------- 93 ! masque stream 94 mstream_mx(:,:)=1 95 mstream_my(:,:)=1 96 97 98 ! coefficient permettant de modifier le basal drag. 99 drag_mx(:,:)=1. 100 drag_my(:,:)=1. 101 102 betamax_2d(:,:) = betamax 103 104 !afq -- toblim = 0. !0.7e5 ! afq -- pour les iles, mais est-ce vraiment utile? 105 106 niter_nolin = 1 107 108 return 109 end subroutine init_dragging 110 !________________________________________________________________________________ 111 112 !> SUBROUTINE: dragging 113 !! Defini la localisation des streams et le frottement basal 114 !> 115 !------------------------------------------------------------------------- 116 subroutine dragging ! defini le frottement basal 117 118 !$ USE OMP_LIB 119 120 ! les iles n'ont pas de condition neff mais ont la condition toblim 121 ! (ce bloc etait avant dans flottab) 122 123 124 125 ! -- !$OMP DO 126 ! -- do j=2,ny 127 ! -- do i=2,nx 128 ! -- ilemx(i,j)=ilemx(i,j).and.(abs(rog*Hmx(i,j)*sdx(i,j)).lt.toblim) 129 ! -- ilemy(i,j)=ilemy(i,j).and.(abs(rog*Hmy(i,j)*sdy(i,j)).lt.toblim) 130 ! -- end do 131 ! -- end do 132 ! -- !$OMP END DO 133 134 implicit none 135 integer :: i,j 136 137 !$OMP PARALLEL 138 ! calcul de neff (pression effective sur noeuds majeurs) 139 if (sum(neffmx(:,:)).le.0.) neffmx(:,:) =1.e8 140 if (sum(neffmy(:,:)).le.0.) neffmy(:,:) =1.e8 141 142 !$OMP DO 143 do j=1,ny-1 144 do i=1,nx-1 145 neff(i,j)=(neffmx(i,j)+neffmx(i+1,j)+neffmy(i,j)+neffmy(i,j+1))/4 146 enddo 147 enddo 148 !$OMP END DO 149 !aurel, for the borders: 150 !$OMP WORKSHARE 151 neff(:,ny)=1.e5 152 neff(nx,:)=1.e5 153 ! calcul de hwat (staggered) 154 hwatmx(:,:)=0. 155 hwatmy(:,:)=0. 156 !$OMP END WORKSHARE 157 !$OMP DO 158 do i=2,nx 159 hwatmx(i,:)=(hwater(i-1,:)+hwater(i,:))/2. 160 enddo 161 !$OMP END DO 162 !$OMP DO 163 do j=2,ny 164 hwatmy(:,j)=(hwater(:,j-1)+hwater(:,j))/2. 165 enddo 166 !$OMP END DO 167 168 !$OMP WORKSHARE 169 170 ! new parametrisation of beta on Neff: 171 betamx(:,:)= beta_slope*(neffmx(:,:)**beta_expo) 172 betamy(:,:)= beta_slope*(neffmy(:,:)**beta_expo) 173 174 where (ilemx(:,:)) betamx(:,:) = betamx(:,:) * coef_ile 175 where (ilemy(:,:)) betamy(:,:) = betamy(:,:) * coef_ile 176 177 178 betamx(:,:)=max(betamx(:,:),betamin) 179 betamy(:,:)=max(betamy(:,:),betamin) 180 betamx(:,:)=min(betamx(:,:),betamax) 181 betamy(:,:)=min(betamy(:,:),betamax) 182 183 where ( hwatmx(:,:) .lt. 0.5 ) betamx(:,:) = betamax 184 where ( hwatmy(:,:) .lt. 0.5 ) betamy(:,:) = betamax 185 186 !$OMP END WORKSHARE 187 188 ! points flottants 189 !$OMP DO 190 do j=2,ny 191 do i=2,nx 192 if (flot(i,j).and.(flot(i-1,j))) then 193 betamx(i,j)=0. 194 end if 195 if (flot(i,j).and.(flot(i,j-1))) then 196 betamy(i,j)=0. 197 end if 198 end do 199 end do 200 !$OMP END DO 201 202 203 !$OMP DO 204 do j=2,ny-1 205 do i=2,nx-1 206 beta_centre(i,j) = ((betamx(i,j)+betamx(i+1,j)) & 207 + (betamy(i,j)+betamy(i,j+1)))*0.25 208 end do 209 end do 210 !$OMP END DO 211 !$OMP END PARALLEL 212 213 return 214 end subroutine dragging 215 !________________________________________________________________________________ 216 217 !> SUBROUTINE: mstream_dragging 218 !! Defini la localisation des streams 219 !> 220 !------------------------------------------------------------------------- 221 subroutine mstream_dragging ! defini la localisation des streams 222 223 implicit none 224 integer :: i,j 225 226 !$OMP PARALLEL 227 228 !$OMP WORKSHARE 229 fleuvemx(:,:)=.false. 230 fleuvemy(:,:)=.false. 231 cote(:,:)=.false. 232 gzmx(:,:)=.true. 233 gzmy(:,:)=.true. 234 flgzmx(:,:)=.false. 235 flgzmy(:,:)=.false. 236 !$OMP END WORKSHARE 237 238 ! detection des cotes 239 !$OMP DO 240 do j=2,ny-1 241 do i=2,nx-1 242 if ((.not.flot(i,j)).and. & 243 ((flot(i+1,j)).or.(flot(i,j+1)).or.(flot(i-1,j)).or.(flot(i,j-1)))) then 244 cote(i,j)=.true. 245 endif 246 end do 247 end do 248 !$OMP END DO 249 250 251 ! calcul de gzmx 252 253 ! points flottants : flgzmx mais pas gzmx 254 !$OMP DO 255 do j=2,ny 256 do i=2,nx 257 if (flot(i,j).and.(flot(i-1,j))) then 258 flotmx(i,j)=.true. 259 flgzmx(i,j)=.true. 260 gzmx(i,j)=.false. 261 betamx(i,j)=0. 262 end if 263 if (flot(i,j).and.(flot(i,j-1))) then 264 flotmy(i,j)=.true. 265 flgzmy(i,j)=.true. 266 gzmy(i,j)=.false. 267 betamy(i,j)=0. 268 end if 269 end do 270 end do 271 !$OMP END DO 272 273 !--------- autres criteres 274 275 ! points poses 276 !$OMP WORKSHARE 277 gzmx(:,:)=gzmx(:,:).and.(betamx(:,:).lt.betamax) ! Pas de calcul pour les points 278 gzmy(:,:)=gzmy(:,:).and.(betamy(:,:).lt.betamax) ! au fort beta 279 280 flgzmx(:,:) = flgzmx(:,:) .or. gzmx(:,:) 281 flgzmy(:,:) = flgzmy(:,:) .or. gzmy(:,:) 282 283 fleuvemx(:,:)=gzmx(:,:) 284 fleuvemy(:,:)=gzmy(:,:) 285 !$OMP END WORKSHARE 286 287 !$OMP END PARALLEL 288 289 return 290 end subroutine mstream_dragging 282 291 283 292 end module dragging_param_beta
Note: See TracChangeset
for help on using the changeset viewer.