New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 5920 for branches/NERC/dev_r5589_is_oce_cpl/NEMOGCM/NEMO/OPA_SRC/DOM/iscplhsb.F90 – NEMO

Ignore:
Timestamp:
2015-11-25T17:58:51+01:00 (8 years ago)
Author:
mathiot
Message:

ice sheet coupling: add treshold to define grounded area, remove useless va
riable, change some variable name + add some namelist parameter

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/NERC/dev_r5589_is_oce_cpl/NEMOGCM/NEMO/OPA_SRC/DOM/iscplhsb.F90

    r5835 r5920  
    3333   !! * Substitutions   
    3434#  include "domzgr_substitute.h90"   
     35#  include "vectopt_loop_substitute.h90" 
    3536   !!---------------------------------------------------------------------- 
    3637   !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
     
    5758      REAL(wp),                     INTENT(in ) :: prdt_iscpl  !! coupling period  
    5859      !! 
    59       INTEGER :: ji, jj, jk      !! loop index 
     60      INTEGER :: ji, jj, jk                                    !! loop index 
    6061      INTEGER :: jip1, jim1, jjp1, jjm1 
    6162      !! 
    6263      REAL(wp):: summsk, zsum, zsum1, zarea, zsumn, zsumb 
    63       REAL(wp):: r1_tiscpl 
     64      REAL(wp):: r1_rdtiscpl 
    6465      REAL(wp):: zjip1_ratio  , zjim1_ratio  , zjjp1_ratio  , zjjm1_ratio 
    6566      !! 
    66       REAL(wp), DIMENSION(:,:    ), POINTER :: zde3t, zdtem, zdsal 
    67       REAL(wp), DIMENSION(:,:    ), POINTER :: zssh0   
    68       REAL(wp), DIMENSION(:,:,:  ), POINTER :: ztmp3d 
    69       ! 
    70       REAL(wp), DIMENSION(:    ), ALLOCATABLE :: zlon, zlat 
    71       REAL(wp), DIMENSION(:    ), ALLOCATABLE :: zcorr_vol, zcorr_tem, zcorr_sal 
    72       INTEGER , DIMENSION(:    ), ALLOCATABLE :: ixpts, iypts, izpts, vnpts 
     67      REAL(wp):: zde3t, zdtem, zdsal 
     68      REAL(wp), DIMENSION(:,:), POINTER :: zdssh 
     69      !! 
     70      REAL(wp), DIMENSION(:), ALLOCATABLE :: zlon, zlat 
     71      REAL(wp), DIMENSION(:), ALLOCATABLE :: zcorr_vol, zcorr_tem, zcorr_sal 
     72      INTEGER , DIMENSION(:), ALLOCATABLE :: ixpts, iypts, izpts, vnpts 
    7373      INTEGER :: jpts, npts 
    7474 
    75       CALL wrk_alloc(jpi,jpj,jpk,   ztmp3d ) 
    76       CALL wrk_alloc(jpi,jpj,       zde3t , zdtem, zdsal ) 
    77       CALL wrk_alloc(jpi,jpj,       zssh0  ) 
    78  
    79     ! get unbalance (volume heat and salt) 
    80     ! initialisation 
    81       zde3t   (:,:)     = 0.0_wp 
     75      CALL wrk_alloc(jpi,jpj, zdssh ) 
     76 
     77      ! get imbalance (volume heat and salt) 
     78      ! initialisation difference 
     79      zde3t = 0.0_wp; zdsal = 0.0_wp ; zdtem = 0.0_wp 
     80 
     81      ! initialisation correction term 
    8282      pvol_flx(:,:,:  ) = 0.0_wp 
    8383      pts_flx (:,:,:,:) = 0.0_wp 
    84       r1_tiscpl = 1._wp / (prdt_iscpl * rn_rdt)  
     84       
     85      r1_rdtiscpl = 1._wp / prdt_iscpl  
    8586 
    8687      ! mask tsn and tsb  
     
    9394 
    9495      !  
    95       zssh0(:,:)        = sshn(:,:) * ssmask(:,:) - sshb(:,:) * psmask_b(:,:) 
    96       IF ( lk_vvl ) zssh0 = 0.0_wp ! already include in the levels by definition 
     96      zdssh(:,:) = sshn(:,:) * ssmask(:,:) - sshb(:,:) * psmask_b(:,:) 
     97      IF ( lk_vvl ) zdssh = 0.0_wp ! already included in the levels by definition 
    9798       
    9899      DO jk = 1,jpk-1 
    99          DO ji = 2,jpi-1 
    100             DO jj = 2,jpj-1 
     100         DO jj = 2,jpj-1 
     101            DO ji = fs_2,fs_jpim1 
    101102               IF (tmask_h(ji,jj) == 1._wp) THEN 
    102103 
    103104                  ! volume differences 
    104                   zde3t(ji,jj) = fse3t_n(ji,jj,jk) * tmask(ji,jj,jk) - pe3t_b(ji,jj,jk) * ptmask_b(ji,jj,jk) 
     105                  zde3t = fse3t_n(ji,jj,jk) * tmask(ji,jj,jk) - pe3t_b(ji,jj,jk) * ptmask_b(ji,jj,jk) 
    105106 
    106107                  ! heat diff 
    107                   zdtem(ji,jj) = tsn(ji,jj,jk,jp_tem) * fse3t_n(ji,jj,jk) *  tmask  (ji,jj,jk)   & 
    108                                - tsb(ji,jj,jk,jp_tem) * pe3t_b (ji,jj,jk) * ptmask_b(ji,jj,jk) 
     108                  zdtem = tsn(ji,jj,jk,jp_tem) * fse3t_n(ji,jj,jk) *  tmask  (ji,jj,jk)   & 
     109                        - tsb(ji,jj,jk,jp_tem) * pe3t_b (ji,jj,jk) * ptmask_b(ji,jj,jk) 
    109110                  ! salt diff 
    110                   zdsal(ji,jj) = tsn(ji,jj,jk,jp_sal) * fse3t_n(ji,jj,jk) *  tmask  (ji,jj,jk)   & 
    111                                - tsb(ji,jj,jk,jp_sal) * pe3t_b (ji,jj,jk) * ptmask_b(ji,jj,jk) 
     111                  zdsal = tsn(ji,jj,jk,jp_sal) * fse3t_n(ji,jj,jk) *  tmask  (ji,jj,jk)   & 
     112                        - tsb(ji,jj,jk,jp_sal) * pe3t_b (ji,jj,jk) * ptmask_b(ji,jj,jk) 
    112113                
    113114                  ! shh changes 
    114115                  IF ( ptmask_b(ji,jj,jk) == 1._wp .OR. tmask(ji,jj,jk) == 1._wp ) THEN  
    115                      zde3t(ji,jj) = zde3t(ji,jj) + zssh0(ji,jj) ! zssh0 = 0 if vvl 
    116                      zssh0(ji,jj) = 0._wp 
     116                     zde3t = zde3t + zdssh(ji,jj) ! zdssh = 0 if vvl 
     117                     zdssh(ji,jj) = 0._wp 
    117118                  END IF 
    118119 
    119120                  ! volume, heat and salt differences in each cell  
    120                   pvol_flx(ji,jj,jk)       =   pvol_flx(ji,jj,jk)        + zde3t(ji,jj) * r1_tiscpl 
    121                   pts_flx (ji,jj,jk,jp_sal)=   pts_flx (ji,jj,jk,jp_sal) + zdsal(ji,jj) * r1_tiscpl  
    122                   pts_flx (ji,jj,jk,jp_tem)=   pts_flx (ji,jj,jk,jp_tem) + zdtem(ji,jj) * r1_tiscpl 
     121                  pvol_flx(ji,jj,jk)       =   pvol_flx(ji,jj,jk)        + zde3t * r1_rdtiscpl 
     122                  pts_flx (ji,jj,jk,jp_sal)=   pts_flx (ji,jj,jk,jp_sal) + zdsal * r1_rdtiscpl  
     123                  pts_flx (ji,jj,jk,jp_tem)=   pts_flx (ji,jj,jk,jp_tem) + zdtem * r1_rdtiscpl 
    123124 
    124125                  ! case where we close a cell: check if the neighbour cells are wet  
     
    192193      ! fill narea location with the number of problematic point 
    193194      DO jk = 1,jpk-1 
    194          DO ji = 2,jpi-1 
    195             DO jj = 2,jpj-1 
     195         DO jj = 2,jpj-1 
     196            DO ji = fs_2,fs_jpim1 
    196197               IF (     ptmask_b(ji,jj,jk) == 1._wp .AND. tmask(ji,jj,jk+1)  == 0._wp .AND. tmask_h(ji,jj) == 1._wp  & 
    197198                  .AND. SUM(tmask(ji-1:ji+1,jj,jk)) + SUM(tmask(ji,jj-1:jj+1,jk)) == 0._wp) THEN 
     
    218219      jpts = SUM(vnpts(1:narea-1)) 
    219220      DO jk = 1,jpk-1 
    220          DO ji = 2,jpi-1 
    221             DO jj = 2,jpj-1 
     221         DO jj = 2,jpj-1 
     222            DO ji = fs_2,fs_jpim1 
    222223               IF (     ptmask_b(ji,jj,jk) == 1._wp .AND. tmask(ji,jj,jk+1)  == 0._wp .AND. tmask_h(ji,jj) == 1._wp  & 
    223224                  .AND. SUM(tmask(ji-1:ji+1,jj,jk)) + SUM(tmask(ji,jj-1:jj+1,jk)) == 0._wp) THEN 
     
    286287 
    287288      ! deallocate variables 
    288       CALL wrk_dealloc(jpi,jpj,jpk,   ztmp3d )  
    289       CALL wrk_dealloc(jpi,jpj,       zde3t  )  
    290       CALL wrk_dealloc(jpi,jpj,       zssh0  )  
     289      CALL wrk_dealloc(jpi,jpj, zdssh )  
     290 
    291291   END SUBROUTINE iscpl_cons 
    292292 
Note: See TracChangeset for help on using the changeset viewer.