Ignore:
Timestamp:
10/20/17 09:31:39 (7 years ago)
Author:
aquiquet
Message:

Grisli-iLoveclim branch: merged to trunk at revision 145

Location:
branches/iLoveclim
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/iLoveclim

  • branches/iLoveclim/SOURCES/bmelt-seuil-profondeur_mod.f90

    r77 r146  
    1616module  bmelt_seuil_prof          
    1717 
    18 ! 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 
     18  ! 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 
    2222 
    23 use module3d_phy 
     23  use module3d_phy 
    2424 
    2525 
    26 implicit none 
     26  implicit none 
    2727 
    28 real :: bm_grz                        !< valeur prescrite a la grounding zone 
    29 real,dimension(nx,ny) ::  bmgrz       !< tabelau fusion basale a la grounding zone 
     28  real :: bm_grz                        !< valeur prescrite a la grounding zone 
     29  real,dimension(nx,ny) ::  bmgrz       !< tabelau fusion basale a la grounding zone 
    3030 
    31 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 
     31  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 
    3535 
    3636 
    3737contains 
    38 !------------------------------------------------------------------------------- 
    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 
     38  !------------------------------------------------------------------------------- 
     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 
    4545 
    4646 
    4747 
    48 ! Cette routine fait l'initialisation pour la fusion basale. 
    49 ! Elle est appelée par inputfile-vec-0.5.f90 
     48    ! Cette routine fait l'initialisation pour la fusion basale. 
     49    ! Elle est appelée par inputfile-vec-0.5.f90 
    5050 
    5151 
    52 namelist/bmelt_seuil/bm_grz,bmshelf_plateau,bmshelf_abysses,depth_talus 
     52    namelist/bmelt_seuil/bm_grz,bmshelf_plateau,bmshelf_abysses,depth_talus 
    5353 
    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') 
    5555 
    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) 
     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) 
    5959 
    60 !    ecriture dans le fichier parametres 
     60    !    ecriture dans le fichier parametres 
    6161 
    6262428 format(A) 
    6363 
    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)'!___________________________________________________________'  
     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)'!___________________________________________________________'  
    7777 
    7878 
    7979 
    80 bmgrz(:,:) = bm_grz 
     80    bmgrz(:,:) = bm_grz 
    8181 
    82 where (Bsoc0(:,:).lt.depth_talus) 
    83    bmshelf(:,:)=bmshelf_abysses 
    84 elsewhere 
    85    bmshelf(:,:)=bmshelf_plateau 
    86 end where 
     82    where (Bsoc0(:,:).lt.depth_talus) 
     83        bmshelf(:,:)=bmshelf_abysses 
     84    elsewhere 
     85        bmshelf(:,:)=bmshelf_plateau 
     86    end where 
    8787 
    88 debug_3D(:,:,34)=bmshelf(:,:) 
    89 return 
    90 end subroutine init_bmelt 
     88    debug_3D(:,:,34)=bmshelf(:,:) 
     89    return 
     90  end subroutine init_bmelt 
    9191 
    92 !________________________________________________________________________________ 
     92  !________________________________________________________________________________ 
    9393 
    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 !> 
     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  !> 
    9898 
    99 subroutine bmeltshelf 
     99  subroutine bmeltshelf 
    100100 
    101101 
    102 ! 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 
     102    ! 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 
    104104 
    105 integer :: ngr           ! nombre de voisins flottants 
    106 real    :: coef_talus    ! pour ne pas changer la fusion au dessus de l'ocean profond 
     105    integer :: ngr           ! nombre de voisins flottants 
     106    real    :: coef_talus    ! pour ne pas changer la fusion au dessus de l'ocean profond 
    107107 
    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') 
    109109 
    110 where (Bsoc0(:,:).lt.depth_talus) 
    111    bmshelf(:,:)=bmshelf_abysses 
    112 elsewhere 
    113    bmshelf(:,:)=bmshelf_plateau 
    114 end where 
     110    where (Bsoc0(:,:).lt.depth_talus) 
     111        bmshelf(:,:)=bmshelf_abysses 
     112    elsewhere 
     113        bmshelf(:,:)=bmshelf_plateau 
     114    end where 
    115115 
    116 do j=1,ny 
    117    do i=1,nx 
     116    do j=1,ny 
     117      do i=1,nx 
    118118 
    119 talus_nochange : if (Bsoc0(i,j).lt.depth_talus) then  
    120            coef_talus = 1         ! pas de changement au dessus de l'ocecan profond 
     119        talus_nochange: if (Bsoc0(i,j).lt.depth_talus) then  
     120            coef_talus = 1         ! pas de changement au dessus de l'ocecan profond 
    121121        else 
    122            coef_talus = coefbmshelf 
     122            coef_talus = coefbmshelf 
    123123        endif talus_nochange 
    124124 
    125125 
    126 shelf:    if (flot(i,j)) then    ! partie flottante 
     126        shelf: if (flot(i,j)) then    ! partie flottante 
    127127 
    128128            bmelt(i,j)=coef_talus*bmshelf(i,j) 
    129129 
    130 ! fbm est vrai si le point est flottant mais un des voisins est pose 
    131 ! calcule dans flottab 
     130            ! fbm est vrai si le point est flottant mais un des voisins est pose 
     131            ! calcule dans flottab 
    132132 
    133133            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 
    136136 
    137137 
    138138 
    139 ! ATTENTION le bloc suivant sert a determiner la fusion basale d'equilibre 
    140 ! pour les shelves stationnaires 
     139            ! ATTENTION le bloc suivant sert a determiner la fusion basale d'equilibre 
     140            ! pour les shelves stationnaires 
    141141 
    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 
    146148 
    147149 
    148150        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 
    157158 
    158 !   la fusion des points limites est une combinaison entre valeur posée et valeur flottante 
    159 !   en fonction du nombre de points flottants 
    160159 
    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 
    163162 
     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 
    164169        endif shelf 
    165  
    166       end do  
     170      end do 
    167171    end do 
    168172 
    169  
    170 if (igrdline.eq.1) then 
    171     bmelt(:,:)=0.      ! hdot donne alors le -bmelt 
     173if ((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 
    172177endif 
    173  
    174178 
    175179return 
Note: See TracChangeset for help on using the changeset viewer.