Ignore:
Timestamp:
2019-08-08T16:02:49+02:00 (15 months ago)
Author:
mathiot
Message:

ENHANCE-02_ISF_nemo : add UKESM ice sheet coupling method (ticket #2142)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isf.F90

    r11403 r11423  
    2222   PRIVATE 
    2323 
    24    PUBLIC   isf_alloc, isf_alloc_par, isf_alloc_cav 
    25  
    26    ! public in order to be able to output then  
    27  
    28    LOGICAL, PUBLIC :: ln_isfpar_mlt                  !: logical for the computation of melt inside the cavity 
    29    LOGICAL, PUBLIC :: ln_isfcav_mlt                  !: logical for the use of ice shelf parametrisation 
    30    REAL(wp), PUBLIC ::   rn_hisf_tbl                 !: thickness of top boundary layer [m] 
    31    REAL(wp), PUBLIC ::   rn_gammat0                  !: temperature exchange coeficient    [] 
    32    REAL(wp), PUBLIC ::   rn_gammas0                  !: salinity    exchange coeficient    [] 
    33    REAL(wp), PUBLIC ::   rn_htbl                     !: Losch top boundary layer thickness [m] 
    34    CHARACTER(LEN=256), PUBLIC :: cn_isfload          !: ice shelf load computation method 
    35    CHARACTER(LEN=256), PUBLIC :: cn_gammablk         !: gamma formulation 
    36    CHARACTER(LEN=256), PUBLIC :: cn_isfcav_mlt, cn_isfpar_mlt !: melt formulation (cavity/param) 
    37    TYPE(FLD_N), PUBLIC                                  :: sn_isfcav_fwf   !: information about the isf melting file to be read 
    38    TYPE(FLD_N), PUBLIC                                  :: sn_isfpar_fwf   !: information about the isf melting file to be read 
    39    TYPE(FLD_N), PUBLIC                                  :: sn_isfpar_zmax  !: information about the grounding line depth file to be read 
    40    TYPE(FLD_N), PUBLIC                                  :: sn_isfpar_zmin  !: information about the calving   line depth file to be read 
    41    TYPE(FLD_N), PUBLIC                                  :: sn_isfpar_Leff  !: information about the effective length     file to be read 
    42  
    43    LOGICAL, PUBLIC :: l_isfcpl 
    44    ! 
    45    INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   misfkt_par, misfkt_cav   !: Level of ice shelf base 
    46    INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   misfkb_par, misfkb_cav   !: Level of ice shelf base 
    47    ! 
    48    INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   mskisf_par, mskisf_cav   !: Level of ice shelf base 
    49    ! 
    50    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   risfload                     !: ice shelf load 
    51    ! 
    52    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   rhisf_tbl_0                  !: thickness of tbl (initial value)  [m] 
    53    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   rhisf_tbl_cav, rhisf_tbl_par !: thickness of tbl                  [m] 
    54    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   rfrac_tbl_cav, rfrac_tbl_par !: fraction of the deepest cell affect by isf tbl  [] 
    55    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   rhisf0_tbl_par 
    56    ! 
    57    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   fwfisf_cpl 
    58    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   fwfisf_par, fwfisf_par_b !: net fwf from the ice shelf        [kg/m2/s] 
    59    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   fwfisf_cav, fwfisf_cav_b !: net fwf from the ice shelf        [kg/m2/s] 
    60    ! 
    61    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   risfLeff 
    62    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   risf_cav_tsc_b, risf_cav_tsc     !: before and now T & S isf contents [K.m/s & PSU.m/s]   
    63    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   risf_par_tsc_b, risf_par_tsc     !: before and now T & S isf contents [K.m/s & PSU.m/s]   
    64  
     24   PUBLIC   isf_alloc, isf_alloc_par, isf_alloc_cav, isf_alloc_cpl 
     25   ! 
     26   !------------------------------------------------------- 
     27   ! 0 :              namelist parameter 
     28   !------------------------------------------------------- 
     29   ! 
     30   ! 0.1 -------- ice shelf cavity parameter -------------- 
     31   CHARACTER(LEN=256), PUBLIC :: cn_isfdir 
     32   CHARACTER(LEN=256), PUBLIC :: cn_isfload      !: ice shelf load computation method 
     33   ! 
     34   ! 0.2 -------- ice shelf cavity melt namelist parameter ------------- 
     35   LOGICAL           , PUBLIC :: ln_isfcav_mlt   !: logical for the use of ice shelf parametrisation 
     36   REAL(wp)          , PUBLIC :: rn_gammat0      !: temperature exchange coeficient    [] 
     37   REAL(wp)          , PUBLIC :: rn_gammas0      !: salinity    exchange coeficient    [] 
     38   REAL(wp)          , PUBLIC :: rn_htbl         !: Losch top boundary layer thickness [m] 
     39   CHARACTER(LEN=256), PUBLIC :: cn_gammablk     !: gamma formulation 
     40   CHARACTER(LEN=256), PUBLIC :: cn_isfcav_mlt   !: melt formulation (cavity/param) 
     41   TYPE(FLD_N)       , PUBLIC :: sn_isfcav_fwf   !: information about the isf melting file to be read 
     42   ! 
     43   ! 0.3 -------- ice shelf param. melt namelist parameter ------------- 
     44   LOGICAL           , PUBLIC :: ln_isfpar_mlt   !: logical for the computation of melt inside the cavity 
     45   CHARACTER(LEN=256), PUBLIC :: cn_isfpar_mlt   !: melt formulation (cavity/param) 
     46   TYPE(FLD_N)       , PUBLIC :: sn_isfpar_fwf   !: information about the isf melting file to be read 
     47   TYPE(FLD_N)       , PUBLIC :: sn_isfpar_zmax  !: information about the grounding line depth file to be read 
     48   TYPE(FLD_N)       , PUBLIC :: sn_isfpar_zmin  !: information about the calving   line depth file to be read 
     49   TYPE(FLD_N)       , PUBLIC :: sn_isfpar_Leff  !: information about the effective length     file to be read 
     50   ! 
     51   ! 0.4 -------- coupling namelist parameter ------------- 
     52   LOGICAL, PUBLIC :: ln_isfcpl      !: 
     53   LOGICAL, PUBLIC :: ln_isfcpl_cons !: 
     54   INTEGER, PUBLIC :: nn_drown       !: 
     55   ! 
     56   !------------------------------------------------------- 
     57   ! 1 :              ice shelf parameter 
     58   !------------------------------------------------------- 
     59   ! 
    6560   REAL(wp), PARAMETER, PUBLIC :: rLfusisf = 0.334e6_wp    !: latent heat of fusion of ice shelf     [J/kg] 
    6661   REAL(wp), PARAMETER, PUBLIC :: rcpisf = 2000.0_wp       !: specific heat of ice shelf             [J/kg/K] 
     
    6863   REAL(wp), PARAMETER, PUBLIC :: rhoisf = 920.0_wp        !: volumic mass of ice shelf              [kg/m3] 
    6964   REAL(wp), PARAMETER, PUBLIC :: rtsurf = -20.0           !: surface temperature                    [C] 
    70    REAL(wp), PARAMETER, PUBLIC :: risf_eps = 1.e-20_wp         
    71  
    72    REAL(wp), PUBLIC            :: risf_lamb1, risf_lamb2, risf_lamb3  ! freezing point linearization coeficient 
    73  
     65   ! 
     66   !------------------------------------------------------- 
     67   ! 2 :              ice shelf global variables 
     68   !------------------------------------------------------- 
     69   ! 
     70   ! 0.1 -------- ice shelf cavity parameter -------------- 
     71   LOGICAL , PUBLIC            :: l_isfoasis 
    7472   REAL(wp), PUBLIC            :: r1_Lfusisf               !: 1/rLfusisf 
    75  
    76    TYPE(FLD)  , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: sf_isfcav_fwf 
    77    TYPE(FLD)  , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: sf_isfpar_fwf 
    78  
    79 !: Variable used in fldread to read the forcing file (nn_isf == 4 .OR. nn_isf == 3) 
    80    CHARACTER(len=100), PUBLIC           :: cn_dirisf  = './' !: Root directory for location of ssr files 
    81    TYPE(FLD_N)       , PUBLIC           :: sn_fwfisf         !: information about the isf melting file to be read 
    82    TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_fwfisf 
    83    TYPE(FLD_N)       , PUBLIC           :: sn_rnfisf         !: information about the isf melting param.   file to be read 
    84    TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_rnfisf            
    85     
     73   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)    ::   risfload                    !: ice shelf load 
     74   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)    ::   fwfisf_oasis 
     75   ! 
     76   ! 0.2 -------- ice shelf cavity melt namelist parameter ------------- 
     77   INTEGER  , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   :: mskisf_cav                    !: 
     78   INTEGER  , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   :: misfkt_cav   , misfkb_cav     !:  
     79   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   :: rhisf_tbl_cav, rfrac_tbl_cav  !:  
     80   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   :: fwfisf_cav   , fwfisf_cav_b   !: before and now net fwf from the ice shelf        [kg/m2/s] 
     81   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: risf_cav_tsc , risf_cav_tsc_b !: before and now T & S isf contents [K.m/s & PSU.m/s]   
     82   TYPE(FLD), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)     :: sf_isfcav_fwf                 !: 
     83   ! 
     84   REAL(wp) , PUBLIC                                      :: risf_lamb1, risf_lamb2, risf_lamb3  ! freezing point linearization coeficient 
     85   ! 
     86   ! 0.3 -------- ice shelf param. melt namelist parameter ------------- 
     87   INTEGER  , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   :: mskisf_par                    !: 
     88   INTEGER  , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   :: misfkt_par   , misfkb_par     !: 
     89   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   :: rhisf_tbl_par, rfrac_tbl_par  !:  
     90   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   :: fwfisf_par   , fwfisf_par_b   !: before and now net fwf from the ice shelf        [kg/m2/s] 
     91   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: risf_par_tsc , risf_par_tsc_b !: before and now T & S isf contents [K.m/s & PSU.m/s]   
     92   TYPE(FLD), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)     :: sf_isfpar_fwf                 !: 
     93   ! 
     94   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   :: rhisf0_tbl_par                !: thickness of tbl (initial value)  [m] 
     95   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   :: risfLeff                      !: 
     96   ! 
     97   ! 0.4 -------- coupling namelist parameter ------------- 
     98   LOGICAL , PUBLIC                                        :: ll_isfcpl      !: 
     99   LOGICAL , PUBLIC                                        :: ll_isfcpl_cons !: 
     100   INTEGER , PUBLIC                                        ::   nstp_iscpl   !: 
     101   REAL(wp), PUBLIC                                        ::   rdt_iscpl    !:  
     102   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   risfcpl_vol, risfcpl_cons_vol  !: 
     103   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::   risfcpl_tsc, risfcpl_cons_tsc  !: 
     104   ! 
    86105   !!---------------------------------------------------------------------- 
    87106   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
     
    121140      CALL mpp_sum ( 'isf', ierr ) 
    122141      IF( ierr /= 0 )   CALL ctl_stop( 'STOP', 'isf: failed to allocate arrays.' ) 
     142      ! 
    123143   END SUBROUTINE isf_alloc_par 
    124144 
     
    145165      ierr = ierr + ialloc 
    146166      ! 
     167      CALL mpp_sum ( 'isf', ierr ) 
     168      IF( ierr /= 0 )   CALL ctl_stop( 'STOP', 'isf: failed to allocate arrays.' ) 
     169      ! 
     170   END SUBROUTINE isf_alloc_cav 
     171 
     172   SUBROUTINE isf_alloc_cpl() 
     173      !!--------------------------------------------------------------------- 
     174      !!                  ***  ROUTINE isf_alloc_cpl  *** 
     175      !! 
     176      !! ** Purpose :  
     177      !! 
     178      !! ** Method  :  
     179      !! 
     180      !!---------------------------------------------------------------------- 
     181      INTEGER :: ierr, ialloc 
     182      !!---------------------------------------------------------------------- 
     183      ierr = 0 
     184      ! 
     185      ALLOCATE( risfcpl_tsc(jpi,jpj,jpk,jpts)      , risfcpl_vol(jpi,jpj,jpk)      ,             & 
     186         &      risfcpl_cons_tsc(jpi,jpj,jpk,jpts) , risfcpl_cons_vol(jpi,jpj,jpk) , STAT=ialloc ) 
     187      ierr = ierr + ialloc 
     188      ! 
     189      CALL mpp_sum ( 'isf', ierr ) 
     190      IF( ierr /= 0 )   CALL ctl_warn('STOP','isfcpl: failed to allocate arrays.') 
     191      ! 
     192   END SUBROUTINE isf_alloc_cpl 
     193 
     194   SUBROUTINE isf_alloc() 
     195      !!--------------------------------------------------------------------- 
     196      !!                  ***  ROUTINE isf_alloc  *** 
     197      !! 
     198      !! ** Purpose :  
     199      !! 
     200      !! ** Method  :  
     201      !! 
     202      !!---------------------------------------------------------------------- 
     203      INTEGER :: ierr, ialloc 
     204      !!---------------------------------------------------------------------- 
     205      ! 
     206      ierr = 0       ! set to zero if no array to be allocated 
     207      ! 
     208      ALLOCATE(fwfisf_par(jpi,jpj)  , fwfisf_par_b(jpi,jpj), & 
     209         &     fwfisf_cav(jpi,jpj)  , fwfisf_cav_b(jpi,jpj), & 
     210         &     fwfisf_oasis(jpi,jpj),            STAT=ialloc ) 
     211      ierr = ierr + ialloc 
     212      ! 
     213      ALLOCATE(risf_par_tsc(jpi,jpj,jpts), risf_par_tsc_b(jpi,jpj,jpts), STAT=ialloc ) 
     214      ierr = ierr + ialloc 
     215      ! 
     216      ALLOCATE(risf_cav_tsc(jpi,jpj,jpts), risf_cav_tsc_b(jpi,jpj,jpts), STAT=ialloc ) 
     217      ierr = ierr + ialloc 
     218      ! 
     219      ALLOCATE(risfload(jpi,jpj), STAT=ialloc) 
     220      ierr = ierr + ialloc 
     221      ! 
    147222      ALLOCATE( mskisf_cav(jpi,jpj), STAT=ialloc) 
    148223      ierr = ierr + ialloc 
     
    150225      CALL mpp_sum ( 'isf', ierr ) 
    151226      IF( ierr /= 0 )   CALL ctl_stop( 'STOP', 'isf: failed to allocate arrays.' ) 
    152    END SUBROUTINE isf_alloc_cav 
    153  
    154    SUBROUTINE isf_alloc() 
    155       !!--------------------------------------------------------------------- 
    156       !!                  ***  ROUTINE isf_alloc  *** 
    157       !! 
    158       !! ** Purpose :  
    159       !! 
    160       !! ** Method  :  
    161       !! 
    162       !!---------------------------------------------------------------------- 
    163       INTEGER :: ierr, ialloc 
    164       !!---------------------------------------------------------------------- 
    165       ! 
    166       ierr = 0       ! set to zero if no array to be allocated 
    167       ! 
    168       ALLOCATE(fwfisf_par(jpi,jpj), fwfisf_par_b(jpi,jpj), & 
    169          &     fwfisf_cav(jpi,jpj), fwfisf_cav_b(jpi,jpj), & 
    170          &     fwfisf_cpl(jpi,jpj),            STAT=ialloc ) 
    171       ierr = ierr + ialloc 
    172       ! 
    173       ALLOCATE(risf_par_tsc(jpi,jpj,jpts), risf_par_tsc_b(jpi,jpj,jpts), STAT=ialloc ) 
    174       ierr = ierr + ialloc 
    175       ! 
    176       ALLOCATE(risf_cav_tsc(jpi,jpj,jpts), risf_cav_tsc_b(jpi,jpj,jpts), STAT=ialloc ) 
    177       ierr = ierr + ialloc 
    178       ! 
    179       ALLOCATE(risfload(jpi,jpj), STAT=ialloc) 
    180       ierr = ierr + ialloc 
    181       ! 
    182       CALL mpp_sum ( 'isf', ierr ) 
    183       IF( ierr /= 0 )   CALL ctl_stop( 'STOP', 'isf: failed to allocate arrays.' ) 
    184227 
    185228   END SUBROUTINE isf_alloc 
    186    ! 
     229 
    187230END MODULE isf 
Note: See TracChangeset for help on using the changeset viewer.