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 5837 for branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC – NEMO

Ignore:
Timestamp:
2015-10-26T15:59:39+01:00 (9 years ago)
Author:
timgraham
Message:

Upgraded to r5518 of trunk (NEMO 3.6 stable)

Location:
branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC
Files:
2 deleted
25 edited
1 copied

Legend:

Unmodified
Added
Removed
  • branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/cpl_oasis3.F90

    r3294 r5837  
    22   !!====================================================================== 
    33   !!                    ***  MODULE cpl_oasis  *** 
    4    !! Coupled O/A : coupled ocean-atmosphere case using OASIS3 V. prism_2_4 
    5    !!               special case: NEMO OPA/LIM coupled to ECHAM5 
     4   !! Coupled O/A : coupled ocean-atmosphere case using OASIS3-MCT 
    65   !!===================================================================== 
    76   !! History :    
     
    1514   !!   3.4  !  11-11  (C. Harris) Changes to allow mutiple category fields 
    1615   !!---------------------------------------------------------------------- 
     16   !!---------------------------------------------------------------------- 
     17   !!   'key_oasis3'                    coupled Ocean/Atmosphere via OASIS3-MCT 
     18   !!   'key_oa3mct_v3'                 to be added for OASIS3-MCT version 3 
     19   !!---------------------------------------------------------------------- 
     20   !!   cpl_init     : initialization of coupled mode communication 
     21   !!   cpl_define   : definition of grid and fields 
     22   !!   cpl_snd     : snd out fields in coupled mode 
     23   !!   cpl_rcv     : receive fields in coupled mode 
     24   !!   cpl_finalize : finalize the coupled mode communication 
     25   !!---------------------------------------------------------------------- 
    1726#if defined key_oasis3 
    18    !!---------------------------------------------------------------------- 
    19    !!   'key_oasis3'                    coupled Ocean/Atmosphere via OASIS3 
    20    !!---------------------------------------------------------------------- 
    21    !!   cpl_prism_init     : initialization of coupled mode communication 
    22    !!   cpl_prism_define   : definition of grid and fields 
    23    !!   cpl_prism_snd     : snd out fields in coupled mode 
    24    !!   cpl_prism_rcv     : receive fields in coupled mode 
    25    !!   cpl_prism_finalize : finalize the coupled mode communication 
    26    !!---------------------------------------------------------------------- 
    27    USE mod_prism_proto              ! OASIS3 prism module 
    28    USE mod_prism_def_partition_proto! OASIS3 prism module for partitioning 
    29    USE mod_prism_put_proto          ! OASIS3 prism module for snding 
    30    USE mod_prism_get_proto          ! OASIS3 prism module for receiving 
    31    USE mod_comprism_proto           ! OASIS3 prism module to get coupling frequency 
     27   USE mod_oasis                    ! OASIS3-MCT module 
     28#endif 
    3229   USE par_oce                      ! ocean parameters 
    3330   USE dom_oce                      ! ocean space and time domain 
     
    3835   PRIVATE 
    3936 
    40    PUBLIC   cpl_prism_init 
    41    PUBLIC   cpl_prism_define 
    42    PUBLIC   cpl_prism_snd 
    43    PUBLIC   cpl_prism_rcv 
    44    PUBLIC   cpl_prism_freq 
    45    PUBLIC   cpl_prism_finalize 
    46  
    47    LOGICAL, PUBLIC, PARAMETER ::   lk_cpl = .TRUE.   !: coupled flag 
     37   PUBLIC   cpl_init 
     38   PUBLIC   cpl_define 
     39   PUBLIC   cpl_snd 
     40   PUBLIC   cpl_rcv 
     41   PUBLIC   cpl_freq 
     42   PUBLIC   cpl_finalize 
     43 
    4844   INTEGER, PUBLIC            ::   OASIS_Rcv  = 1    !: return code if received field 
    4945   INTEGER, PUBLIC            ::   OASIS_idle = 0    !: return code if nothing done by oasis 
    50    INTEGER                    ::   ncomp_id          ! id returned by prism_init_comp 
     46   INTEGER                    ::   ncomp_id          ! id returned by oasis_init_comp 
    5147   INTEGER                    ::   nerror            ! return error code 
    52  
    53    INTEGER, PARAMETER ::   nmaxfld=40    ! Maximum number of coupling fields 
     48#if ! defined key_oasis3 
     49   ! OASIS Variables not used. defined only for compilation purpose 
     50   INTEGER                    ::   OASIS_Out         = -1 
     51   INTEGER                    ::   OASIS_REAL        = -1 
     52   INTEGER                    ::   OASIS_Ok          = -1 
     53   INTEGER                    ::   OASIS_In          = -1 
     54   INTEGER                    ::   OASIS_Sent        = -1 
     55   INTEGER                    ::   OASIS_SentOut     = -1 
     56   INTEGER                    ::   OASIS_ToRest      = -1 
     57   INTEGER                    ::   OASIS_ToRestOut   = -1 
     58   INTEGER                    ::   OASIS_Recvd       = -1 
     59   INTEGER                    ::   OASIS_RecvOut     = -1 
     60   INTEGER                    ::   OASIS_FromRest    = -1 
     61   INTEGER                    ::   OASIS_FromRestOut = -1 
     62#endif 
     63 
     64   INTEGER                    ::   nrcv         ! total number of fields received  
     65   INTEGER                    ::   nsnd         ! total number of fields sent  
     66   INTEGER                    ::   ncplmodel    ! Maximum number of models to/from which NEMO is potentialy sending/receiving data 
     67   INTEGER, PUBLIC, PARAMETER ::   nmaxfld=50   ! Maximum number of coupling fields 
     68   INTEGER, PUBLIC, PARAMETER ::   nmaxcat=5    ! Maximum number of coupling fields 
     69   INTEGER, PUBLIC, PARAMETER ::   nmaxcpl=5    ! Maximum number of coupling fields 
    5470    
    5571   TYPE, PUBLIC ::   FLD_CPL               !: Type for coupling field information 
     
    5874      CHARACTER(len = 1)    ::   clgrid    ! Grid type   
    5975      REAL(wp)              ::   nsgn      ! Control of the sign change 
    60       INTEGER, DIMENSION(9) ::   nid       ! Id of the field (no more than 9 categories) 
     76      INTEGER, DIMENSION(nmaxcat,nmaxcpl) ::   nid   ! Id of the field (no more than 9 categories and 9 extrena models) 
    6177      INTEGER               ::   nct       ! Number of categories in field 
     78      INTEGER               ::   ncplmodel ! Maximum number of models to/from which this variable may be sent/received 
    6279   END TYPE FLD_CPL 
    6380 
     
    7390CONTAINS 
    7491 
    75    SUBROUTINE cpl_prism_init( kl_comm ) 
     92   SUBROUTINE cpl_init( cd_modname, kl_comm ) 
    7693      !!------------------------------------------------------------------- 
    77       !!             ***  ROUTINE cpl_prism_init  *** 
     94      !!             ***  ROUTINE cpl_init  *** 
    7895      !! 
    7996      !! ** Purpose :   Initialize coupled mode communication for ocean 
     
    8299      !! ** Method  :   OASIS3 MPI communication  
    83100      !!-------------------------------------------------------------------- 
    84       INTEGER, INTENT(out) ::   kl_comm   ! local communicator of the model 
     101      CHARACTER(len = *), INTENT(in) ::   cd_modname   ! model name as set in namcouple file 
     102      INTEGER          , INTENT(out) ::   kl_comm      ! local communicator of the model 
    85103      !!-------------------------------------------------------------------- 
    86104 
     
    89107 
    90108      !------------------------------------------------------------------ 
    91       ! 1st Initialize the PRISM system for the application 
     109      ! 1st Initialize the OASIS system for the application 
    92110      !------------------------------------------------------------------ 
    93       CALL prism_init_comp_proto ( ncomp_id, 'oceanx', nerror ) 
    94       IF ( nerror /= PRISM_Ok ) & 
    95          CALL prism_abort_proto (ncomp_id, 'cpl_prism_init', 'Failure in prism_init_comp_proto') 
     111      CALL oasis_init_comp ( ncomp_id, TRIM(cd_modname), nerror ) 
     112      IF ( nerror /= OASIS_Ok ) & 
     113         CALL oasis_abort (ncomp_id, 'cpl_init', 'Failure in oasis_init_comp') 
    96114 
    97115      !------------------------------------------------------------------ 
     
    99117      !------------------------------------------------------------------ 
    100118 
    101       CALL prism_get_localcomm_proto ( kl_comm, nerror ) 
    102       IF ( nerror /= PRISM_Ok ) & 
    103          CALL prism_abort_proto (ncomp_id, 'cpl_prism_init','Failure in prism_get_localcomm_proto' ) 
    104       ! 
    105    END SUBROUTINE cpl_prism_init 
    106  
    107  
    108    SUBROUTINE cpl_prism_define( krcv, ksnd ) 
     119      CALL oasis_get_localcomm ( kl_comm, nerror ) 
     120      IF ( nerror /= OASIS_Ok ) & 
     121         CALL oasis_abort (ncomp_id, 'cpl_init','Failure in oasis_get_localcomm' ) 
     122      ! 
     123   END SUBROUTINE cpl_init 
     124 
     125 
     126   SUBROUTINE cpl_define( krcv, ksnd, kcplmodel ) 
    109127      !!------------------------------------------------------------------- 
    110       !!             ***  ROUTINE cpl_prism_define  *** 
     128      !!             ***  ROUTINE cpl_define  *** 
    111129      !! 
    112130      !! ** Purpose :   Define grid and field information for ocean 
     
    116134      !!-------------------------------------------------------------------- 
    117135      INTEGER, INTENT(in) ::   krcv, ksnd     ! Number of received and sent coupling fields 
     136      INTEGER, INTENT(in) ::   kcplmodel      ! Maximum number of models to/from which NEMO is potentialy sending/receiving data 
    118137      ! 
    119138      INTEGER :: id_part 
    120139      INTEGER :: paral(5)       ! OASIS3 box partition 
    121140      INTEGER :: ishape(2,2)    ! shape of arrays passed to PSMILe 
    122       INTEGER :: ji,jc          ! local loop indicees 
    123       CHARACTER(LEN=8) :: zclname 
     141      INTEGER :: ji,jc,jm       ! local loop indicees 
     142      CHARACTER(LEN=64) :: zclname 
     143      CHARACTER(LEN=2) :: cli2 
    124144      !!-------------------------------------------------------------------- 
    125145 
    126146      IF(lwp) WRITE(numout,*) 
    127       IF(lwp) WRITE(numout,*) 'cpl_prism_define : initialization in coupled ocean/atmosphere case' 
     147      IF(lwp) WRITE(numout,*) 'cpl_define : initialization in coupled ocean/atmosphere case' 
    128148      IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~~~~' 
    129149      IF(lwp) WRITE(numout,*) 
     150 
     151      ncplmodel = kcplmodel 
     152      IF( kcplmodel > nmaxcpl ) THEN 
     153         CALL oasis_abort ( ncomp_id, 'cpl_define', 'ncplmodel is larger than nmaxcpl, increase nmaxcpl')   ;   RETURN 
     154      ENDIF 
     155 
     156      nrcv = krcv 
     157      IF( nrcv > nmaxfld ) THEN 
     158         CALL oasis_abort ( ncomp_id, 'cpl_define', 'nrcv is larger than nmaxfld, increase nmaxfld')   ;   RETURN 
     159      ENDIF 
     160 
     161      nsnd = ksnd 
     162      IF( nsnd > nmaxfld ) THEN 
     163         CALL oasis_abort ( ncomp_id, 'cpl_define', 'nsnd is larger than nmaxfld, increase nmaxfld')   ;   RETURN 
     164      ENDIF 
    130165 
    131166      ! 
     
    141176      ALLOCATE(exfld(nlei-nldi+1, nlej-nldj+1), stat = nerror) 
    142177      IF( nerror > 0 ) THEN 
    143          CALL prism_abort_proto ( ncomp_id, 'cpl_prism_define', 'Failure in allocating exfld')   ;   RETURN 
     178         CALL oasis_abort ( ncomp_id, 'cpl_define', 'Failure in allocating exfld')   ;   RETURN 
    144179      ENDIF 
    145180      ! 
     
    161196      ENDIF 
    162197       
    163       CALL prism_def_partition_proto ( id_part, paral, nerror ) 
     198      CALL oasis_def_partition ( id_part, paral, nerror ) 
    164199      ! 
    165200      ! ... Announce send variables.  
    166201      ! 
     202      ssnd(:)%ncplmodel = kcplmodel 
     203      ! 
    167204      DO ji = 1, ksnd 
    168          IF ( ssnd(ji)%laction ) THEN  
     205         IF ( ssnd(ji)%laction ) THEN 
     206 
     207            IF( ssnd(ji)%nct > nmaxcat ) THEN 
     208               CALL oasis_abort ( ncomp_id, 'cpl_define', 'Number of categories of '//   & 
     209                  &              TRIM(ssnd(ji)%clname)//' is larger than nmaxcat, increase nmaxcat' ) 
     210               RETURN 
     211            ENDIF 
     212             
    169213            DO jc = 1, ssnd(ji)%nct 
    170                IF ( ssnd(ji)%nct .gt. 1 ) THEN 
    171                   WRITE(zclname,'( a7, i1)') ssnd(ji)%clname,jc 
    172                ELSE 
    173                   zclname=ssnd(ji)%clname 
    174                ENDIF 
    175                WRITE(numout,*) "Define",ji,jc,zclname," for",PRISM_Out 
    176                CALL prism_def_var_proto (ssnd(ji)%nid(jc), zclname, id_part, (/ 2, 0/),   & 
    177                     PRISM_Out, ishape, PRISM_REAL, nerror) 
    178                IF ( nerror /= PRISM_Ok ) THEN 
    179                   WRITE(numout,*) 'Failed to define transient ', ji, TRIM(zclname) 
    180                   CALL prism_abort_proto ( ssnd(ji)%nid(jc), 'cpl_prism_define', 'Failure in prism_def_var') 
    181                ENDIF 
     214               DO jm = 1, kcplmodel 
     215 
     216                  IF ( ssnd(ji)%nct .GT. 1 ) THEN 
     217                     WRITE(cli2,'(i2.2)') jc 
     218                     zclname = TRIM(ssnd(ji)%clname)//'_cat'//cli2 
     219                  ELSE 
     220                     zclname = ssnd(ji)%clname 
     221                  ENDIF 
     222                  IF ( kcplmodel  > 1 ) THEN 
     223                     WRITE(cli2,'(i2.2)') jm 
     224                     zclname = 'model'//cli2//'_'//TRIM(zclname) 
     225                  ENDIF 
     226#if defined key_agrif 
     227                  IF( agrif_fixed() /= 0 ) THEN  
     228                     zclname=TRIM(Agrif_CFixed())//'_'//TRIM(zclname) 
     229                  END IF 
     230#endif 
     231                  IF( ln_ctl ) WRITE(numout,*) "Define", ji, jc, jm, " "//TRIM(zclname), " for ", OASIS_Out 
     232                  CALL oasis_def_var (ssnd(ji)%nid(jc,jm), zclname, id_part   , (/ 2, 0 /),   & 
     233                     &                OASIS_Out          , ishape , OASIS_REAL, nerror ) 
     234                  IF ( nerror /= OASIS_Ok ) THEN 
     235                     WRITE(numout,*) 'Failed to define transient ', ji, jc, jm, " "//TRIM(zclname) 
     236                     CALL oasis_abort ( ssnd(ji)%nid(jc,jm), 'cpl_define', 'Failure in oasis_def_var' ) 
     237                  ENDIF 
     238                  IF( ln_ctl .AND. ssnd(ji)%nid(jc,jm) /= -1 ) WRITE(numout,*) "variable defined in the namcouple" 
     239                  IF( ln_ctl .AND. ssnd(ji)%nid(jc,jm) == -1 ) WRITE(numout,*) "variable NOT defined in the namcouple" 
     240               END DO 
    182241            END DO 
    183242         ENDIF 
     
    186245      ! ... Announce received variables.  
    187246      ! 
     247      srcv(:)%ncplmodel = kcplmodel 
     248      ! 
    188249      DO ji = 1, krcv 
    189250         IF ( srcv(ji)%laction ) THEN  
     251             
     252            IF( srcv(ji)%nct > nmaxcat ) THEN 
     253               CALL oasis_abort ( ncomp_id, 'cpl_define', 'Number of categories of '//   & 
     254                  &              TRIM(srcv(ji)%clname)//' is larger than nmaxcat, increase nmaxcat' ) 
     255               RETURN 
     256            ENDIF 
     257             
    190258            DO jc = 1, srcv(ji)%nct 
    191                IF ( srcv(ji)%nct .gt. 1 ) THEN 
    192                   WRITE(zclname,'( a7, i1)') srcv(ji)%clname,jc 
    193                ELSE 
    194                   zclname=srcv(ji)%clname 
    195                ENDIF 
    196                WRITE(numout,*) "Define",ji,jc,zclname," for",PRISM_In 
    197                CALL prism_def_var_proto ( srcv(ji)%nid(jc), zclname, id_part, (/ 2, 0/),   & 
    198                     &                      PRISM_In    , ishape   , PRISM_REAL, nerror) 
    199                IF ( nerror /= PRISM_Ok ) THEN 
    200                   WRITE(numout,*) 'Failed to define transient ', ji, TRIM(zclname) 
    201                   CALL prism_abort_proto ( srcv(ji)%nid(jc), 'cpl_prism_define', 'Failure in prism_def_var') 
    202                ENDIF 
     259               DO jm = 1, kcplmodel 
     260                   
     261                  IF ( srcv(ji)%nct .GT. 1 ) THEN 
     262                     WRITE(cli2,'(i2.2)') jc 
     263                     zclname = TRIM(srcv(ji)%clname)//'_cat'//cli2 
     264                  ELSE 
     265                     zclname = srcv(ji)%clname 
     266                  ENDIF 
     267                  IF ( kcplmodel  > 1 ) THEN 
     268                     WRITE(cli2,'(i2.2)') jm 
     269                     zclname = 'model'//cli2//'_'//TRIM(zclname) 
     270                  ENDIF 
     271#if defined key_agrif 
     272                  IF( agrif_fixed() /= 0 ) THEN  
     273                     zclname=TRIM(Agrif_CFixed())//'_'//TRIM(zclname) 
     274                  END IF 
     275#endif 
     276                  IF( ln_ctl ) WRITE(numout,*) "Define", ji, jc, jm, " "//TRIM(zclname), " for ", OASIS_In 
     277                  CALL oasis_def_var (srcv(ji)%nid(jc,jm), zclname, id_part   , (/ 2, 0 /),   & 
     278                     &                OASIS_In           , ishape , OASIS_REAL, nerror ) 
     279                  IF ( nerror /= OASIS_Ok ) THEN 
     280                     WRITE(numout,*) 'Failed to define transient ', ji, jc, jm, " "//TRIM(zclname) 
     281                     CALL oasis_abort ( srcv(ji)%nid(jc,jm), 'cpl_define', 'Failure in oasis_def_var' ) 
     282                  ENDIF 
     283                  IF( ln_ctl .AND. srcv(ji)%nid(jc,jm) /= -1 ) WRITE(numout,*) "variable defined in the namcouple" 
     284                  IF( ln_ctl .AND. srcv(ji)%nid(jc,jm) == -1 ) WRITE(numout,*) "variable NOT defined in the namcouple" 
     285 
     286               END DO 
    203287            END DO 
    204288         ENDIF 
     
    209293      !------------------------------------------------------------------ 
    210294       
    211       CALL prism_enddef_proto(nerror) 
    212       IF( nerror /= PRISM_Ok )   CALL prism_abort_proto ( ncomp_id, 'cpl_prism_define', 'Failure in prism_enddef') 
    213       ! 
    214    END SUBROUTINE cpl_prism_define 
     295      CALL oasis_enddef(nerror) 
     296      IF( nerror /= OASIS_Ok )   CALL oasis_abort ( ncomp_id, 'cpl_define', 'Failure in oasis_enddef') 
     297      ! 
     298   END SUBROUTINE cpl_define 
    215299    
    216300    
    217    SUBROUTINE cpl_prism_snd( kid, kstep, pdata, kinfo ) 
     301   SUBROUTINE cpl_snd( kid, kstep, pdata, kinfo ) 
    218302      !!--------------------------------------------------------------------- 
    219       !!              ***  ROUTINE cpl_prism_snd  *** 
     303      !!              ***  ROUTINE cpl_snd  *** 
    220304      !! 
    221305      !! ** Purpose : - At each coupling time-step,this routine sends fields 
     
    227311      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   pdata 
    228312      !! 
    229       INTEGER                                   ::   jc        ! local loop index 
     313      INTEGER                                   ::   jc,jm     ! local loop index 
    230314      !!-------------------------------------------------------------------- 
    231315      ! 
     
    233317      ! 
    234318      DO jc = 1, ssnd(kid)%nct 
    235  
    236          CALL prism_put_proto ( ssnd(kid)%nid(jc), kstep, pdata(nldi:nlei, nldj:nlej,jc), kinfo ) 
    237           
    238          IF ( ln_ctl ) THEN         
    239             IF ( kinfo == PRISM_Sent     .OR. kinfo == PRISM_ToRest .OR.   & 
    240                  & kinfo == PRISM_SentOut  .OR. kinfo == PRISM_ToRestOut ) THEN 
    241                WRITE(numout,*) '****************' 
    242                WRITE(numout,*) 'prism_put_proto: Outgoing ', ssnd(kid)%clname 
    243                WRITE(numout,*) 'prism_put_proto: ivarid ', ssnd(kid)%nid(jc) 
    244                WRITE(numout,*) 'prism_put_proto:  kstep ', kstep 
    245                WRITE(numout,*) 'prism_put_proto:   info ', kinfo 
    246                WRITE(numout,*) '     - Minimum value is ', MINVAL(pdata(:,:,jc)) 
    247                WRITE(numout,*) '     - Maximum value is ', MAXVAL(pdata(:,:,jc)) 
    248                WRITE(numout,*) '     -     Sum value is ', SUM(pdata(:,:,jc)) 
    249                WRITE(numout,*) '****************' 
     319         DO jm = 1, ssnd(kid)%ncplmodel 
     320         
     321            IF( ssnd(kid)%nid(jc,jm) /= -1 ) THEN 
     322               CALL oasis_put ( ssnd(kid)%nid(jc,jm), kstep, pdata(nldi:nlei, nldj:nlej,jc), kinfo ) 
     323                
     324               IF ( ln_ctl ) THEN         
     325                  IF ( kinfo == OASIS_Sent     .OR. kinfo == OASIS_ToRest .OR.   & 
     326                     & kinfo == OASIS_SentOut  .OR. kinfo == OASIS_ToRestOut ) THEN 
     327                     WRITE(numout,*) '****************' 
     328                     WRITE(numout,*) 'oasis_put: Outgoing ', ssnd(kid)%clname 
     329                     WRITE(numout,*) 'oasis_put: ivarid ', ssnd(kid)%nid(jc,jm) 
     330                     WRITE(numout,*) 'oasis_put:  kstep ', kstep 
     331                     WRITE(numout,*) 'oasis_put:   info ', kinfo 
     332                     WRITE(numout,*) '     - Minimum value is ', MINVAL(pdata(:,:,jc)) 
     333                     WRITE(numout,*) '     - Maximum value is ', MAXVAL(pdata(:,:,jc)) 
     334                     WRITE(numout,*) '     -     Sum value is ', SUM(pdata(:,:,jc)) 
     335                     WRITE(numout,*) '****************' 
     336                  ENDIF 
     337               ENDIF 
     338                
    250339            ENDIF 
    251          ENDIF 
    252  
     340             
     341         ENDDO 
    253342      ENDDO 
    254343      ! 
    255     END SUBROUTINE cpl_prism_snd 
    256  
    257  
    258    SUBROUTINE cpl_prism_rcv( kid, kstep, pdata, kinfo ) 
     344    END SUBROUTINE cpl_snd 
     345 
     346 
     347   SUBROUTINE cpl_rcv( kid, kstep, pdata, pmask, kinfo ) 
    259348      !!--------------------------------------------------------------------- 
    260       !!              ***  ROUTINE cpl_prism_rcv  *** 
     349      !!              ***  ROUTINE cpl_rcv  *** 
    261350      !! 
    262351      !! ** Purpose : - At each coupling time-step,this routine receives fields 
     
    266355      INTEGER                   , INTENT(in   ) ::   kstep     ! ocean time-step in seconds 
    267356      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   pdata     ! IN to keep the value if nothing is done 
     357      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   pmask     ! coupling mask 
    268358      INTEGER                   , INTENT(  out) ::   kinfo     ! OASIS3 info argument 
    269359      !! 
    270       INTEGER                                   ::   jc        ! local loop index 
    271       LOGICAL                                   ::   llaction 
     360      INTEGER                                   ::   jc,jm     ! local loop index 
     361      LOGICAL                                   ::   llaction, llfisrt 
    272362      !!-------------------------------------------------------------------- 
    273363      ! 
    274364      ! receive local data from OASIS3 on every process 
    275365      ! 
     366      kinfo = OASIS_idle 
     367      ! 
    276368      DO jc = 1, srcv(kid)%nct 
    277  
    278          CALL prism_get_proto ( srcv(kid)%nid(jc), kstep, exfld, kinfo )          
    279           
    280          llaction = .false. 
    281          IF( kinfo == PRISM_Recvd   .OR. kinfo == PRISM_FromRest .OR.   & 
    282               kinfo == PRISM_RecvOut .OR. kinfo == PRISM_FromRestOut )   llaction = .TRUE. 
    283           
    284          IF ( ln_ctl )   WRITE(numout,*) "llaction, kinfo, kstep, ivarid: " , llaction, kinfo, kstep, srcv(kid)%nid(jc) 
    285           
    286          IF ( llaction ) THEN 
    287              
    288             kinfo = OASIS_Rcv 
    289             pdata(nldi:nlei, nldj:nlej,jc) = exfld(:,:) 
    290              
    291             !--- Fill the overlap areas and extra hallows (mpp) 
    292             !--- check periodicity conditions (all cases) 
    293             CALL lbc_lnk( pdata(:,:,jc), srcv(kid)%clgrid, srcv(kid)%nsgn )    
    294              
    295             IF ( ln_ctl ) THEN         
    296                WRITE(numout,*) '****************' 
    297                WRITE(numout,*) 'prism_get_proto: Incoming ', srcv(kid)%clname 
    298                WRITE(numout,*) 'prism_get_proto: ivarid '  , srcv(kid)%nid(jc) 
    299                WRITE(numout,*) 'prism_get_proto:   kstep', kstep 
    300                WRITE(numout,*) 'prism_get_proto:   info ', kinfo 
    301                WRITE(numout,*) '     - Minimum value is ', MINVAL(pdata(:,:,jc)) 
    302                WRITE(numout,*) '     - Maximum value is ', MAXVAL(pdata(:,:,jc)) 
    303                WRITE(numout,*) '     -     Sum value is ', SUM(pdata(:,:,jc)) 
    304                WRITE(numout,*) '****************' 
     369         llfisrt = .TRUE. 
     370 
     371         DO jm = 1, srcv(kid)%ncplmodel 
     372 
     373            IF( srcv(kid)%nid(jc,jm) /= -1 ) THEN 
     374 
     375               CALL oasis_get ( srcv(kid)%nid(jc,jm), kstep, exfld, kinfo )          
     376                
     377               llaction =  kinfo == OASIS_Recvd   .OR. kinfo == OASIS_FromRest .OR.   & 
     378                  &        kinfo == OASIS_RecvOut .OR. kinfo == OASIS_FromRestOut 
     379                
     380               IF ( ln_ctl )   WRITE(numout,*) "llaction, kinfo, kstep, ivarid: " , llaction, kinfo, kstep, srcv(kid)%nid(jc,jm) 
     381                
     382               IF ( llaction ) THEN 
     383                   
     384                  kinfo = OASIS_Rcv 
     385                  IF( llfisrt ) THEN  
     386                     pdata(nldi:nlei,nldj:nlej,jc) =                                 exfld(:,:) * pmask(nldi:nlei,nldj:nlej,jm) 
     387                     llfisrt = .FALSE. 
     388                  ELSE 
     389                     pdata(nldi:nlei,nldj:nlej,jc) = pdata(nldi:nlei,nldj:nlej,jc) + exfld(:,:) * pmask(nldi:nlei,nldj:nlej,jm) 
     390                  ENDIF 
     391                   
     392                  IF ( ln_ctl ) THEN         
     393                     WRITE(numout,*) '****************' 
     394                     WRITE(numout,*) 'oasis_get: Incoming ', srcv(kid)%clname 
     395                     WRITE(numout,*) 'oasis_get: ivarid '  , srcv(kid)%nid(jc,jm) 
     396                     WRITE(numout,*) 'oasis_get:   kstep', kstep 
     397                     WRITE(numout,*) 'oasis_get:   info ', kinfo 
     398                     WRITE(numout,*) '     - Minimum value is ', MINVAL(pdata(:,:,jc)) 
     399                     WRITE(numout,*) '     - Maximum value is ', MAXVAL(pdata(:,:,jc)) 
     400                     WRITE(numout,*) '     -     Sum value is ', SUM(pdata(:,:,jc)) 
     401                     WRITE(numout,*) '****************' 
     402                  ENDIF 
     403                   
     404               ENDIF 
     405                
    305406            ENDIF 
    306407             
    307          ELSE 
    308             kinfo = OASIS_idle      
    309          ENDIF 
    310           
     408         ENDDO 
     409 
     410         !--- Fill the overlap areas and extra hallows (mpp) 
     411         !--- check periodicity conditions (all cases) 
     412         IF( .not. llfisrt )   CALL lbc_lnk( pdata(:,:,jc), srcv(kid)%clgrid, srcv(kid)%nsgn )    
     413  
    311414      ENDDO 
    312415      ! 
    313    END SUBROUTINE cpl_prism_rcv 
    314  
    315  
    316    INTEGER FUNCTION cpl_prism_freq( kid 
     416   END SUBROUTINE cpl_rcv 
     417 
     418 
     419   INTEGER FUNCTION cpl_freq( cdfieldname 
    317420      !!--------------------------------------------------------------------- 
    318       !!              ***  ROUTINE cpl_prism_freq  *** 
     421      !!              ***  ROUTINE cpl_freq  *** 
    319422      !! 
    320423      !! ** Purpose : - send back the coupling frequency for a particular field 
    321424      !!---------------------------------------------------------------------- 
    322       INTEGER,INTENT(in) ::   kid   ! variable index  
     425      CHARACTER(len = *), INTENT(in) ::   cdfieldname    ! field name as set in namcouple file 
     426      !! 
     427      INTEGER               :: id 
     428      INTEGER               :: info 
     429      INTEGER, DIMENSION(1) :: itmp 
     430      INTEGER               :: ji,jm     ! local loop index 
     431      INTEGER               :: mop 
    323432      !!---------------------------------------------------------------------- 
    324       cpl_prism_freq = ig_def_freq( kid ) 
    325       ! 
    326    END FUNCTION cpl_prism_freq 
    327  
    328  
    329    SUBROUTINE cpl_prism_finalize 
     433      cpl_freq = 0   ! defaut definition 
     434      id = -1        ! defaut definition 
     435      ! 
     436      DO ji = 1, nsnd 
     437         IF (ssnd(ji)%laction ) THEN 
     438            DO jm = 1, ncplmodel 
     439               IF( ssnd(ji)%nid(1,jm) /= -1 ) THEN 
     440                  IF( TRIM(cdfieldname) == TRIM(ssnd(ji)%clname) ) THEN 
     441                     id = ssnd(ji)%nid(1,jm) 
     442                     mop = OASIS_Out 
     443                  ENDIF 
     444               ENDIF 
     445            ENDDO 
     446         ENDIF 
     447      ENDDO 
     448      DO ji = 1, nrcv 
     449         IF (srcv(ji)%laction ) THEN 
     450            DO jm = 1, ncplmodel 
     451               IF( srcv(ji)%nid(1,jm) /= -1 ) THEN 
     452                  IF( TRIM(cdfieldname) == TRIM(srcv(ji)%clname) ) THEN 
     453                     id = srcv(ji)%nid(1,jm) 
     454                     mop = OASIS_In 
     455                  ENDIF 
     456               ENDIF 
     457            ENDDO 
     458         ENDIF 
     459      ENDDO 
     460      ! 
     461      IF( id /= -1 ) THEN 
     462#if defined key_oa3mct_v3 
     463         CALL oasis_get_freqs(id, mop, 1, itmp, info) 
     464#else 
     465         CALL oasis_get_freqs(id,      1, itmp, info) 
     466#endif 
     467         cpl_freq = itmp(1) 
     468      ENDIF 
     469      ! 
     470   END FUNCTION cpl_freq 
     471 
     472 
     473   SUBROUTINE cpl_finalize 
    330474      !!--------------------------------------------------------------------- 
    331       !!              ***  ROUTINE cpl_prism_finalize  *** 
     475      !!              ***  ROUTINE cpl_finalize  *** 
    332476      !! 
    333477      !! ** Purpose : - Finalizes the coupling. If MPI_init has not been 
    334       !!      called explicitly before cpl_prism_init it will also close 
     478      !!      called explicitly before cpl_init it will also close 
    335479      !!      MPI communication. 
    336480      !!---------------------------------------------------------------------- 
    337481      ! 
    338482      DEALLOCATE( exfld ) 
    339       CALL prism_terminate_proto( nerror )          
    340       ! 
    341    END SUBROUTINE cpl_prism_finalize 
    342  
    343 #else 
    344    !!---------------------------------------------------------------------- 
    345    !!   Default case          Dummy module          Forced Ocean/Atmosphere 
    346    !!---------------------------------------------------------------------- 
    347    USE in_out_manager               ! I/O manager 
    348    LOGICAL, PUBLIC, PARAMETER :: lk_cpl = .FALSE.   !: coupled flag 
    349    PUBLIC cpl_prism_init 
    350    PUBLIC cpl_prism_finalize 
    351 CONTAINS 
    352    SUBROUTINE cpl_prism_init (kl_comm)  
    353       INTEGER, INTENT(out)   :: kl_comm       ! local communicator of the model 
    354       kl_comm = -1 
    355       WRITE(numout,*) 'cpl_prism_init: Error you sould not be there...' 
    356    END SUBROUTINE cpl_prism_init 
    357    SUBROUTINE cpl_prism_finalize 
    358       WRITE(numout,*) 'cpl_prism_finalize: Error you sould not be there...' 
    359    END SUBROUTINE cpl_prism_finalize 
     483      IF (nstop == 0) THEN 
     484         CALL oasis_terminate( nerror )          
     485      ELSE 
     486         CALL oasis_abort( ncomp_id, "cpl_finalize", "NEMO ABORT STOP" ) 
     487      ENDIF        
     488      ! 
     489   END SUBROUTINE cpl_finalize 
     490 
     491#if ! defined key_oasis3 
     492 
     493   !!---------------------------------------------------------------------- 
     494   !!   No OASIS Library          OASIS3 Dummy module... 
     495   !!---------------------------------------------------------------------- 
     496 
     497   SUBROUTINE oasis_init_comp(k1,cd1,k2) 
     498      CHARACTER(*), INTENT(in   ) ::  cd1 
     499      INTEGER     , INTENT(  out) ::  k1,k2 
     500      k1 = -1 ; k2 = -1 
     501      WRITE(numout,*) 'oasis_init_comp: Error you sould not be there...', cd1 
     502   END SUBROUTINE oasis_init_comp 
     503 
     504   SUBROUTINE oasis_abort(k1,cd1,cd2) 
     505      INTEGER     , INTENT(in   ) ::  k1 
     506      CHARACTER(*), INTENT(in   ) ::  cd1,cd2 
     507      WRITE(numout,*) 'oasis_abort: Error you sould not be there...', cd1, cd2 
     508   END SUBROUTINE oasis_abort 
     509 
     510   SUBROUTINE oasis_get_localcomm(k1,k2) 
     511      INTEGER     , INTENT(  out) ::  k1,k2 
     512      k1 = -1 ; k2 = -1 
     513      WRITE(numout,*) 'oasis_get_localcomm: Error you sould not be there...' 
     514   END SUBROUTINE oasis_get_localcomm 
     515 
     516   SUBROUTINE oasis_def_partition(k1,k2,k3) 
     517      INTEGER     , INTENT(  out) ::  k1,k3 
     518      INTEGER     , INTENT(in   ) ::  k2(5) 
     519      k1 = k2(1) ; k3 = k2(5) 
     520      WRITE(numout,*) 'oasis_def_partition: Error you sould not be there...' 
     521   END SUBROUTINE oasis_def_partition 
     522 
     523   SUBROUTINE oasis_def_var(k1,cd1,k2,k3,k4,k5,k6,k7) 
     524      CHARACTER(*), INTENT(in   ) ::  cd1 
     525      INTEGER     , INTENT(in   ) ::  k2,k3(2),k4,k5(2,2),k6 
     526      INTEGER     , INTENT(  out) ::  k1,k7 
     527      k1 = -1 ; k7 = -1 
     528      WRITE(numout,*) 'oasis_def_var: Error you sould not be there...', cd1 
     529   END SUBROUTINE oasis_def_var 
     530 
     531   SUBROUTINE oasis_enddef(k1) 
     532      INTEGER     , INTENT(  out) ::  k1 
     533      k1 = -1 
     534      WRITE(numout,*) 'oasis_enddef: Error you sould not be there...' 
     535   END SUBROUTINE oasis_enddef 
     536   
     537   SUBROUTINE oasis_put(k1,k2,p1,k3) 
     538      REAL(wp), DIMENSION(:,:), INTENT(in   ) ::  p1 
     539      INTEGER                 , INTENT(in   ) ::  k1,k2 
     540      INTEGER                 , INTENT(  out) ::  k3 
     541      k3 = -1 
     542      WRITE(numout,*) 'oasis_put: Error you sould not be there...' 
     543   END SUBROUTINE oasis_put 
     544 
     545   SUBROUTINE oasis_get(k1,k2,p1,k3) 
     546      REAL(wp), DIMENSION(:,:), INTENT(  out) ::  p1 
     547      INTEGER                 , INTENT(in   ) ::  k1,k2 
     548      INTEGER                 , INTENT(  out) ::  k3 
     549      p1(1,1) = -1. ; k3 = -1 
     550      WRITE(numout,*) 'oasis_get: Error you sould not be there...' 
     551   END SUBROUTINE oasis_get 
     552 
     553   SUBROUTINE oasis_get_freqs(k1,k2,k3,k4) 
     554      INTEGER              , INTENT(in   ) ::  k1,k2 
     555      INTEGER, DIMENSION(1), INTENT(  out) ::  k3 
     556      INTEGER              , INTENT(  out) ::  k4 
     557      k3(1) = k1 ; k4 = k2 
     558      WRITE(numout,*) 'oasis_get_freqs: Error you sould not be there...' 
     559   END SUBROUTINE oasis_get_freqs 
     560 
     561   SUBROUTINE oasis_terminate(k1) 
     562      INTEGER     , INTENT(  out) ::  k1 
     563      k1 = -1 
     564      WRITE(numout,*) 'oasis_terminate: Error you sould not be there...' 
     565   END SUBROUTINE oasis_terminate 
     566    
    360567#endif 
    361568 
  • branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/cyclone.F90

    • Property svn:keywords set to Id
    r4230 r5837  
    4141   !!---------------------------------------------------------------------- 
    4242   !! NEMO/OPA 3.3 , LOCEAN-IPSL (2010)  
    43    !! $Id: module_example 1146 2008-06-25 11:42:56Z rblod $  
     43   !! $Id$  
    4444   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 
    4545   !!---------------------------------------------------------------------- 
  • branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/fldread.F90

    r4371 r5837  
    4040      LOGICAL              ::   ln_clim     ! climatology or not (T/F) 
    4141      CHARACTER(len = 8)   ::   cltype      ! type of data file 'daily', 'monthly' or yearly' 
    42       CHARACTER(len = 34) ::   wname       ! generic name of a NetCDF weights file to be used, blank if not 
     42      CHARACTER(len = 256) ::   wname       ! generic name of a NetCDF weights file to be used, blank if not 
    4343      CHARACTER(len = 34)  ::   vcomp       ! symbolic component name if a vector that needs rotation 
    4444      !                                     ! a string starting with "U" or "V" for each component    
     
    6969   END TYPE FLD 
    7070 
    71    TYPE, PUBLIC ::   MAP_POINTER      !: Array of integer pointers to 1D arrays 
    72       INTEGER, POINTER   ::  ptr(:) 
     71   TYPE, PUBLIC ::   MAP_POINTER      !: Map from input data file to local domain 
     72      INTEGER, POINTER, DIMENSION(:)  ::  ptr           ! Array of integer pointers to 1D arrays 
     73      LOGICAL                         ::  ll_unstruc    ! Unstructured (T) or structured (F) boundary data file 
    7374   END TYPE MAP_POINTER 
    7475 
     
    153154      IF( PRESENT(kit) )   ll_firstcall = ll_firstcall .and. kit == 1 
    154155 
    155       it_offset = 0 
     156      IF ( nn_components == jp_iam_sas ) THEN   ;   it_offset = nn_fsbc 
     157      ELSE                                      ;   it_offset = 0 
     158      ENDIF 
    156159      IF( PRESENT(kt_offset) )   it_offset = kt_offset 
    157160 
     
    451454      ENDIF 
    452455      ! 
    453       it_offset = 0 
     456      IF ( nn_components == jp_iam_sas ) THEN   ;   it_offset = nn_fsbc 
     457      ELSE                                      ;   it_offset = 0 
     458      ENDIF 
    454459      IF( PRESENT(kt_offset) )   it_offset = kt_offset 
    455460      IF( PRESENT(kit) ) THEN   ;   it_offset = ( kit + it_offset ) * NINT( rdt/REAL(nn_baro,wp) ) 
     
    473478            !       forcing record :    1  
    474479            !                             
    475             ztmp = REAL( nday, wp ) / REAL( nyear_len(1), wp ) + 0.5 + REAL( it_offset, wp ) 
     480            ztmp = REAL( nsec_year, wp ) / ( REAL( nyear_len(1), wp ) * rday ) + 0.5 & 
     481           &       + REAL( it_offset, wp ) / ( REAL( nyear_len(1), wp ) * rday ) 
    476482            sdjf%nrec_a(1) = 1 + INT( ztmp ) - COUNT((/llbefore/)) 
    477483            ! swap at the middle of the year 
    478             IF( llbefore ) THEN   ;   sdjf%nrec_a(2) = nsec1jan000 - NINT(0.5 * rday) * nyear_len(0) 
    479             ELSE                  ;   sdjf%nrec_a(2) = nsec1jan000 + NINT(0.5 * rday) * nyear_len(1)    
     484            IF( llbefore ) THEN   ;   sdjf%nrec_a(2) = nsec1jan000 - (1 - INT(ztmp)) * NINT(0.5 * rday) * nyear_len(0) + & 
     485                                    & INT(ztmp) * NINT( 0.5 * rday) * nyear_len(1)  
     486            ELSE                  ;   sdjf%nrec_a(2) = nsec1jan000 + (1 - INT(ztmp)) * NINT(0.5 * rday) * nyear_len(1) + & 
     487                                    & INT(ztmp) * INT(rday) * nyear_len(1) + INT(ztmp) * NINT( 0.5 * rday) * nyear_len(2)  
    480488            ENDIF 
    481489         ELSE                                    ! no time interpolation 
     
    501509            !       forcing record :  nmonth  
    502510            !                             
    503             ztmp = REAL( nday, wp ) / REAL( nmonth_len(nmonth), wp ) + 0.5 + REAL( it_offset, wp ) 
     511            ztmp = REAL( nsec_month, wp ) / ( REAL( nmonth_len(nmonth), wp ) * rday ) + 0.5 & 
     512           &       + REAL( it_offset, wp ) / ( REAL( nmonth_len(nmonth), wp ) * rday ) 
    504513            imth = nmonth + INT( ztmp ) - COUNT((/llbefore/)) 
    505514            IF( sdjf%cltype == 'monthly' ) THEN   ;   sdjf%nrec_a(1) = 1 + INT( ztmp ) - COUNT((/llbefore/)) 
     
    597606      ! 
    598607      IF( ASSOCIATED(map%ptr) ) THEN 
    599          IF( sdjf%ln_tint ) THEN   ;   CALL fld_map( sdjf%num, sdjf%clvar, sdjf%fdta(:,:,:,2), sdjf%nrec_a(1), map%ptr ) 
    600          ELSE                      ;   CALL fld_map( sdjf%num, sdjf%clvar, sdjf%fnow(:,:,:  ), sdjf%nrec_a(1), map%ptr ) 
     608         IF( sdjf%ln_tint ) THEN   ;   CALL fld_map( sdjf%num, sdjf%clvar, sdjf%fdta(:,:,:,2), sdjf%nrec_a(1), map ) 
     609         ELSE                      ;   CALL fld_map( sdjf%num, sdjf%clvar, sdjf%fnow(:,:,:  ), sdjf%nrec_a(1), map ) 
    601610         ENDIF 
    602611      ELSE IF( LEN(TRIM(sdjf%wgtname)) > 0 ) THEN 
     
    668677      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   dta   ! output field on model grid (2 dimensional) 
    669678      INTEGER                   , INTENT(in ) ::   nrec    ! record number to read (ie time slice) 
    670       INTEGER,  DIMENSION(:)    , INTENT(in ) ::   map     ! global-to-local mapping indices 
     679      TYPE(MAP_POINTER)         , INTENT(in ) ::   map     ! global-to-local mapping indices 
    671680      !! 
    672681      INTEGER                                 ::   ipi      ! length of boundary data on local process 
     
    689698#if defined key_bdy 
    690699      ipj = iom_file(num)%dimsz(2,idvar) 
    691       IF (ipj == 1) THEN ! we assume that this is a structured open boundary file 
     700      IF ( map%ll_unstruc) THEN ! unstructured open boundary data file 
    692701         dta_read => dta_global 
    693       ELSE 
     702      ELSE                      ! structured open boundary data file 
    694703         dta_read => dta_global2 
    695704      ENDIF 
     
    704713      END SELECT 
    705714      ! 
    706       IF (ipj==1) THEN 
     715      IF ( map%ll_unstruc ) THEN ! unstructured open boundary data file 
    707716         DO ib = 1, ipi 
    708717            DO ik = 1, ipk 
    709                dta(ib,1,ik) =  dta_read(map(ib),1,ik) 
     718               dta(ib,1,ik) =  dta_read(map%ptr(ib),1,ik) 
    710719            END DO 
    711720         END DO 
    712       ELSE ! we assume that this is a structured open boundary file 
     721      ELSE                       ! structured open boundary data file 
    713722         DO ib = 1, ipi 
    714             jj=1+floor(REAL(map(ib)-1)/REAL(ilendta)) 
    715             ji=map(ib)-(jj-1)*ilendta 
     723            jj=1+floor(REAL(map%ptr(ib)-1)/REAL(ilendta)) 
     724            ji=map%ptr(ib)-(jj-1)*ilendta 
    716725            DO ik = 1, ipk 
    717726               dta(ib,1,ik) =  dta_read(ji,jj,ik) 
     
    10161025      INTEGER                           ::   ipk           ! temporary vertical dimension 
    10171026      CHARACTER (len=5)                 ::   aname 
    1018       INTEGER , DIMENSION(3)            ::   ddims 
     1027      INTEGER , DIMENSION(:), ALLOCATABLE ::   ddims 
    10191028      INTEGER , POINTER, DIMENSION(:,:) ::   data_src 
    10201029      REAL(wp), POINTER, DIMENSION(:,:) ::   data_tmp 
     
    10391048 
    10401049      !! get dimensions 
     1050      IF ( SIZE(sd%fnow, 3) > 1 ) THEN 
     1051         ALLOCATE( ddims(4) ) 
     1052      ELSE 
     1053         ALLOCATE( ddims(3) ) 
     1054      ENDIF 
    10411055      id = iom_varid( inum, sd%clvar, ddims ) 
    10421056 
     
    11351149         CALL ctl_stop( '    fld_weight : unable to read the file ' ) 
    11361150      ENDIF 
     1151 
     1152      DEALLOCATE (ddims ) 
    11371153 
    11381154      CALL wrk_dealloc( jpi,jpj, data_src )   ! integer 
  • branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/sbc_ice.F90

    r4306 r5837  
    1414   !!---------------------------------------------------------------------- 
    1515   USE par_oce          ! ocean parameters 
     16   USE sbc_oce          ! surface boundary condition: ocean 
    1617# if defined key_lim3 
    17    USE par_ice          ! LIM-3 parameters 
     18   USE ice              ! LIM-3 parameters 
    1819# endif 
    1920# if defined key_lim2 
     
    2122   USE ice_2 
    2223# endif 
    23 # if defined key_cice  
     24# if defined key_cice 
    2425   USE ice_domain_size, only: ncat  
    2526#endif 
     
    5556# endif 
    5657 
    57 #if defined key_lim3 || defined key_lim2  
    58    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   qns_ice       !: non solar heat flux over ice                  [W/m2] 
    59    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   qsr_ice       !: solar heat flux over ice                      [W/m2] 
    60    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   qsr_ice_mean  !: dauly mean solar heat flux over ice       [W/m2] 
    61    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   qla_ice       !: latent flux over ice                          [W/m2] 
    62    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   dqla_ice      !: latent sensibility over ice                 [W/m2/K] 
    63    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   dqns_ice      !: non solar heat flux over ice (LW+SEN+LA)    [W/m2/K] 
    64    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   tn_ice        !: ice surface temperature                          [K] 
    65    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   alb_ice       !: albedo of ice 
     58   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   qns_ice        !: non solar heat flux over ice                  [W/m2] 
     59   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   qsr_ice        !: solar heat flux over ice                      [W/m2] 
     60   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   qla_ice        !: latent flux over ice                          [W/m2] 
     61   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   dqla_ice       !: latent sensibility over ice                 [W/m2/K] 
     62   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   dqns_ice       !: non solar heat flux over ice (LW+SEN+LA)    [W/m2/K] 
     63   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   tn_ice         !: ice surface temperature                          [K] 
     64   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   alb_ice        !: ice albedo                                       [-] 
    6665 
    67    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   utau_ice  !: atmos-ice u-stress. VP: I-pt ; EVP: U,V-pts   [N/m2] 
    68    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   vtau_ice  !: atmos-ice v-stress. VP: I-pt ; EVP: U,V-pts   [N/m2] 
    69    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   fr1_i0    !: 1st Qsr fraction penetrating inside ice cover    [-] 
    70    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   fr2_i0    !: 2nd Qsr fraction penetrating inside ice cover    [-] 
    71    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   emp_ice   !: sublimation-snow budget over ice             [kg/m2] 
     66   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   utau_ice       !: atmos-ice u-stress. VP: I-pt ; EVP: U,V-pts   [N/m2] 
     67   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   vtau_ice       !: atmos-ice v-stress. VP: I-pt ; EVP: U,V-pts   [N/m2] 
     68   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   fr1_i0         !: Solar surface transmission parameter, thick ice  [-] 
     69   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   fr2_i0         !: Solar surface transmission parameter, thin ice   [-] 
     70   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   emp_ice        !: sublimation - precip over sea ice          [kg/m2/s] 
    7271 
    73 # if defined key_lim3 
    74    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   tatm_ice  !: air temperature 
    75 # endif 
     72   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   topmelt            !: category topmelt 
     73   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   botmelt            !: category botmelt 
    7674 
    77 #elif defined key_cice 
     75#if defined  key_lim3 
     76   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   evap_ice       !: sublimation                              [kg/m2/s] 
     77   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   devap_ice      !: sublimation sensitivity                [kg/m2/s/K] 
     78   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   qns_oce        !: non solar heat flux over ocean              [W/m2] 
     79   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   qsr_oce        !: non solar heat flux over ocean              [W/m2] 
     80   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   qemp_oce       !: heat flux of precip and evap over ocean     [W/m2] 
     81   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   qemp_ice       !: heat flux of precip and evap over ice       [W/m2] 
     82   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   qprec_ice      !: heat flux of precip over ice                [J/m3] 
     83   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   emp_oce        !: evap - precip over ocean                 [kg/m2/s] 
     84#endif 
     85#if defined key_lim3 || defined key_lim2 
     86   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   wndm_ice       !: wind speed module at T-point                 [m/s] 
     87#endif 
     88 
     89#if defined key_cice 
    7890   ! 
    7991   ! for consistency with LIM, these are declared with three dimensions 
    8092   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   qlw_ice            !: incoming long-wave 
    81    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   qla_ice            !: latent flux over ice           [W/m2] 
    82    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   qsr_ice            !: solar heat flux over ice       [W/m2] 
    8393   ! 
    8494   ! other forcing arrays are two dimensional 
    8595   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   ss_iou             !: x ice-ocean surface stress at NEMO U point 
    8696   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   ss_iov             !: y ice-ocean surface stress at NEMO V point 
    87    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   emp_ice            !: sublimation-snow budget over ice    [kg/m2] 
    88    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   tatm_ice           !: air temperature 
    8997   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   qatm_ice           !: specific humidity 
    9098   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   wndi_ice           !: i wind at T point 
     
    93101   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   fr_iu              !: ice fraction at NEMO U point 
    94102   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   fr_iv              !: ice fraction at NEMO V point 
    95    ! 
    96    ! finally, arrays corresponding to different ice categories 
    97    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   a_i                !: category ice fraction 
    98    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   topmelt            !: category topmelt 
    99    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   botmelt            !: category botmelt 
     103    
     104   ! variables used in the coupled interface 
     105   INTEGER , PUBLIC, PARAMETER ::   jpl = ncat 
     106   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   u_ice, v_ice          ! jpi, jpj 
    100107#endif 
     108    
     109#if defined key_lim2 || defined key_cice 
     110   ! already defined in ice.F90 for LIM3 
     111   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::  a_i 
     112   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::  ht_i, ht_s 
     113#endif 
     114 
     115#if defined key_cice 
     116   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   tatm_ice       !: air temperature [K] 
     117#endif 
     118 
     119   REAL(wp), PUBLIC, SAVE ::   cldf_ice = 0.81    !: cloud fraction over sea ice, summer CLIO value   [-] 
    101120 
    102121   !!---------------------------------------------------------------------- 
     
    111130      !!                     ***  FUNCTION sbc_ice_alloc  *** 
    112131      !!---------------------------------------------------------------------- 
    113       INTEGER :: ierr(2) 
     132      INTEGER :: ierr(5) 
    114133      !!---------------------------------------------------------------------- 
    115134      ierr(:) = 0 
     
    118137      ALLOCATE( qns_ice (jpi,jpj,jpl) , qsr_ice (jpi,jpj,jpl) ,     & 
    119138         &      qla_ice (jpi,jpj,jpl) , dqla_ice(jpi,jpj,jpl) ,     & 
    120          &      dqns_ice(jpi,jpj,jpl) , tn_ice  (jpi,jpj,jpl) ,     & 
    121          &      alb_ice (jpi,jpj,jpl) ,                             & 
    122          &      utau_ice(jpi,jpj)     , vtau_ice(jpi,jpj)     ,     & 
     139         &      dqns_ice(jpi,jpj,jpl) , tn_ice  (jpi,jpj,jpl) , alb_ice (jpi,jpj,jpl) ,   & 
     140         &      utau_ice(jpi,jpj)     , vtau_ice(jpi,jpj)     , wndm_ice(jpi,jpj)     ,   & 
    123141         &      fr1_i0  (jpi,jpj)     , fr2_i0  (jpi,jpj)     ,     & 
     142#if defined key_lim2 
     143         &      a_i(jpi,jpj,jpl)      ,                             & 
     144#endif 
    124145#if defined key_lim3 
    125          &      emp_ice(jpi,jpj)      , tatm_ice(jpi,jpj)     , STAT= ierr(1) ) 
    126 #else 
    127          &      emp_ice(jpi,jpj)                              , STAT= ierr(1) ) 
     146         &      evap_ice(jpi,jpj,jpl) , devap_ice(jpi,jpj,jpl) , qprec_ice(jpi,jpj) ,  & 
     147         &      qemp_ice(jpi,jpj)     , qemp_oce(jpi,jpj)      ,                       & 
     148         &      qns_oce (jpi,jpj)     , qsr_oce (jpi,jpj)      , emp_oce (jpi,jpj)  ,  & 
    128149#endif 
    129 #elif defined key_cice 
     150         &      emp_ice(jpi,jpj)      ,  STAT= ierr(1) ) 
     151#endif 
     152 
     153#if defined key_cice 
    130154      ALLOCATE( qla_ice(jpi,jpj,1)    , qlw_ice(jpi,jpj,1)    , qsr_ice(jpi,jpj,1)    , & 
    131155                wndi_ice(jpi,jpj)     , tatm_ice(jpi,jpj)     , qatm_ice(jpi,jpj)     , & 
    132156                wndj_ice(jpi,jpj)     , nfrzmlt(jpi,jpj)      , ss_iou(jpi,jpj)       , & 
    133157                ss_iov(jpi,jpj)       , fr_iu(jpi,jpj)        , fr_iv(jpi,jpj)        , & 
    134                 a_i(jpi,jpj,ncat)     , topmelt(jpi,jpj,ncat) , botmelt(jpi,jpj,ncat), STAT= ierr(1) ) 
     158                a_i(jpi,jpj,ncat)     , topmelt(jpi,jpj,ncat) , botmelt(jpi,jpj,ncat) , & 
     159                STAT= ierr(1) ) 
     160      IF( ln_cpl )   ALLOCATE( u_ice(jpi,jpj)        , fr1_i0(jpi,jpj)       , tn_ice (jpi,jpj,1)    , & 
     161         &                     v_ice(jpi,jpj)        , fr2_i0(jpi,jpj)       , alb_ice(jpi,jpj,1)    , & 
     162         &                     emp_ice(jpi,jpj)      , qns_ice(jpi,jpj,1)    , dqns_ice(jpi,jpj,1)   , & 
     163         &                     STAT= ierr(2) ) 
     164       
    135165#endif 
    136166         ! 
    137 #if defined key_lim2 
    138       IF( ltrcdm2dc_ice )THEN 
    139          ALLOCATE( qsr_ice_mean (jpi,jpj,jpl), STAT=ierr(2) ) 
    140       ENDIF 
     167#if defined key_cice || defined key_lim2 
     168      IF( ln_cpl )   ALLOCATE( ht_i(jpi,jpj,jpl) , ht_s(jpi,jpj,jpl) , STAT=ierr(5) ) 
    141169#endif 
    142          ! 
     170 
    143171      sbc_ice_alloc = MAXVAL( ierr ) 
    144172      IF( lk_mpp            )   CALL mpp_sum ( sbc_ice_alloc ) 
     
    150178   !!   Default option                      NO LIM 2.0 or 3.0 or CICE sea-ice model 
    151179   !!---------------------------------------------------------------------- 
     180   USE in_out_manager   ! I/O manager 
    152181   LOGICAL         , PUBLIC, PARAMETER ::   lk_lim2    = .FALSE.  !: no LIM-2 ice model 
    153182   LOGICAL         , PUBLIC, PARAMETER ::   lk_lim3    = .FALSE.  !: no LIM-3 ice model 
    154183   LOGICAL         , PUBLIC, PARAMETER ::   lk_cice    = .FALSE.  !: no CICE  ice model 
    155184   CHARACTER(len=1), PUBLIC, PARAMETER ::   cp_ice_msh = '-'      !: no grid ice-velocity 
     185   REAL            , PUBLIC, PARAMETER ::   cldf_ice = 0.81       !: cloud fraction over sea ice, summer CLIO value   [-] 
     186   INTEGER         , PUBLIC, PARAMETER ::   jpl = 1  
     187   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   u_ice, v_ice,fr1_i0,fr2_i0          ! jpi, jpj 
     188   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   tn_ice, alb_ice, qns_ice, dqns_ice  ! (jpi,jpj,jpl) 
     189   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   a_i 
     190   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   emp_ice 
     191   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   qsr_ice 
     192   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   ht_i, ht_s 
     193   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   topmelt, botmelt 
    156194#endif 
    157195 
  • branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/sbc_oce.F90

    r4306 r5837  
    3535   LOGICAL , PUBLIC ::   ln_blk_core    !: CORE bulk formulation 
    3636   LOGICAL , PUBLIC ::   ln_blk_mfs     !: MFS  bulk formulation 
    37    LOGICAL , PUBLIC ::   ln_cpl         !: coupled   formulation (overwritten by key_sbc_coupled ) 
     37#if defined key_oasis3 
     38   LOGICAL , PUBLIC ::   lk_oasis = .TRUE.  !: OASIS used 
     39#else 
     40   LOGICAL , PUBLIC ::   lk_oasis = .FALSE. !: OASIS unused 
     41#endif 
     42   LOGICAL , PUBLIC ::   ln_cpl         !: ocean-atmosphere coupled formulation 
     43   LOGICAL , PUBLIC ::   ln_mixcpl      !: ocean-atmosphere forced-coupled mixed formulation 
    3844   LOGICAL , PUBLIC ::   ln_dm2dc       !: Daily mean to Diurnal Cycle short wave (qsr) 
    3945   LOGICAL , PUBLIC ::   ln_rnf         !: runoffs / runoff mouths 
     
    4147   LOGICAL , PUBLIC ::   ln_apr_dyn     !: Atmospheric pressure forcing used on dynamics (ocean & ice) 
    4248   INTEGER , PUBLIC ::   nn_ice         !: flag for ice in the surface boundary condition (=0/1/2/3) 
     49   INTEGER , PUBLIC ::   nn_isf         !: flag for isf in the surface boundary condition (=0/1/2/3/4)  
    4350   INTEGER , PUBLIC ::   nn_ice_embd    !: flag for levitating/embedding sea-ice in the ocean 
    4451   !                                             !: =0 levitating ice (no mass exchange, concentration/dilution effect) 
    4552   !                                             !: =1 levitating ice with mass and salt exchange but no presure effect 
    4653   !                                             !: =2 embedded sea-ice (full salt and mass exchanges and pressure) 
     54   INTEGER , PUBLIC ::   nn_components  !: flag for sbc module (including sea-ice) coupling mode (see component definition below)  
     55   INTEGER , PUBLIC ::   nn_limflx      !: LIM3 Multi-category heat flux formulation 
     56   !                                             !: =-1  Use of per-category fluxes 
     57   !                                             !: = 0  Average per-category fluxes 
     58   !                                             !: = 1  Average then redistribute per-category fluxes 
     59   !                                             !: = 2  Redistribute a single flux over categories 
    4760   INTEGER , PUBLIC ::   nn_fwb         !: FreshWater Budget:  
    4861   !                                             !:  = 0 unchecked  
     
    5568   LOGICAL , PUBLIC ::   ln_icebergs    !: Icebergs 
    5669   ! 
    57    CHARACTER (len=8), PUBLIC :: cn_iceflx  !: Flux handling over ice categories 
    58    LOGICAL, PUBLIC :: ln_iceflx_ave     ! Average heat fluxes over all ice categories 
    59    LOGICAL, PUBLIC :: ln_iceflx_linear  ! Redistribute mean heat fluxes over all ice categories, using ice temperature and albedo 
     70   INTEGER , PUBLIC ::   nn_lsm         !: Number of iteration if seaoverland is applied 
     71   !!---------------------------------------------------------------------- 
     72   !!           switch definition (improve readability) 
     73   !!---------------------------------------------------------------------- 
     74   INTEGER , PUBLIC, PARAMETER ::   jp_gyre    = 0        !: GYRE analytical               formulation 
     75   INTEGER , PUBLIC, PARAMETER ::   jp_ana     = 1        !: analytical                    formulation 
     76   INTEGER , PUBLIC, PARAMETER ::   jp_flx     = 2        !: flux                          formulation 
     77   INTEGER , PUBLIC, PARAMETER ::   jp_clio    = 3        !: CLIO bulk                     formulation 
     78   INTEGER , PUBLIC, PARAMETER ::   jp_core    = 4        !: CORE bulk                     formulation 
     79   INTEGER , PUBLIC, PARAMETER ::   jp_purecpl = 5        !: Pure ocean-atmosphere Coupled formulation 
     80   INTEGER , PUBLIC, PARAMETER ::   jp_mfs     = 6        !: MFS  bulk                     formulation 
     81   INTEGER , PUBLIC, PARAMETER ::   jp_none    = 7        !: for OPA when doing coupling via SAS module 
     82   INTEGER , PUBLIC, PARAMETER ::   jp_esopa   = -1       !: esopa test, ALL formulations 
     83    
     84   !!---------------------------------------------------------------------- 
     85   !!           component definition 
     86   !!---------------------------------------------------------------------- 
     87   INTEGER , PUBLIC, PARAMETER ::   jp_iam_nemo = 0      !: Initial single executable configuration  
     88                                                         !  (no internal OASIS coupling) 
     89   INTEGER , PUBLIC, PARAMETER ::   jp_iam_opa  = 1      !: Multi executable configuration - OPA component 
     90                                                         !  (internal OASIS coupling) 
     91   INTEGER , PUBLIC, PARAMETER ::   jp_iam_sas  = 2      !: Multi executable configuration - SAS component 
     92                                                         !  (internal OASIS coupling) 
     93   !!---------------------------------------------------------------------- 
     94   !!              Ocean Surface Boundary Condition fields 
     95   !!---------------------------------------------------------------------- 
     96   INTEGER , PUBLIC ::  ncpl_qsr_freq            !: qsr coupling frequency per days from atmosphere 
    6097   ! 
    61    INTEGER , PUBLIC ::   nn_lsm        !: Number of iteration if seaoverland is applied 
    62    !!---------------------------------------------------------------------- 
    63    !!              Ocean Surface Boundary Condition fields 
    64    !!---------------------------------------------------------------------- 
    6598   LOGICAL , PUBLIC ::   lhftau = .FALSE.        !: HF tau used in TKE: mean(stress module) - module(mean stress) 
    66    LOGICAL , PUBLIC ::   ltrcdm2dc               !: In case of Diurnal Cycle short wave, compute a Daily Mean short waves flux 
    6799   !!                                   !!   now    ! before   !! 
    68100   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   utau   , utau_b   !: sea surface i-stress (ocean referential)     [N/m2] 
     
    72104   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   wndm              !: wind speed module at T-point (=|U10m-Uoce|)  [m/s] 
    73105   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qsr               !: sea heat flux:     solar                     [W/m2] 
    74    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qsr_mean          !: daily mean sea heat flux: solar              [W/m2] 
    75106   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qns    , qns_b    !: sea heat flux: non solar                     [W/m2] 
    76107   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qsr_tot           !: total     solar heat flux (over sea and ice) [W/m2] 
     
    80111   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   emp_tot           !: total E-P over ocean and ice                 [Kg/m2/s] 
    81112   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   fmmflx            !: freshwater budget: freezing/melting          [Kg/m2/s] 
    82    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   rnf    , rnf_b    !: river runoff   [Kg/m2/s]   
     113   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   rnf    , rnf_b    !: river runoff        [Kg/m2/s]   
     114   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   fwfisf , fwfisf_b !: ice shelf melting   [Kg/m2/s]   
    83115   !! 
    84116   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::  sbc_tsc, sbc_tsc_b  !: sbc content trend                      [K.m/s] jpi,jpj,jpts 
     
    92124   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   atm_co2           !: atmospheric pCO2                             [ppm] 
    93125#endif 
     126   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xcplmask          !: coupling mask for ln_mixcpl (warning: allocated in sbccpl) 
    94127 
    95128   !!---------------------------------------------------------------------- 
     
    102135   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   sss_m     !: mean (nn_fsbc time-step) surface sea salinity            [psu] 
    103136   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ssh_m     !: mean (nn_fsbc time-step) sea surface height                [m] 
    104    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   e3t_m     !: mean (nn_fsbc time-step) sea surface height                [m] 
     137   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   e3t_m     !: mean (nn_fsbc time-step) sea surface layer thickness       [m] 
     138   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   frq_m     !: mean (nn_fsbc time-step) fraction of solar net radiation absorbed in the 1st T level [-] 
    105139 
    106140   !! * Substitutions 
     
    129163         &      sfx    (jpi,jpj) , sfx_b(jpi,jpj) , emp_tot(jpi,jpj), fmmflx(jpi,jpj), STAT=ierr(2) ) 
    130164         ! 
    131       ALLOCATE( rnf  (jpi,jpj) , sbc_tsc  (jpi,jpj,jpts) , qsr_hc  (jpi,jpj,jpk) ,     & 
    132          &      rnf_b(jpi,jpj) , sbc_tsc_b(jpi,jpj,jpts) , qsr_hc_b(jpi,jpj,jpk) , STAT=ierr(3) ) 
     165      ALLOCATE( fwfisf  (jpi,jpj), rnf  (jpi,jpj) , sbc_tsc  (jpi,jpj,jpts) , qsr_hc  (jpi,jpj,jpk) ,     & 
     166         &      fwfisf_b(jpi,jpj), rnf_b(jpi,jpj) , sbc_tsc_b(jpi,jpj,jpts) , qsr_hc_b(jpi,jpj,jpk) , STAT=ierr(3) ) 
    133167         ! 
    134168      ALLOCATE( tprecip(jpi,jpj) , sprecip(jpi,jpj) , fr_i(jpi,jpj) ,     & 
     
    136170         &      atm_co2(jpi,jpj) ,                                        & 
    137171#endif 
    138          &      ssu_m  (jpi,jpj) , sst_m(jpi,jpj) ,                       & 
    139          &      ssv_m  (jpi,jpj) , sss_m  (jpi,jpj), ssh_m(jpi,jpj) , STAT=ierr(4) ) 
     172         &      ssu_m  (jpi,jpj) , sst_m(jpi,jpj) , frq_m(jpi,jpj) ,      & 
     173         &      ssv_m  (jpi,jpj) , sss_m(jpi,jpj) , ssh_m(jpi,jpj) , STAT=ierr(4) ) 
    140174         ! 
    141175#if defined key_vvl 
    142176      ALLOCATE( e3t_m(jpi,jpj) , STAT=ierr(5) ) 
    143177#endif 
    144          ! 
    145       IF( ltrcdm2dc ) ALLOCATE( qsr_mean(jpi,jpj) , STAT=ierr(5) ) 
    146178         ! 
    147179      sbc_oce_alloc = MAXVAL( ierr ) 
  • branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/sbcapr.F90

    • Property svn:keywords set to Id
    r4624 r5837  
    4343   !!---------------------------------------------------------------------- 
    4444   !! NEMO/OPA 4.0 , NEMO Consortium (2011)  
    45    !! $Id: $ 
     45   !! $Id$ 
    4646   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
    4747   !!---------------------------------------------------------------------- 
  • branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/sbcblk_clio.F90

    r4624 r5837  
    3434   USE albedo 
    3535   USE prtctl          ! Print control 
    36 #if defined key_lim3 
     36#if defined key_lim3  
    3737   USE ice 
    3838   USE sbc_ice         ! Surface boundary condition: ice fields 
     39   USE limthd_dh       ! for CALL lim_thd_snwblow 
    3940#elif defined key_lim2 
    4041   USE ice_2 
     42   USE sbc_ice         ! Surface boundary condition: ice fields 
     43   USE par_ice_2       ! Surface boundary condition: ice fields 
    4144#endif 
    4245 
     
    4548 
    4649   PUBLIC sbc_blk_clio        ! routine called by sbcmod.F90  
    47    PUBLIC blk_ice_clio        ! routine called by sbcice_lim.F90  
     50#if defined key_lim2 || defined key_lim3 
     51   PUBLIC blk_ice_clio_tau    ! routine called by sbcice_lim.F90  
     52   PUBLIC blk_ice_clio_flx    ! routine called by sbcice_lim.F90  
     53#endif 
    4854 
    4955   INTEGER , PARAMETER ::   jpfld   = 7           ! maximum number of files to read  
     
    6268   LOGICAL ::   lbulk_init = .TRUE.               ! flag, bulk initialization done or not) 
    6369 
    64 #if ! defined key_lim3                           
    65    ! in namicerun with LIM3 
    6670   REAL(wp) ::   cai = 1.40e-3 ! best estimate of atm drag in order to get correct FS export in ORCA2-LIM 
    6771   REAL(wp) ::   cao = 1.00e-3 ! chosen by default  ==> should depends on many things...  !!gmto be updated 
    68 #endif 
    6972 
    7073   REAL(wp) ::   rdtbs2      !:    
     
    114117      !!              - utau, vtau  i- and j-component of the wind stress 
    115118      !!              - taum        wind stress module at T-point 
    116       !!              - wndm        10m wind module at T-point 
     119      !!              - wndm        10m wind module at T-point over free ocean or leads in presence of sea-ice 
    117120      !!              - qns         non-solar heat flux including latent heat of solid  
    118121      !!                            precip. melting and emp heat content 
     
    204207      !!               - utau, vtau  i- and j-component of the wind stress 
    205208      !!               - taum        wind stress module at T-point 
    206       !!               - wndm        10m wind module at T-point 
     209      !!               - wndm        10m wind module at T-point over free ocean or leads in presence of sea-ice 
    207210      !!               - qns         non-solar heat flux including latent heat of solid  
    208211      !!                             precip. melting and emp heat content 
     
    257260         END DO 
    258261      END DO 
     262      utau(:,:) = utau(:,:) * umask(:,:,1) 
     263      vtau(:,:) = vtau(:,:) * vmask(:,:,1) 
     264      taum(:,:) = taum(:,:) * tmask(:,:,1) 
    259265      CALL lbc_lnk( taum, 'T', 1. ) 
    260266 
     
    264270!CDIR COLLAPSE 
    265271      wndm(:,:) = sf(jp_wndm)%fnow(:,:,1) 
     272      wndm(:,:) = wndm(:,:) * tmask(:,:,1) 
    266273 
    267274      !------------------------------------------------! 
     
    270277       
    271278      CALL blk_clio_qsr_oce( qsr ) 
    272  
     279      qsr(:,:) = qsr(:,:) * tmask(:,:,1) ! no shortwave radiation into the ocean beneath ice shelf 
    273280      !------------------------! 
    274281      !   Other ocean fluxes   ! 
     
    376383         &     - zqla(:,:)             * pst(:,:) * zcevap                &   ! remove evap.   heat content at SST in Celcius 
    377384         &     + sf(jp_prec)%fnow(:,:,1) * sf(jp_tair)%fnow(:,:,1) * zcprec   ! add    precip. heat content at Tair in Celcius 
     385      qns(:,:) = qns(:,:) * tmask(:,:,1) 
     386#if defined key_lim3 
     387      qns_oce(:,:) = zqlw(:,:) - zqsb(:,:) - zqla(:,:) 
     388      qsr_oce(:,:) = qsr(:,:) 
     389#endif 
    378390      ! NB: if sea-ice model, the snow precip are computed and the associated heat is added to qns (see blk_ice_clio) 
    379391 
    380       CALL iom_put( "qlw_oce",   zqlw )   ! output downward longwave  heat over the ocean 
    381       CALL iom_put( "qsb_oce", - zqsb )   ! output downward sensible  heat over the ocean 
    382       CALL iom_put( "qla_oce", - zqla )   ! output downward latent    heat over the ocean 
    383       CALL iom_put( "qns_oce",   qns  )   ! output downward non solar heat over the ocean 
     392      IF ( nn_ice == 0 ) THEN 
     393         CALL iom_put( "qlw_oce" ,   zqlw )                 ! output downward longwave  heat over the ocean 
     394         CALL iom_put( "qsb_oce" , - zqsb )                 ! output downward sensible  heat over the ocean 
     395         CALL iom_put( "qla_oce" , - zqla )                 ! output downward latent    heat over the ocean 
     396         CALL iom_put( "qemp_oce",   qns-zqlw+zqsb+zqla )   ! output downward heat content of E-P over the ocean 
     397         CALL iom_put( "qns_oce" ,   qns  )                 ! output downward non solar heat over the ocean 
     398         CALL iom_put( "qsr_oce" ,   qsr  )                 ! output downward solar heat over the ocean 
     399         CALL iom_put( "qt_oce"  ,   qns+qsr )              ! output total downward heat over the ocean 
     400      ENDIF 
    384401 
    385402      IF(ln_ctl) THEN 
     
    397414   END SUBROUTINE blk_oce_clio 
    398415 
    399  
    400    SUBROUTINE blk_ice_clio(  pst   , palb_cs, palb_os ,       & 
    401       &                      p_taui, p_tauj, p_qns , p_qsr,   & 
    402       &                      p_qla , p_dqns, p_dqla,          & 
    403       &                      p_tpr , p_spr ,                  & 
    404       &                      p_fr1 , p_fr2 , cd_grid, pdim  ) 
     416# if defined key_lim2 || defined key_lim3 
     417   SUBROUTINE blk_ice_clio_tau 
    405418      !!--------------------------------------------------------------------------- 
    406       !!                     ***  ROUTINE blk_ice_clio  *** 
     419      !!                     ***  ROUTINE blk_ice_clio_tau  *** 
     420      !!                  
     421      !!  ** Purpose :   Computation momentum flux at the ice-atm interface   
     422      !!          
     423      !!  ** Method  :   Read utau from a forcing file. Rearrange if C-grid 
     424      !! 
     425      !!---------------------------------------------------------------------- 
     426      REAL(wp) ::   zcoef 
     427      INTEGER  ::   ji, jj   ! dummy loop indices 
     428      !!--------------------------------------------------------------------- 
     429      ! 
     430      IF( nn_timing == 1 )  CALL timing_start('blk_ice_clio_tau') 
     431 
     432      SELECT CASE( cp_ice_msh ) 
     433 
     434      CASE( 'C' )                          ! C-grid ice dynamics 
     435 
     436         zcoef  = cai / cao                         ! Change from air-sea stress to air-ice stress 
     437         utau_ice(:,:) = zcoef * utau(:,:) 
     438         vtau_ice(:,:) = zcoef * vtau(:,:) 
     439 
     440      CASE( 'I' )                          ! I-grid ice dynamics:  I-point (i.e. F-point lower-left corner) 
     441 
     442         zcoef  = 0.5_wp * cai / cao                ! Change from air-sea stress to air-ice stress 
     443         DO jj = 2, jpj         ! stress from ocean U- and V-points to ice U,V point 
     444            DO ji = 2, jpi   ! I-grid : no vector opt. 
     445               utau_ice(ji,jj) = zcoef * ( utau(ji-1,jj  ) + utau(ji-1,jj-1) ) 
     446               vtau_ice(ji,jj) = zcoef * ( vtau(ji  ,jj-1) + vtau(ji-1,jj-1) ) 
     447            END DO 
     448         END DO 
     449 
     450         CALL lbc_lnk( utau_ice(:,:), 'I', -1. )   ;   CALL lbc_lnk( vtau_ice(:,:), 'I', -1. )   ! I-point 
     451 
     452      END SELECT 
     453 
     454      IF(ln_ctl) THEN 
     455         CALL prt_ctl(tab2d_1=utau_ice , clinfo1=' blk_ice_clio: utau_ice : ', tab2d_2=vtau_ice , clinfo2=' vtau_ice : ') 
     456      ENDIF 
     457 
     458      IF( nn_timing == 1 )  CALL timing_stop('blk_ice_clio_tau') 
     459 
     460   END SUBROUTINE blk_ice_clio_tau 
     461#endif 
     462 
     463# if defined key_lim2 || defined key_lim3 
     464   SUBROUTINE blk_ice_clio_flx(  ptsu , palb_cs, palb_os, palb ) 
     465      !!--------------------------------------------------------------------------- 
     466      !!                     ***  ROUTINE blk_ice_clio_flx *** 
    407467      !!                  
    408468      !!  ** Purpose :   Computation of the heat fluxes at ocean and snow/ice 
     
    426486      !!                         to take into account solid precip latent heat flux 
    427487      !!---------------------------------------------------------------------- 
    428       REAL(wp), INTENT(in   ), DIMENSION(:,:,:)   ::   pst      ! ice surface temperature                   [Kelvin] 
    429       REAL(wp), INTENT(in   ), DIMENSION(:,:,:)   ::   palb_cs  ! ice albedo (clear    sky) (alb_ice_cs)         [%] 
    430       REAL(wp), INTENT(in   ), DIMENSION(:,:,:)   ::   palb_os  ! ice albedo (overcast sky) (alb_ice_os)         [%] 
    431       REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   p_taui   ! surface ice stress at I-point (i-component) [N/m2] 
    432       REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   p_tauj   ! surface ice stress at I-point (j-component) [N/m2] 
    433       REAL(wp), INTENT(  out), DIMENSION(:,:,:)   ::   p_qns    ! non solar heat flux over ice (T-point)      [W/m2] 
    434       REAL(wp), INTENT(  out), DIMENSION(:,:,:)   ::   p_qsr    !     solar heat flux over ice (T-point)      [W/m2] 
    435       REAL(wp), INTENT(  out), DIMENSION(:,:,:)   ::   p_qla    ! latent    heat flux over ice (T-point)      [W/m2] 
    436       REAL(wp), INTENT(  out), DIMENSION(:,:,:)   ::   p_dqns   ! non solar heat sensistivity  (T-point)      [W/m2] 
    437       REAL(wp), INTENT(  out), DIMENSION(:,:,:)   ::   p_dqla   ! latent    heat sensistivity  (T-point)      [W/m2] 
    438       REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   p_tpr    ! total precipitation          (T-point)   [Kg/m2/s] 
    439       REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   p_spr    ! solid precipitation          (T-point)   [Kg/m2/s] 
    440       REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   p_fr1    ! 1sr fraction of qsr penetration in ice         [%] 
    441       REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   p_fr2    ! 2nd fraction of qsr penetration in ice         [%] 
    442       CHARACTER(len=1), INTENT(in   )             ::   cd_grid  ! type of sea-ice grid ("C" or "B" grid) 
    443       INTEGER, INTENT(in   )                      ::   pdim     ! number of ice categories 
     488      REAL(wp), INTENT(in   ), DIMENSION(:,:,:)   ::   ptsu      ! ice surface temperature                   [Kelvin] 
     489      REAL(wp), INTENT(in   ), DIMENSION(:,:,:)   ::   palb_cs  ! ice albedo (clear    sky) (alb_ice_cs)         [-] 
     490      REAL(wp), INTENT(in   ), DIMENSION(:,:,:)   ::   palb_os  ! ice albedo (overcast sky) (alb_ice_os)         [-] 
     491      REAL(wp), INTENT(  out), DIMENSION(:,:,:)   ::   palb     ! ice albedo (actual value)                      [-] 
    444492      !! 
    445493      INTEGER  ::   ji, jj, jl    ! dummy loop indices 
    446       INTEGER  ::   ijpl          ! number of ice categories (size of 3rd dim of input arrays) 
    447       !! 
    448       REAL(wp) ::   zcoef, zmt1, zmt2, zmt3, ztatm3     ! temporary scalars 
     494      !! 
     495      REAL(wp) ::   zmt1, zmt2, zmt3, ztatm3                    ! temporary scalars 
    449496      REAL(wp) ::   ztaevbk, zind1, zind2, zind3, ztamr         !    -         - 
    450497      REAL(wp) ::   zesi, zqsati, zdesidt                       !    -         - 
     
    452499      REAL(wp) ::   zcshi, zclei, zrhovaclei, zrhovacshi        !    -         - 
    453500      REAL(wp) ::   ztice3, zticemb, zticemb2, zdqlw, zdqsb     !    -         - 
     501      REAL(wp) ::   z1_lsub                                     !    -         - 
    454502      !! 
    455503      REAL(wp), DIMENSION(:,:)  , POINTER ::   ztatm   ! Tair in Kelvin 
     
    458506      REAL(wp), DIMENSION(:,:)  , POINTER ::   zrhoa   ! air density 
    459507      REAL(wp), DIMENSION(:,:,:), POINTER ::   z_qlw, z_qsb 
     508      REAL(wp), DIMENSION(:,:)  , POINTER ::   zevap, zsnw 
    460509      !!--------------------------------------------------------------------- 
    461510      ! 
    462       IF( nn_timing == 1 )  CALL timing_start('blk_ice_clio') 
     511      IF( nn_timing == 1 )  CALL timing_start('blk_ice_clio_flx') 
    463512      ! 
    464513      CALL wrk_alloc( jpi,jpj, ztatm, zqatm, zevsqr, zrhoa ) 
    465       CALL wrk_alloc( jpi,jpj,pdim, z_qlw, z_qsb ) 
    466  
    467       ijpl  = pdim                           ! number of ice categories 
     514      CALL wrk_alloc( jpi,jpj, jpl, z_qlw, z_qsb ) 
     515 
    468516      zpatm = 101000.                        ! atmospheric pressure  (assumed constant  here) 
    469  
    470 #if defined key_lim3       
    471       tatm_ice(:,:) = sf(jp_tair)%fnow(:,:,1)   ! LIM3: make Tair available in sea-ice. WARNING allocated after call to ice_init 
    472 #endif 
    473       !                                                        ! surface ocean fluxes computed with CLIO bulk formulea 
    474       !------------------------------------! 
    475       !   momentum fluxes  (utau, vtau )   ! 
    476       !------------------------------------! 
    477  
    478       SELECT CASE( cd_grid ) 
    479       CASE( 'C' )                          ! C-grid ice dynamics 
    480          zcoef  = cai / cao                         ! Change from air-sea stress to air-ice stress 
    481          p_taui(:,:) = zcoef * utau(:,:) 
    482          p_tauj(:,:) = zcoef * vtau(:,:) 
    483       CASE( 'I' )                          ! I-grid ice dynamics:  I-point (i.e. F-point lower-left corner) 
    484          zcoef  = 0.5_wp * cai / cao                ! Change from air-sea stress to air-ice stress 
    485          DO jj = 2, jpj         ! stress from ocean U- and V-points to ice U,V point 
    486             DO ji = 2, jpi   ! I-grid : no vector opt. 
    487                p_taui(ji,jj) = zcoef * ( utau(ji-1,jj  ) + utau(ji-1,jj-1) ) 
    488                p_tauj(ji,jj) = zcoef * ( vtau(ji  ,jj-1) + vtau(ji-1,jj-1) ) 
    489             END DO 
    490          END DO 
    491          CALL lbc_lnk( p_taui(:,:), 'I', -1. )   ;   CALL lbc_lnk( p_tauj(:,:), 'I', -1. )   ! I-point 
    492       END SELECT 
    493  
    494  
     517      !-------------------------------------------------------------------------------- 
    495518      !  Determine cloud optical depths as a function of latitude (Chou et al., 1981). 
    496519      !  and the correction factor for taking into account  the effect of clouds  
    497       !------------------------------------------------------ 
     520      !-------------------------------------------------------------------------------- 
     521 
    498522!CDIR NOVERRCHK 
    499523!CDIR COLLAPSE 
     
    522546            zmt2  = ( 272.0 - ztatm(ji,jj) ) / 38.0   ;   zind2 = MAX( 0.e0, SIGN( 1.e0, zmt2 ) ) 
    523547            zmt3  = ( 281.0 - ztatm(ji,jj) ) / 18.0   ;   zind3 = MAX( 0.e0, SIGN( 1.e0, zmt3 ) ) 
    524             p_spr(ji,jj) = sf(jp_prec)%fnow(ji,jj,1) / rday   &      ! rday = converte mm/day to kg/m2/s 
     548            sprecip(ji,jj) = sf(jp_prec)%fnow(ji,jj,1) / rday   &      ! rday = converte mm/day to kg/m2/s 
    525549               &         * (          zind1      &                   ! solid  (snow) precipitation [kg/m2/s] 
    526550               &            + ( 1.0 - zind1 ) * (          zind2   * ( 0.5 + zmt2 )   & 
     
    532556            ! fraction of qsr_ice which is NOT absorbed in the thin surface layer 
    533557            ! and thus which penetrates inside the ice cover ( Maykut and Untersteiner, 1971 ; Elbert anbd Curry, 1993 ) 
    534             p_fr1(ji,jj) = 0.18  * ( 1.e0 - sf(jp_ccov)%fnow(ji,jj,1) ) + 0.35 * sf(jp_ccov)%fnow(ji,jj,1)  
    535             p_fr2(ji,jj) = 0.82  * ( 1.e0 - sf(jp_ccov)%fnow(ji,jj,1) ) + 0.65 * sf(jp_ccov)%fnow(ji,jj,1) 
    536          END DO 
    537       END DO 
    538       CALL iom_put( 'snowpre', p_spr )   ! Snow precipitation  
     558            fr1_i0(ji,jj) = 0.18  * ( 1.e0 - sf(jp_ccov)%fnow(ji,jj,1) ) + 0.35 * sf(jp_ccov)%fnow(ji,jj,1)  
     559            fr2_i0(ji,jj) = 0.82  * ( 1.e0 - sf(jp_ccov)%fnow(ji,jj,1) ) + 0.65 * sf(jp_ccov)%fnow(ji,jj,1) 
     560         END DO 
     561      END DO 
     562      CALL iom_put( 'snowpre', sprecip )   ! Snow precipitation  
    539563       
    540564      !-----------------------------------------------------------! 
    541565      !  snow/ice Shortwave radiation   (abedo already computed)  ! 
    542566      !-----------------------------------------------------------! 
    543       CALL blk_clio_qsr_ice( palb_cs, palb_os, p_qsr ) 
     567      CALL blk_clio_qsr_ice( palb_cs, palb_os, qsr_ice ) 
     568       
     569      DO jl = 1, jpl 
     570         palb(:,:,jl) = ( palb_cs(:,:,jl) * ( 1.e0 - sf(jp_ccov)%fnow(:,:,1) )   & 
     571            &         +   palb_os(:,:,jl) * sf(jp_ccov)%fnow(:,:,1) ) 
     572      END DO 
    544573 
    545574      !                                     ! ========================== ! 
    546       DO jl = 1, ijpl                       !  Loop over ice categories  ! 
     575      DO jl = 1, jpl                       !  Loop over ice categories  ! 
    547576         !                                  ! ========================== ! 
    548577!CDIR NOVERRCHK 
     
    558587               ztaevbk = ztatm3 * ztatm(ji,jj) * zcldeff * ( 0.39 - 0.05 * zevsqr(ji,jj) )  
    559588               ! 
    560                z_qlw(ji,jj,jl) = - emic * stefan * ( ztaevbk + 4. * ztatm3 * ( pst(ji,jj,jl) - ztatm(ji,jj) ) )  
     589               z_qlw(ji,jj,jl) = - emic * stefan * ( ztaevbk + 4. * ztatm3 * ( ptsu(ji,jj,jl) - ztatm(ji,jj) ) )  
    561590 
    562591               !---------------------------------------- 
     
    565594 
    566595               ! vapour pressure at saturation of ice (tmask to avoid overflow in the exponential) 
    567                zesi =  611.0 * EXP( 21.8745587 * tmask(ji,jj,1) * ( pst(ji,jj,jl) - rtt )/ ( pst(ji,jj,jl) - 7.66 ) ) 
     596               zesi =  611.0 * EXP( 21.8745587 * tmask(ji,jj,1) * ( ptsu(ji,jj,jl) - rtt )/ ( ptsu(ji,jj,jl) - 7.66 ) ) 
    568597               ! humidity close to the ice surface (at saturation) 
    569598               zqsati   = ( 0.622 * zesi ) / ( zpatm - 0.378 * zesi ) 
    570599                
    571600               !  computation of intermediate values 
    572                zticemb  = pst(ji,jj,jl) - 7.66 
     601               zticemb  = ptsu(ji,jj,jl) - 7.66 
    573602               zticemb2 = zticemb * zticemb   
    574                ztice3   = pst(ji,jj,jl) * pst(ji,jj,jl) * pst(ji,jj,jl) 
     603               ztice3   = ptsu(ji,jj,jl) * ptsu(ji,jj,jl) * ptsu(ji,jj,jl) 
    575604               zdesidt  = zesi * ( 9.5 * LOG( 10.0 ) * ( rtt - 7.66 )  / zticemb2 ) 
    576605                
     
    585614             
    586615               !  sensible heat flux 
    587                z_qsb(ji,jj,jl) = zrhovacshi * ( pst(ji,jj,jl) - ztatm(ji,jj) ) 
     616               z_qsb(ji,jj,jl) = zrhovacshi * ( ptsu(ji,jj,jl) - ztatm(ji,jj) ) 
    588617             
    589618               !  latent heat flux  
    590                p_qla(ji,jj,jl) = MAX(  0.e0, zrhovaclei * ( zqsati - zqatm(ji,jj) )  ) 
     619               qla_ice(ji,jj,jl) = MAX(  0.e0, zrhovaclei * ( zqsati - zqatm(ji,jj) )  ) 
    591620               
    592621               !  sensitivity of non solar fluxes (dQ/dT) (long-wave, sensible and latent fluxes) 
     
    595624               zdqla = zrhovaclei * ( zdesidt * ( zqsati * zqsati / ( zesi * zesi ) ) * ( zpatm / 0.622 ) )    
    596625               ! 
    597                p_dqla(ji,jj,jl) = zdqla                           ! latent flux sensitivity 
    598                p_dqns(ji,jj,jl) = -( zdqlw + zdqsb + zdqla )      !  total non solar sensitivity 
     626               dqla_ice(ji,jj,jl) = zdqla                           ! latent flux sensitivity 
     627               dqns_ice(ji,jj,jl) = -( zdqlw + zdqsb + zdqla )      !  total non solar sensitivity 
    599628            END DO 
    600629            ! 
     
    608637      ! 
    609638!CDIR COLLAPSE 
    610       p_qns(:,:,:) = z_qlw (:,:,:) - z_qsb (:,:,:) - p_qla (:,:,:)      ! Downward Non Solar flux 
    611 !CDIR COLLAPSE 
    612       p_tpr(:,:)   = sf(jp_prec)%fnow(:,:,1) / rday                     ! total precipitation [kg/m2/s] 
     639      qns_ice(:,:,:) = z_qlw (:,:,:) - z_qsb (:,:,:) - qla_ice (:,:,:)      ! Downward Non Solar flux 
     640!CDIR COLLAPSE 
     641      tprecip(:,:)   = sf(jp_prec)%fnow(:,:,1) / rday                     ! total precipitation [kg/m2/s] 
    613642      ! 
    614643      ! ----------------------------------------------------------------------------- ! 
     
    617646!CDIR COLLAPSE 
    618647      qns(:,:) = qns(:,:)                                                           &   ! update the non-solar heat flux with: 
    619          &     - p_spr(:,:) * lfus                                                  &   ! remove melting solid precip 
    620          &     + p_spr(:,:) * MIN( sf(jp_tair)%fnow(:,:,1), rt0_snow - rt0 ) * cpic &   ! add solid P at least below melting 
    621          &     - p_spr(:,:) * sf(jp_tair)%fnow(:,:,1)                        * rcp      ! remove solid precip. at Tair 
    622       ! 
     648         &     - sprecip(:,:) * lfus                                                  &   ! remove melting solid precip 
     649         &     + sprecip(:,:) * MIN( sf(jp_tair)%fnow(:,:,1), rt0_snow - rt0 ) * cpic &   ! add solid P at least below melting 
     650         &     - sprecip(:,:) * sf(jp_tair)%fnow(:,:,1)                        * rcp      ! remove solid precip. at Tair 
     651 
     652#if defined key_lim3 
     653      ! ----------------------------------------------------------------------------- ! 
     654      !    Distribute evapo, precip & associated heat over ice and ocean 
     655      ! ---------------=====--------------------------------------------------------- ! 
     656      CALL wrk_alloc( jpi,jpj, zevap, zsnw )  
     657 
     658      ! --- evaporation --- ! 
     659      z1_lsub = 1._wp / Lsub 
     660      evap_ice (:,:,:) = qla_ice (:,:,:) * z1_lsub ! sublimation 
     661      devap_ice(:,:,:) = dqla_ice(:,:,:) * z1_lsub 
     662      zevap    (:,:)   = emp(:,:) + tprecip(:,:)   ! evaporation over ocean 
     663 
     664      ! --- evaporation minus precipitation --- ! 
     665      zsnw(:,:) = 0._wp 
     666      CALL lim_thd_snwblow( pfrld, zsnw )          ! snow redistribution by wind 
     667      emp_oce(:,:) = pfrld(:,:) * zevap(:,:) - ( tprecip(:,:) - sprecip(:,:) ) - sprecip(:,:) * ( 1._wp - zsnw ) 
     668      emp_ice(:,:) = SUM( a_i_b(:,:,:) * evap_ice(:,:,:), dim=3 ) - sprecip(:,:) * zsnw 
     669      emp_tot(:,:) = emp_oce(:,:) + emp_ice(:,:) 
     670 
     671      ! --- heat flux associated with emp --- ! 
     672      qemp_oce(:,:) = - pfrld(:,:) * zevap(:,:) * sst_m(:,:) * rcp                               & ! evap 
     673         &          + ( tprecip(:,:) - sprecip(:,:) ) * ( sf(jp_tair)%fnow(:,:,1) - rt0 ) * rcp  & ! liquid precip 
     674         &          +   sprecip(:,:) * ( 1._wp - zsnw ) *                                        & ! solid precip 
     675         &              ( ( MIN( sf(jp_tair)%fnow(:,:,1), rt0_snow ) - rt0 ) * cpic * tmask(:,:,1) - lfus ) 
     676      qemp_ice(:,:) =   sprecip(:,:) * zsnw *                                                    & ! solid precip (only) 
     677         &              ( ( MIN( sf(jp_tair)%fnow(:,:,1), rt0_snow ) - rt0 ) * cpic * tmask(:,:,1) - lfus ) 
     678 
     679      ! --- total solar and non solar fluxes --- ! 
     680      qns_tot(:,:) = pfrld(:,:) * qns_oce(:,:) + SUM( a_i_b(:,:,:) * qns_ice(:,:,:), dim=3 ) + qemp_ice(:,:) + qemp_oce(:,:) 
     681      qsr_tot(:,:) = pfrld(:,:) * qsr_oce(:,:) + SUM( a_i_b(:,:,:) * qsr_ice(:,:,:), dim=3 ) 
     682 
     683      ! --- heat content of precip over ice in J/m3 (to be used in 1D-thermo) --- ! 
     684      qprec_ice(:,:) = rhosn * ( ( MIN( sf(jp_tair)%fnow(:,:,1), rt0_snow ) - rt0 ) * cpic * tmask(:,:,1) - lfus ) 
     685 
     686      CALL wrk_dealloc( jpi,jpj, zevap, zsnw )  
     687#endif 
     688 
    623689!!gm : not necessary as all input data are lbc_lnk... 
    624       CALL lbc_lnk( p_fr1  (:,:) , 'T', 1. ) 
    625       CALL lbc_lnk( p_fr2  (:,:) , 'T', 1. ) 
    626       DO jl = 1, ijpl 
    627          CALL lbc_lnk( p_qns (:,:,jl) , 'T', 1. ) 
    628          CALL lbc_lnk( p_dqns(:,:,jl) , 'T', 1. ) 
    629          CALL lbc_lnk( p_qla (:,:,jl) , 'T', 1. ) 
    630          CALL lbc_lnk( p_dqla(:,:,jl) , 'T', 1. ) 
     690      CALL lbc_lnk( fr1_i0  (:,:) , 'T', 1. ) 
     691      CALL lbc_lnk( fr2_i0  (:,:) , 'T', 1. ) 
     692      DO jl = 1, jpl 
     693         CALL lbc_lnk( qns_ice (:,:,jl) , 'T', 1. ) 
     694         CALL lbc_lnk( dqns_ice(:,:,jl) , 'T', 1. ) 
     695         CALL lbc_lnk( qla_ice (:,:,jl) , 'T', 1. ) 
     696         CALL lbc_lnk( dqla_ice(:,:,jl) , 'T', 1. ) 
    631697      END DO 
    632698 
    633699!!gm : mask is not required on forcing 
    634       DO jl = 1, ijpl 
    635          p_qns (:,:,jl) = p_qns (:,:,jl) * tmask(:,:,1) 
    636          p_qla (:,:,jl) = p_qla (:,:,jl) * tmask(:,:,1) 
    637          p_dqns(:,:,jl) = p_dqns(:,:,jl) * tmask(:,:,1) 
    638          p_dqla(:,:,jl) = p_dqla(:,:,jl) * tmask(:,:,1) 
    639       END DO 
     700      DO jl = 1, jpl 
     701         qns_ice (:,:,jl) = qns_ice (:,:,jl) * tmask(:,:,1) 
     702         qla_ice (:,:,jl) = qla_ice (:,:,jl) * tmask(:,:,1) 
     703         dqns_ice(:,:,jl) = dqns_ice(:,:,jl) * tmask(:,:,1) 
     704         dqla_ice(:,:,jl) = dqla_ice(:,:,jl) * tmask(:,:,1) 
     705      END DO 
     706 
     707      CALL wrk_dealloc( jpi,jpj, ztatm, zqatm, zevsqr, zrhoa ) 
     708      CALL wrk_dealloc( jpi,jpj, jpl  , z_qlw, z_qsb ) 
    640709 
    641710      IF(ln_ctl) THEN 
    642          CALL prt_ctl(tab3d_1=z_qsb  , clinfo1=' blk_ice_clio: z_qsb  : ', tab3d_2=z_qlw  , clinfo2=' z_qlw  : ', kdim=ijpl) 
    643          CALL prt_ctl(tab3d_1=p_qla  , clinfo1=' blk_ice_clio: z_qla  : ', tab3d_2=p_qsr  , clinfo2=' p_qsr  : ', kdim=ijpl) 
    644          CALL prt_ctl(tab3d_1=p_dqns , clinfo1=' blk_ice_clio: p_dqns : ', tab3d_2=p_qns  , clinfo2=' p_qns  : ', kdim=ijpl) 
    645          CALL prt_ctl(tab3d_1=p_dqla , clinfo1=' blk_ice_clio: p_dqla : ', tab3d_2=pst    , clinfo2=' pst    : ', kdim=ijpl) 
    646          CALL prt_ctl(tab2d_1=p_tpr  , clinfo1=' blk_ice_clio: p_tpr  : ', tab2d_2=p_spr  , clinfo2=' p_spr  : ') 
    647          CALL prt_ctl(tab2d_1=p_taui , clinfo1=' blk_ice_clio: p_taui : ', tab2d_2=p_tauj , clinfo2=' p_tauj : ') 
     711         CALL prt_ctl(tab3d_1=z_qsb  , clinfo1=' blk_ice_clio: z_qsb  : ', tab3d_2=z_qlw  , clinfo2=' z_qlw  : ', kdim=jpl) 
     712         CALL prt_ctl(tab3d_1=qla_ice  , clinfo1=' blk_ice_clio: z_qla  : ', tab3d_2=qsr_ice  , clinfo2=' qsr_ice  : ', kdim=jpl) 
     713         CALL prt_ctl(tab3d_1=dqns_ice , clinfo1=' blk_ice_clio: dqns_ice : ', tab3d_2=qns_ice  , clinfo2=' qns_ice  : ', kdim=jpl) 
     714         CALL prt_ctl(tab3d_1=dqla_ice , clinfo1=' blk_ice_clio: dqla_ice : ', tab3d_2=ptsu    , clinfo2=' ptsu    : ', kdim=jpl) 
     715         CALL prt_ctl(tab2d_1=tprecip  , clinfo1=' blk_ice_clio: tprecip  : ', tab2d_2=sprecip  , clinfo2=' sprecip  : ') 
    648716      ENDIF 
    649717 
    650       CALL wrk_dealloc( jpi,jpj, ztatm, zqatm, zevsqr, zrhoa ) 
    651       CALL wrk_dealloc( jpi,jpj,pdim, z_qlw, z_qsb ) 
    652       ! 
    653       IF( nn_timing == 1 )  CALL timing_stop('blk_ice_clio') 
    654       ! 
    655    END SUBROUTINE blk_ice_clio 
    656  
     718      IF( nn_timing == 1 )  CALL timing_stop('blk_ice_clio_flx') 
     719      ! 
     720   END SUBROUTINE blk_ice_clio_flx 
     721 
     722#endif 
    657723 
    658724   SUBROUTINE blk_clio_qsr_oce( pqsr_oce ) 
  • branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/sbcblk_core.F90

    r4624 r5837  
    55   !!===================================================================== 
    66   !! History :  1.0  !  2004-08  (U. Schweckendiek)  Original code 
    7    !!            2.0  !  2005-04  (L. Brodeau, A.M. Treguier) additions:  
     7   !!            2.0  !  2005-04  (L. Brodeau, A.M. Treguier) additions: 
    88   !!                           -  new bulk routine for efficiency 
    99   !!                           -  WINDS ARE NOW ASSUMED TO BE AT T POINTS in input files !!!! 
    10    !!                           -  file names and file characteristics in namelist  
    11    !!                           -  Implement reading of 6-hourly fields    
    12    !!            3.0  !  2006-06  (G. Madec) sbc rewritting    
    13    !!             -   !  2006-12  (L. Brodeau) Original code for TURB_CORE_2Z 
     10   !!                           -  file names and file characteristics in namelist 
     11   !!                           -  Implement reading of 6-hourly fields 
     12   !!            3.0  !  2006-06  (G. Madec) sbc rewritting 
     13   !!             -   !  2006-12  (L. Brodeau) Original code for turb_core_2z 
    1414   !!            3.2  !  2009-04  (B. Lemaire)  Introduce iom_put 
    1515   !!            3.3  !  2010-10  (S. Masson)  add diurnal cycle 
    1616   !!            3.4  !  2011-11  (C. Harris) Fill arrays required by CICE 
     17   !!            3.7  !  2014-06  (L. Brodeau) simplification and optimization of CORE bulk 
    1718   !!---------------------------------------------------------------------- 
    1819 
    1920   !!---------------------------------------------------------------------- 
    20    !!   sbc_blk_core  : bulk formulation as ocean surface boundary condition 
    21    !!                   (forced mode, CORE bulk formulea) 
    22    !!   blk_oce_core  : ocean: computes momentum, heat and freshwater fluxes 
    23    !!   blk_ice_core  : ice  : computes momentum, heat and freshwater fluxes 
    24    !!   turb_core     : computes the CORE turbulent transfer coefficients  
     21   !!   sbc_blk_core    : bulk formulation as ocean surface boundary condition (forced mode, CORE bulk formulea) 
     22   !!   blk_oce_core    : computes momentum, heat and freshwater fluxes over ocean 
     23   !!   blk_ice_core    : computes momentum, heat and freshwater fluxes over ice 
     24   !!   turb_core_2z    : Computes turbulent transfert coefficients 
     25   !!   cd_neutral_10m  : Estimate of the neutral drag coefficient at 10m 
     26   !!   psi_m           : universal profile stability function for momentum 
     27   !!   psi_h           : universal profile stability function for temperature and humidity 
    2528   !!---------------------------------------------------------------------- 
    2629   USE oce             ! ocean dynamics and tracers 
     
    3841   USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
    3942   USE prtctl          ! Print control 
    40    USE sbcwave,ONLY :  cdn_wave !wave module  
    41 #if defined key_lim3 || defined key_cice 
     43   USE sbcwave, ONLY   :  cdn_wave ! wave module 
    4244   USE sbc_ice         ! Surface boundary condition: ice fields 
     45   USE lib_fortran     ! to use key_nosignedzero 
     46#if defined key_lim3 
     47   USE ice, ONLY       : u_ice, v_ice, jpl, pfrld, a_i_b 
     48   USE limthd_dh       ! for CALL lim_thd_snwblow 
     49#elif defined key_lim2 
     50   USE ice_2, ONLY     : u_ice, v_ice 
     51   USE par_ice_2 
    4352#endif 
    44    USE lib_fortran     ! to use key_nosignedzero 
    4553 
    4654   IMPLICIT NONE 
     
    4856 
    4957   PUBLIC   sbc_blk_core         ! routine called in sbcmod module 
    50    PUBLIC   blk_ice_core         ! routine called in sbc_ice_lim module 
    51    PUBLIC   blk_ice_meanqsr      ! routine called in sbc_ice_lim module 
     58#if defined key_lim2 || defined key_lim3 
     59   PUBLIC   blk_ice_core_tau     ! routine called in sbc_ice_lim module 
     60   PUBLIC   blk_ice_core_flx     ! routine called in sbc_ice_lim module 
     61#endif 
    5262   PUBLIC   turb_core_2z         ! routine calles in sbcblk_mfs module 
    5363 
    54    INTEGER , PARAMETER ::   jpfld   = 9           ! maximum number of files to read  
     64   INTEGER , PARAMETER ::   jpfld   = 9           ! maximum number of files to read 
    5565   INTEGER , PARAMETER ::   jp_wndi = 1           ! index of 10m wind velocity (i-component) (m/s)    at T-point 
    5666   INTEGER , PARAMETER ::   jp_wndj = 2           ! index of 10m wind velocity (j-component) (m/s)    at T-point 
     
    6272   INTEGER , PARAMETER ::   jp_snow = 8           ! index of snow (solid prcipitation)       (kg/m2/s) 
    6373   INTEGER , PARAMETER ::   jp_tdif = 9           ! index of tau diff associated to HF tau   (N/m2)   at T-point 
    64     
     74 
    6575   TYPE(FLD), ALLOCATABLE, DIMENSION(:) ::   sf   ! structure of input fields (file informations, fields read) 
    66           
     76 
    6777   !                                             !!! CORE bulk parameters 
    6878   REAL(wp), PARAMETER ::   rhoa =    1.22        ! air density 
     
    7585 
    7686   !                                  !!* Namelist namsbc_core : CORE bulk parameters 
    77    LOGICAL  ::   ln_2m       ! logical flag for height of air temp. and hum 
    7887   LOGICAL  ::   ln_taudif   ! logical flag to use the "mean of stress module - module of mean stress" data 
    7988   REAL(wp) ::   rn_pfac     ! multiplication factor for precipitation 
    8089   REAL(wp) ::   rn_efac     ! multiplication factor for evaporation (clem) 
    8190   REAL(wp) ::   rn_vfac     ! multiplication factor for ice/ocean velocity in the calculation of wind stress (clem) 
    82    LOGICAL  ::   ln_bulk2z   ! logical flag for case where z(q,t) and z(u) are specified in the namelist 
    8391   REAL(wp) ::   rn_zqt      ! z(q,t) : height of humidity and temperature measurements 
    8492   REAL(wp) ::   rn_zu       ! z(u)   : height of wind measurements 
     
    8896#  include "vectopt_loop_substitute.h90" 
    8997   !!---------------------------------------------------------------------- 
    90    !! NEMO/OPA 3.3 , NEMO-consortium (2010)  
     98   !! NEMO/OPA 3.7 , NEMO-consortium (2014) 
    9199   !! $Id$ 
    92100   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     
    97105      !!--------------------------------------------------------------------- 
    98106      !!                    ***  ROUTINE sbc_blk_core  *** 
    99       !!                    
     107      !! 
    100108      !! ** Purpose :   provide at each time step the surface ocean fluxes 
    101       !!      (momentum, heat, freshwater and runoff)  
     109      !!      (momentum, heat, freshwater and runoff) 
    102110      !! 
    103111      !! ** Method  : (1) READ each fluxes in NetCDF files: 
     
    118126      !! ** Action  :   defined at each time-step at the air-sea interface 
    119127      !!              - utau, vtau  i- and j-component of the wind stress 
    120       !!              - taum, wndm  wind stress and 10m wind modules at T-point 
     128      !!              - taum        wind stress module at T-point 
     129      !!              - wndm        wind speed  module at T-point over free ocean or leads in presence of sea-ice 
    121130      !!              - qns, qsr    non-solar and solar heat fluxes 
    122131      !!              - emp         upward mass flux (evapo. - precip.) 
    123132      !!              - sfx         salt flux due to freezing/melting (non-zero only if ice is present) 
    124133      !!                            (set in limsbc(_2).F90) 
     134      !! 
     135      !! ** References :   Large & Yeager, 2004 / Large & Yeager, 2008 
     136      !!                   Brodeau et al. Ocean Modelling 2010 
    125137      !!---------------------------------------------------------------------- 
    126138      INTEGER, INTENT(in) ::   kt   ! ocean time step 
    127       !! 
     139      ! 
    128140      INTEGER  ::   ierror   ! return error code 
    129141      INTEGER  ::   ifpr     ! dummy loop indice 
    130142      INTEGER  ::   jfld     ! dummy loop arguments 
    131143      INTEGER  ::   ios      ! Local integer output status for namelist read 
    132       !! 
     144      ! 
    133145      CHARACTER(len=100) ::  cn_dir   !   Root directory for location of core files 
    134146      TYPE(FLD_N), DIMENSION(jpfld) ::   slf_i     ! array of namelist informations on the fields to read 
     
    136148      TYPE(FLD_N) ::   sn_qlw , sn_tair, sn_prec, sn_snow      !   "                                 " 
    137149      TYPE(FLD_N) ::   sn_tdif                                 !   "                                 " 
    138       NAMELIST/namsbc_core/ cn_dir , ln_2m  , ln_taudif, rn_pfac, rn_efac, rn_vfac,  & 
     150      NAMELIST/namsbc_core/ cn_dir , ln_taudif, rn_pfac, rn_efac, rn_vfac,  & 
    139151         &                  sn_wndi, sn_wndj, sn_humi  , sn_qsr ,           & 
    140152         &                  sn_qlw , sn_tair, sn_prec  , sn_snow,           & 
    141          &                  sn_tdif, rn_zqt , ln_bulk2z, rn_zu 
    142       !!--------------------------------------------------------------------- 
    143  
     153         &                  sn_tdif, rn_zqt, rn_zu 
     154      !!--------------------------------------------------------------------- 
     155      ! 
    144156      !                                         ! ====================== ! 
    145157      IF( kt == nit000 ) THEN                   !  First call kt=nit000  ! 
     
    149161         READ  ( numnam_ref, namsbc_core, IOSTAT = ios, ERR = 901) 
    150162901      IF( ios /= 0 ) CALL ctl_nam ( ios , 'namsbc_core in reference namelist', lwp ) 
    151  
     163         ! 
    152164         REWIND( numnam_cfg )              ! Namelist namsbc_core in configuration namelist : CORE bulk parameters 
    153165         READ  ( numnam_cfg, namsbc_core, IOSTAT = ios, ERR = 902 ) 
    154166902      IF( ios /= 0 ) CALL ctl_nam ( ios , 'namsbc_core in configuration namelist', lwp ) 
    155167 
    156          IF(lwm) WRITE ( numond, namsbc_core ) 
     168         IF(lwm) WRITE( numond, namsbc_core ) 
    157169         !                                         ! check: do we plan to use ln_dm2dc with non-daily forcing? 
    158          IF( ln_dm2dc .AND. sn_qsr%nfreqh /= 24 )   &  
    159             &   CALL ctl_stop( 'sbc_blk_core: ln_dm2dc can be activated only with daily short-wave forcing' )  
     170         IF( ln_dm2dc .AND. sn_qsr%nfreqh /= 24 )   & 
     171            &   CALL ctl_stop( 'sbc_blk_core: ln_dm2dc can be activated only with daily short-wave forcing' ) 
    160172         IF( ln_dm2dc .AND. sn_qsr%ln_tint ) THEN 
    161173            CALL ctl_warn( 'sbc_blk_core: ln_dm2dc is taking care of the temporal interpolation of daily qsr',   & 
    162                  &         '              ==> We force time interpolation = .false. for qsr' ) 
     174               &         '              ==> We force time interpolation = .false. for qsr' ) 
    163175            sn_qsr%ln_tint = .false. 
    164176         ENDIF 
     
    169181         slf_i(jp_prec) = sn_prec   ;   slf_i(jp_snow) = sn_snow 
    170182         slf_i(jp_tdif) = sn_tdif 
    171          !                  
     183         ! 
    172184         lhftau = ln_taudif                        ! do we use HF tau information? 
    173185         jfld = jpfld - COUNT( (/.NOT. lhftau/) ) 
     
    190202      !                                            ! compute the surface ocean fluxes using CORE bulk formulea 
    191203      IF( MOD( kt - 1, nn_fsbc ) == 0 )   CALL blk_oce_core( kt, sf, sst_m, ssu_m, ssv_m ) 
    192  
    193       ! If diurnal cycle is activated, compute a daily mean short waves flux for biogeochemistery  
    194       IF( ltrcdm2dc )   CALL blk_bio_meanqsr 
    195204 
    196205#if defined key_cice 
     
    226235      !!              - qsr     : Solar heat flux over the ocean        (W/m2) 
    227236      !!              - qns     : Non Solar heat flux over the ocean    (W/m2) 
    228       !!              - evap    : Evaporation over the ocean            (kg/m2/s) 
    229237      !!              - emp     : evaporation minus precipitation       (kg/m2/s) 
    230238      !! 
     
    269277      zwnd_j(:,:) = 0.e0 
    270278#if defined key_cyclone 
    271 # if defined key_vectopt_loop 
    272 !CDIR COLLAPSE 
    273 # endif 
    274       CALL wnd_cyc( kt, zwnd_i, zwnd_j )    ! add Manu ! 
     279      CALL wnd_cyc( kt, zwnd_i, zwnd_j )    ! add analytical tropical cyclone (Vincent et al. JGR 2012) 
    275280      DO jj = 2, jpjm1 
    276281         DO ji = fs_2, fs_jpim1   ! vect. opt. 
     
    279284         END DO 
    280285      END DO 
    281 #endif 
    282 #if defined key_vectopt_loop 
    283 !CDIR COLLAPSE 
    284286#endif 
    285287      DO jj = 2, jpjm1 
     
    292294      CALL lbc_lnk( zwnd_j(:,:) , 'T', -1. ) 
    293295      ! ... scalar wind ( = | U10m - U_oce | ) at T-point (masked) 
    294 !CDIR NOVERRCHK 
    295 !CDIR COLLAPSE 
    296296      wndm(:,:) = SQRT(  zwnd_i(:,:) * zwnd_i(:,:)   & 
    297297         &             + zwnd_j(:,:) * zwnd_j(:,:)  ) * tmask(:,:,1) 
     
    300300      !      I   Radiative FLUXES                                                     ! 
    301301      ! ----------------------------------------------------------------------------- ! 
    302      
     302 
    303303      ! ocean albedo assumed to be constant + modify now Qsr to include the diurnal cycle                    ! Short Wave 
    304304      zztmp = 1. - albo 
     
    306306      ELSE                  ;   qsr(:,:) = zztmp *          sf(jp_qsr)%fnow(:,:,1)   * tmask(:,:,1) 
    307307      ENDIF 
    308 !CDIR COLLAPSE 
     308 
    309309      zqlw(:,:) = (  sf(jp_qlw)%fnow(:,:,1) - Stef * zst(:,:)*zst(:,:)*zst(:,:)*zst(:,:)  ) * tmask(:,:,1)   ! Long  Wave 
    310310      ! ----------------------------------------------------------------------------- ! 
     
    313313 
    314314      ! ... specific humidity at SST and IST 
    315 !CDIR NOVERRCHK 
    316 !CDIR COLLAPSE 
    317       zqsatw(:,:) = zcoef_qsatw * EXP( -5107.4 / zst(:,:) )  
     315      zqsatw(:,:) = zcoef_qsatw * EXP( -5107.4 / zst(:,:) ) 
    318316 
    319317      ! ... NCAR Bulk formulae, computation of Cd, Ch, Ce at T-point : 
    320       IF( ln_2m ) THEN 
    321          !! If air temp. and spec. hum. are given at different height (2m) than wind (10m) : 
    322          CALL TURB_CORE_2Z(2.,10., zst   , sf(jp_tair)%fnow,         & 
    323             &                      zqsatw, sf(jp_humi)%fnow, wndm,   & 
    324             &                      Cd    , Ch              , Ce  ,   & 
    325             &                      zt_zu , zq_zu                   ) 
    326       ELSE IF( ln_bulk2z ) THEN 
    327          !! If the height of the air temp./spec. hum. and wind are to be specified by hand : 
    328          IF( rn_zqt == rn_zu ) THEN 
    329             !! If air temp. and spec. hum. are at the same height as wind : 
    330             CALL TURB_CORE_1Z( rn_zu, zst   , sf(jp_tair)%fnow(:,:,1),       & 
    331                &                      zqsatw, sf(jp_humi)%fnow(:,:,1), wndm, & 
    332                &                      Cd    , Ch                     , Ce  ) 
    333          ELSE 
    334             !! If air temp. and spec. hum. are at a different height to wind : 
    335             CALL TURB_CORE_2Z(rn_zqt, rn_zu , zst   , sf(jp_tair)%fnow,         & 
    336                &                              zqsatw, sf(jp_humi)%fnow, wndm,   & 
    337                &                              Cd    , Ch              , Ce  ,   & 
    338                &                              zt_zu , zq_zu                 ) 
    339          ENDIF 
    340       ELSE 
    341          !! If air temp. and spec. hum. are given at same height than wind (10m) : 
    342 !gm bug?  at the compiling phase, add a copy in temporary arrays...  ==> check perf 
    343 !         CALL TURB_CORE_1Z( 10., zst   (:,:), sf(jp_tair)%fnow(:,:),              & 
    344 !            &                    zqsatw(:,:), sf(jp_humi)%fnow(:,:), wndm(:,:),   & 
    345 !            &                    Cd    (:,:),             Ch  (:,:), Ce  (:,:)  ) 
    346 !gm bug 
    347 ! ARPDBG - this won't compile with gfortran. Fix but check performance 
    348 ! as per comment above. 
    349          CALL TURB_CORE_1Z( 10., zst   , sf(jp_tair)%fnow(:,:,1),       & 
    350             &                    zqsatw, sf(jp_humi)%fnow(:,:,1), wndm, & 
    351             &                    Cd    , Ch              , Ce    ) 
    352       ENDIF 
    353  
     318      CALL turb_core_2z( rn_zqt, rn_zu, zst, sf(jp_tair)%fnow, zqsatw, sf(jp_humi)%fnow, wndm,   & 
     319         &               Cd, Ch, Ce, zt_zu, zq_zu ) 
     320     
    354321      ! ... tau module, i and j component 
    355322      DO jj = 1, jpj 
     
    363330 
    364331      ! ... add the HF tau contribution to the wind stress module? 
    365       IF( lhftau ) THEN  
    366 !CDIR COLLAPSE 
     332      IF( lhftau ) THEN 
    367333         taum(:,:) = taum(:,:) + sf(jp_tdif)%fnow(:,:,1) 
    368334      ENDIF 
     
    371337      ! ... utau, vtau at U- and V_points, resp. 
    372338      !     Note the use of 0.5*(2-umask) in order to unmask the stress along coastlines 
     339      !     Note the use of MAX(tmask(i,j),tmask(i+1,j) is to mask tau over ice shelves 
    373340      DO jj = 1, jpjm1 
    374341         DO ji = 1, fs_jpim1 
    375             utau(ji,jj) = 0.5 * ( 2. - umask(ji,jj,1) ) * ( zwnd_i(ji,jj) + zwnd_i(ji+1,jj  ) ) 
    376             vtau(ji,jj) = 0.5 * ( 2. - vmask(ji,jj,1) ) * ( zwnd_j(ji,jj) + zwnd_j(ji  ,jj+1) ) 
     342            utau(ji,jj) = 0.5 * ( 2. - umask(ji,jj,1) ) * ( zwnd_i(ji,jj) + zwnd_i(ji+1,jj  ) ) & 
     343               &          * MAX(tmask(ji,jj,1),tmask(ji+1,jj,1)) 
     344            vtau(ji,jj) = 0.5 * ( 2. - vmask(ji,jj,1) ) * ( zwnd_j(ji,jj) + zwnd_j(ji  ,jj+1) ) & 
     345               &          * MAX(tmask(ji,jj,1),tmask(ji,jj+1,1)) 
    377346         END DO 
    378347      END DO 
     
    380349      CALL lbc_lnk( vtau(:,:), 'V', -1. ) 
    381350 
     351     
    382352      !  Turbulent fluxes over ocean 
    383353      ! ----------------------------- 
    384       IF( ln_2m .OR. ( ln_bulk2z .AND. rn_zqt /= rn_zu ) ) THEN 
    385          ! Values of temp. and hum. adjusted to height of wind must be used 
    386          zevap(:,:) = rn_efac * MAX( 0.e0, rhoa    *Ce(:,:)*( zqsatw(:,:) - zq_zu(:,:) ) * wndm(:,:) )  ! Evaporation 
    387          zqsb (:,:) =                      rhoa*cpa*Ch(:,:)*( zst   (:,:) - zt_zu(:,:) ) * wndm(:,:)     ! Sensible Heat 
     354      IF( ABS( rn_zu - rn_zqt) < 0.01_wp ) THEN 
     355         !! q_air and t_air are (or "are almost") given at 10m (wind reference height) 
     356         zevap(:,:) = rn_efac*MAX( 0._wp,     rhoa*Ce(:,:)*( zqsatw(:,:) - sf(jp_humi)%fnow(:,:,1) )*wndm(:,:) ) ! Evaporation 
     357         zqsb (:,:) =                     cpa*rhoa*Ch(:,:)*( zst   (:,:) - sf(jp_tair)%fnow(:,:,1) )*wndm(:,:)   ! Sensible Heat 
    388358      ELSE 
    389 !CDIR COLLAPSE 
    390          zevap(:,:) = rn_efac * MAX( 0.e0, rhoa    *Ce(:,:)*( zqsatw(:,:) - sf(jp_humi)%fnow(:,:,1) ) * wndm(:,:) )   ! Evaporation 
    391 !CDIR COLLAPSE 
    392          zqsb (:,:) =            rhoa*cpa*Ch(:,:)*( zst   (:,:) - sf(jp_tair)%fnow(:,:,1) ) * wndm(:,:)     ! Sensible Heat 
    393       ENDIF 
    394 !CDIR COLLAPSE 
     359         !! q_air and t_air are not given at 10m (wind reference height) 
     360         ! Values of temp. and hum. adjusted to height of wind during bulk algorithm iteration must be used!!! 
     361         zevap(:,:) = rn_efac*MAX( 0._wp,     rhoa*Ce(:,:)*( zqsatw(:,:) - zq_zu(:,:) )*wndm(:,:) )   ! Evaporation 
     362         zqsb (:,:) =                     cpa*rhoa*Ch(:,:)*( zst   (:,:) - zt_zu(:,:) )*wndm(:,:)     ! Sensible Heat 
     363      ENDIF 
    395364      zqla (:,:) = Lv * zevap(:,:)                                                              ! Latent Heat 
    396365 
     
    409378      !     III    Total FLUXES                                                       ! 
    410379      ! ----------------------------------------------------------------------------- ! 
    411       
    412 !CDIR COLLAPSE 
     380      ! 
    413381      emp (:,:) = (  zevap(:,:)                                          &   ! mass flux (evap. - precip.) 
    414382         &         - sf(jp_prec)%fnow(:,:,1) * rn_pfac  ) * tmask(:,:,1) 
    415 !CDIR COLLAPSE 
    416       qns(:,:) = zqlw(:,:) - zqsb(:,:) - zqla(:,:)                                &   ! Downward Non Solar flux 
     383      ! 
     384      qns(:,:) = zqlw(:,:) - zqsb(:,:) - zqla(:,:)                                &   ! Downward Non Solar  
    417385         &     - sf(jp_snow)%fnow(:,:,1) * rn_pfac * lfus                         &   ! remove latent melting heat for solid precip 
    418386         &     - zevap(:,:) * pst(:,:) * rcp                                      &   ! remove evap heat content at SST 
    419387         &     + ( sf(jp_prec)%fnow(:,:,1) - sf(jp_snow)%fnow(:,:,1) ) * rn_pfac  &   ! add liquid precip heat content at Tair 
    420          &     * ( sf(jp_tair)%fnow(:,:,1) - rt0 ) * rcp                          &    
     388         &     * ( sf(jp_tair)%fnow(:,:,1) - rt0 ) * rcp                          & 
    421389         &     + sf(jp_snow)%fnow(:,:,1) * rn_pfac                                &   ! add solid  precip heat content at min(Tair,Tsnow) 
    422          &     * ( MIN( sf(jp_tair)%fnow(:,:,1), rt0_snow ) - rt0 ) * cpic  
    423       ! 
    424       CALL iom_put( "qlw_oce",   zqlw )                 ! output downward longwave heat over the ocean 
    425       CALL iom_put( "qsb_oce", - zqsb )                 ! output downward sensible heat over the ocean 
    426       CALL iom_put( "qla_oce", - zqla )                 ! output downward latent   heat over the ocean 
    427       CALL iom_put( "qhc_oce",   qns-zqlw+zqsb+zqla )   ! output downward heat content of E-P over the ocean 
    428       CALL iom_put( "qns_oce",   qns  )                 ! output downward non solar heat over the ocean 
     390         &     * ( MIN( sf(jp_tair)%fnow(:,:,1), rt0_snow ) - rt0 ) * cpic * tmask(:,:,1) 
     391      ! 
     392#if defined key_lim3 
     393      qns_oce(:,:) = zqlw(:,:) - zqsb(:,:) - zqla(:,:)                                ! non solar without emp (only needed by LIM3) 
     394      qsr_oce(:,:) = qsr(:,:) 
     395#endif 
     396      ! 
     397      IF ( nn_ice == 0 ) THEN 
     398         CALL iom_put( "qlw_oce" ,   zqlw )                 ! output downward longwave heat over the ocean 
     399         CALL iom_put( "qsb_oce" , - zqsb )                 ! output downward sensible heat over the ocean 
     400         CALL iom_put( "qla_oce" , - zqla )                 ! output downward latent   heat over the ocean 
     401         CALL iom_put( "qemp_oce",   qns-zqlw+zqsb+zqla )   ! output downward heat content of E-P over the ocean 
     402         CALL iom_put( "qns_oce" ,   qns  )                 ! output downward non solar heat over the ocean 
     403         CALL iom_put( "qsr_oce" ,   qsr  )                 ! output downward solar heat over the ocean 
     404         CALL iom_put( "qt_oce"  ,   qns+qsr )              ! output total downward heat over the ocean 
     405      ENDIF 
    429406      ! 
    430407      IF(ln_ctl) THEN 
     
    442419      ! 
    443420   END SUBROUTINE blk_oce_core 
    444    
    445    SUBROUTINE blk_bio_meanqsr 
    446       !!--------------------------------------------------------------------- 
    447       !!                     ***  ROUTINE blk_bio_meanqsr 
    448       !!                      
    449       !! ** Purpose :   provide daily qsr_mean for PISCES when 
    450       !!                analytic diurnal cycle is applied in physic 
    451       !!                 
    452       !! ** Method  :   add part where there is no ice 
    453       !!  
    454       !!--------------------------------------------------------------------- 
    455       IF( nn_timing == 1 )  CALL timing_start('blk_bio_meanqsr') 
    456  
    457       qsr_mean(:,:) = (1. - albo ) *  sf(jp_qsr)%fnow(:,:,1) 
    458  
    459       IF( nn_timing == 1 )  CALL timing_stop('blk_bio_meanqsr') 
    460  
    461    END SUBROUTINE blk_bio_meanqsr 
    462421  
    463   
    464    SUBROUTINE blk_ice_meanqsr(palb,p_qsr_mean,pdim) 
    465       !!--------------------------------------------------------------------- 
    466       !! 
    467       !! ** Purpose :   provide the daily qsr_mean over sea_ice for PISCES when 
    468       !!                analytic diurnal cycle is applied in physic 
    469       !! 
    470       !! ** Method  :   compute qsr 
    471       !!  
    472       !!--------------------------------------------------------------------- 
    473       REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   palb       ! ice albedo (clear sky) (alb_ice_cs)               [%] 
    474       REAL(wp), DIMENSION(:,:,:), INTENT(  out) ::   p_qsr_mean !     solar heat flux over ice (T-point)         [W/m2] 
    475       INTEGER                   , INTENT(in   ) ::   pdim       ! number of ice categories 
    476       !! 
    477       INTEGER  ::   ijpl          ! number of ice categories (size of 3rd dim of input arrays) 
    478       INTEGER  ::   ji, jj, jl    ! dummy loop indices 
    479       REAL(wp) ::   zztmp         ! temporary variable 
    480       !!--------------------------------------------------------------------- 
    481       IF( nn_timing == 1 )  CALL timing_start('blk_ice_meanqsr') 
    482       ! 
    483       ijpl  = pdim                            ! number of ice categories 
    484       zztmp = 1. / ( 1. - albo ) 
    485       !                                     ! ========================== ! 
    486       DO jl = 1, ijpl                       !  Loop over ice categories  ! 
    487          !                                  ! ========================== ! 
    488          DO jj = 1 , jpj 
    489             DO ji = 1, jpi 
    490                   p_qsr_mean(ji,jj,jl) = zztmp * ( 1. - palb(ji,jj,jl) ) * qsr_mean(ji,jj) 
     422    
     423#if defined key_lim2 || defined key_lim3 
     424   SUBROUTINE blk_ice_core_tau 
     425      !!--------------------------------------------------------------------- 
     426      !!                     ***  ROUTINE blk_ice_core_tau  *** 
     427      !! 
     428      !! ** Purpose :   provide the surface boundary condition over sea-ice 
     429      !! 
     430      !! ** Method  :   compute momentum using CORE bulk 
     431      !!                formulea, ice variables and read atmospheric fields. 
     432      !!                NB: ice drag coefficient is assumed to be a constant 
     433      !!--------------------------------------------------------------------- 
     434      INTEGER  ::   ji, jj    ! dummy loop indices 
     435      REAL(wp) ::   zcoef_wnorm, zcoef_wnorm2 
     436      REAL(wp) ::   zwnorm_f, zwndi_f , zwndj_f               ! relative wind module and components at F-point 
     437      REAL(wp) ::             zwndi_t , zwndj_t               ! relative wind components at T-point 
     438      !!--------------------------------------------------------------------- 
     439      ! 
     440      IF( nn_timing == 1 )  CALL timing_start('blk_ice_core_tau') 
     441      ! 
     442      ! local scalars ( place there for vector optimisation purposes) 
     443      zcoef_wnorm  = rhoa * Cice 
     444      zcoef_wnorm2 = rhoa * Cice * 0.5 
     445 
     446!!gm brutal.... 
     447      utau_ice  (:,:) = 0._wp 
     448      vtau_ice  (:,:) = 0._wp 
     449      wndm_ice  (:,:) = 0._wp 
     450!!gm end 
     451 
     452      ! ----------------------------------------------------------------------------- ! 
     453      !    Wind components and module relative to the moving ocean ( U10m - U_ice )   ! 
     454      ! ----------------------------------------------------------------------------- ! 
     455      SELECT CASE( cp_ice_msh ) 
     456      CASE( 'I' )                  ! B-grid ice dynamics :   I-point (i.e. F-point with sea-ice indexation) 
     457         !                           and scalar wind at T-point ( = | U10m - U_ice | ) (masked) 
     458         DO jj = 2, jpjm1 
     459            DO ji = 2, jpim1   ! B grid : NO vector opt 
     460               ! ... scalar wind at I-point (fld being at T-point) 
     461               zwndi_f = 0.25 * (  sf(jp_wndi)%fnow(ji-1,jj  ,1) + sf(jp_wndi)%fnow(ji  ,jj  ,1)   & 
     462                  &              + sf(jp_wndi)%fnow(ji-1,jj-1,1) + sf(jp_wndi)%fnow(ji  ,jj-1,1)  ) - rn_vfac * u_ice(ji,jj) 
     463               zwndj_f = 0.25 * (  sf(jp_wndj)%fnow(ji-1,jj  ,1) + sf(jp_wndj)%fnow(ji  ,jj  ,1)   & 
     464                  &              + sf(jp_wndj)%fnow(ji-1,jj-1,1) + sf(jp_wndj)%fnow(ji  ,jj-1,1)  ) - rn_vfac * v_ice(ji,jj) 
     465               zwnorm_f = zcoef_wnorm * SQRT( zwndi_f * zwndi_f + zwndj_f * zwndj_f ) 
     466               ! ... ice stress at I-point 
     467               utau_ice(ji,jj) = zwnorm_f * zwndi_f 
     468               vtau_ice(ji,jj) = zwnorm_f * zwndj_f 
     469               ! ... scalar wind at T-point (fld being at T-point) 
     470               zwndi_t = sf(jp_wndi)%fnow(ji,jj,1) - rn_vfac * 0.25 * (  u_ice(ji,jj+1) + u_ice(ji+1,jj+1)   & 
     471                  &                                                    + u_ice(ji,jj  ) + u_ice(ji+1,jj  )  ) 
     472               zwndj_t = sf(jp_wndj)%fnow(ji,jj,1) - rn_vfac * 0.25 * (  v_ice(ji,jj+1) + v_ice(ji+1,jj+1)   & 
     473                  &                                                    + v_ice(ji,jj  ) + v_ice(ji+1,jj  )  ) 
     474               wndm_ice(ji,jj)  = SQRT( zwndi_t * zwndi_t + zwndj_t * zwndj_t ) * tmask(ji,jj,1) 
    491475            END DO 
    492476         END DO 
    493       END DO 
    494       ! 
    495       IF( nn_timing == 1 )  CALL timing_stop('blk_ice_meanqsr') 
    496       ! 
    497    END SUBROUTINE blk_ice_meanqsr   
    498   
    499     
    500    SUBROUTINE blk_ice_core(  pst   , pui   , pvi   , palb ,   & 
    501       &                      p_taui, p_tauj, p_qns , p_qsr,   & 
    502       &                      p_qla , p_dqns, p_dqla,          & 
    503       &                      p_tpr , p_spr ,                  & 
    504       &                      p_fr1 , p_fr2 , cd_grid, pdim  )  
    505       !!--------------------------------------------------------------------- 
    506       !!                     ***  ROUTINE blk_ice_core  *** 
     477         CALL lbc_lnk( utau_ice, 'I', -1. ) 
     478         CALL lbc_lnk( vtau_ice, 'I', -1. ) 
     479         CALL lbc_lnk( wndm_ice, 'T',  1. ) 
     480         ! 
     481      CASE( 'C' )                  ! C-grid ice dynamics :   U & V-points (same as ocean) 
     482         DO jj = 2, jpj 
     483            DO ji = fs_2, jpi   ! vect. opt. 
     484               zwndi_t = (  sf(jp_wndi)%fnow(ji,jj,1) - rn_vfac * 0.5 * ( u_ice(ji-1,jj  ) + u_ice(ji,jj) )  ) 
     485               zwndj_t = (  sf(jp_wndj)%fnow(ji,jj,1) - rn_vfac * 0.5 * ( v_ice(ji  ,jj-1) + v_ice(ji,jj) )  ) 
     486               wndm_ice(ji,jj) = SQRT( zwndi_t * zwndi_t + zwndj_t * zwndj_t ) * tmask(ji,jj,1) 
     487            END DO 
     488         END DO 
     489         DO jj = 2, jpjm1 
     490            DO ji = fs_2, fs_jpim1   ! vect. opt. 
     491               utau_ice(ji,jj) = zcoef_wnorm2 * ( wndm_ice(ji+1,jj  ) + wndm_ice(ji,jj) )                          & 
     492                  &          * ( 0.5 * (sf(jp_wndi)%fnow(ji+1,jj,1) + sf(jp_wndi)%fnow(ji,jj,1) ) - rn_vfac * u_ice(ji,jj) ) 
     493               vtau_ice(ji,jj) = zcoef_wnorm2 * ( wndm_ice(ji,jj+1  ) + wndm_ice(ji,jj) )                          & 
     494                  &          * ( 0.5 * (sf(jp_wndj)%fnow(ji,jj+1,1) + sf(jp_wndj)%fnow(ji,jj,1) ) - rn_vfac * v_ice(ji,jj) ) 
     495            END DO 
     496         END DO 
     497         CALL lbc_lnk( utau_ice, 'U', -1. ) 
     498         CALL lbc_lnk( vtau_ice, 'V', -1. ) 
     499         CALL lbc_lnk( wndm_ice, 'T',  1. ) 
     500         ! 
     501      END SELECT 
     502 
     503      IF(ln_ctl) THEN 
     504         CALL prt_ctl(tab2d_1=utau_ice  , clinfo1=' blk_ice_core: utau_ice : ', tab2d_2=vtau_ice  , clinfo2=' vtau_ice : ') 
     505         CALL prt_ctl(tab2d_1=wndm_ice  , clinfo1=' blk_ice_core: wndm_ice : ') 
     506      ENDIF 
     507 
     508      IF( nn_timing == 1 )  CALL timing_stop('blk_ice_core_tau') 
     509       
     510   END SUBROUTINE blk_ice_core_tau 
     511 
     512 
     513   SUBROUTINE blk_ice_core_flx( ptsu, palb ) 
     514      !!--------------------------------------------------------------------- 
     515      !!                     ***  ROUTINE blk_ice_core_flx  *** 
    507516      !! 
    508517      !! ** Purpose :   provide the surface boundary condition over sea-ice 
    509518      !! 
    510       !! ** Method  :   compute momentum, heat and freshwater exchanged 
     519      !! ** Method  :   compute heat and freshwater exchanged 
    511520      !!                between atmosphere and sea-ice using CORE bulk 
    512521      !!                formulea, ice variables and read atmmospheric fields. 
    513       !!                NB: ice drag coefficient is assumed to be a constant 
    514522      !!  
    515523      !! caution : the net upward water flux has with mm/day unit 
    516524      !!--------------------------------------------------------------------- 
    517       REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   pst      ! ice surface temperature (>0, =rt0 over land) [Kelvin] 
    518       REAL(wp), DIMENSION(:,:)  , INTENT(in   ) ::   pui      ! ice surface velocity (i- and i- components      [m/s] 
    519       REAL(wp), DIMENSION(:,:)  , INTENT(in   ) ::   pvi      !    at I-point (B-grid) or U & V-point (C-grid) 
    520       REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   palb     ! ice albedo (clear sky) (alb_ice_cs)               [%] 
    521       REAL(wp), DIMENSION(:,:)  , INTENT(  out) ::   p_taui   ! i- & j-components of surface ice stress        [N/m2] 
    522       REAL(wp), DIMENSION(:,:)  , INTENT(  out) ::   p_tauj   !   at I-point (B-grid) or U & V-point (C-grid) 
    523       REAL(wp), DIMENSION(:,:,:), INTENT(  out) ::   p_qns    ! non solar heat flux over ice (T-point)         [W/m2] 
    524       REAL(wp), DIMENSION(:,:,:), INTENT(  out) ::   p_qsr    !     solar heat flux over ice (T-point)         [W/m2] 
    525       REAL(wp), DIMENSION(:,:,:), INTENT(  out) ::   p_qla    ! latent    heat flux over ice (T-point)         [W/m2] 
    526       REAL(wp), DIMENSION(:,:,:), INTENT(  out) ::   p_dqns   ! non solar heat sensistivity  (T-point)         [W/m2] 
    527       REAL(wp), DIMENSION(:,:,:), INTENT(  out) ::   p_dqla   ! latent    heat sensistivity  (T-point)         [W/m2] 
    528       REAL(wp), DIMENSION(:,:)  , INTENT(  out) ::   p_tpr    ! total precipitation          (T-point)      [Kg/m2/s] 
    529       REAL(wp), DIMENSION(:,:)  , INTENT(  out) ::   p_spr    ! solid precipitation          (T-point)      [Kg/m2/s] 
    530       REAL(wp), DIMENSION(:,:)  , INTENT(  out) ::   p_fr1    ! 1sr fraction of qsr penetration in ice (T-point)  [%] 
    531       REAL(wp), DIMENSION(:,:)  , INTENT(  out) ::   p_fr2    ! 2nd fraction of qsr penetration in ice (T-point)  [%] 
    532       CHARACTER(len=1)          , INTENT(in   ) ::   cd_grid  ! ice grid ( C or B-grid) 
    533       INTEGER                   , INTENT(in   ) ::   pdim     ! number of ice categories 
     525      REAL(wp), DIMENSION(:,:,:), INTENT(in)  ::   ptsu          ! sea ice surface temperature 
     526      REAL(wp), DIMENSION(:,:,:), INTENT(in)  ::   palb          ! ice albedo (all skies) 
    534527      !! 
    535528      INTEGER  ::   ji, jj, jl    ! dummy loop indices 
    536       INTEGER  ::   ijpl          ! number of ice categories (size of 3rd dim of input arrays) 
    537529      REAL(wp) ::   zst2, zst3 
    538       REAL(wp) ::   zcoef_wnorm, zcoef_wnorm2, zcoef_dqlw, zcoef_dqla, zcoef_dqsb 
    539       REAL(wp) ::   zztmp                                        ! temporary variable 
    540       REAL(wp) ::   zcoef_frca                                   ! fractional cloud amount 
    541       REAL(wp) ::   zwnorm_f, zwndi_f , zwndj_f                  ! relative wind module and components at F-point 
    542       REAL(wp) ::             zwndi_t , zwndj_t                  ! relative wind components at T-point 
    543       !! 
    544       REAL(wp), DIMENSION(:,:)  , POINTER ::   z_wnds_t          ! wind speed ( = | U10m - U_ice | ) at T-point 
     530      REAL(wp) ::   zcoef_dqlw, zcoef_dqla, zcoef_dqsb 
     531      REAL(wp) ::   zztmp, z1_lsub                               ! temporary variable 
     532      !! 
    545533      REAL(wp), DIMENSION(:,:,:), POINTER ::   z_qlw             ! long wave heat flux over ice 
    546534      REAL(wp), DIMENSION(:,:,:), POINTER ::   z_qsb             ! sensible  heat flux over ice 
    547535      REAL(wp), DIMENSION(:,:,:), POINTER ::   z_dqlw            ! long wave heat sensitivity over ice 
    548536      REAL(wp), DIMENSION(:,:,:), POINTER ::   z_dqsb            ! sensible  heat sensitivity over ice 
    549       !!--------------------------------------------------------------------- 
    550       ! 
    551       IF( nn_timing == 1 )  CALL timing_start('blk_ice_core') 
    552       ! 
    553       CALL wrk_alloc( jpi,jpj, z_wnds_t ) 
    554       CALL wrk_alloc( jpi,jpj,pdim, z_qlw, z_qsb, z_dqlw, z_dqsb )  
    555  
    556       ijpl  = pdim                            ! number of ice categories 
     537      REAL(wp), DIMENSION(:,:)  , POINTER ::   zevap, zsnw       ! evaporation and snw distribution after wind blowing (LIM3) 
     538      !!--------------------------------------------------------------------- 
     539      ! 
     540      IF( nn_timing == 1 )  CALL timing_start('blk_ice_core_flx') 
     541      ! 
     542      CALL wrk_alloc( jpi,jpj,jpl, z_qlw, z_qsb, z_dqlw, z_dqsb )  
    557543 
    558544      ! local scalars ( place there for vector optimisation purposes) 
    559       zcoef_wnorm  = rhoa * Cice 
    560       zcoef_wnorm2 = rhoa * Cice * 0.5 
    561545      zcoef_dqlw   = 4.0 * 0.95 * Stef 
    562546      zcoef_dqla   = -Ls * Cice * 11637800. * (-5897.8) 
    563547      zcoef_dqsb   = rhoa * cpa * Cice 
    564       zcoef_frca   = 1.0  - 0.3 
    565  
    566 !!gm brutal.... 
    567       z_wnds_t(:,:) = 0.e0 
    568       p_taui  (:,:) = 0.e0 
    569       p_tauj  (:,:) = 0.e0 
    570 !!gm end 
    571  
    572 #if defined key_lim3 
    573       tatm_ice(:,:) = sf(jp_tair)%fnow(:,:,1)   ! LIM3: make Tair available in sea-ice. WARNING allocated after call to ice_init 
    574 #endif 
    575       ! ----------------------------------------------------------------------------- ! 
    576       !    Wind components and module relative to the moving ocean ( U10m - U_ice )   ! 
    577       ! ----------------------------------------------------------------------------- ! 
    578       SELECT CASE( cd_grid ) 
    579       CASE( 'I' )                  ! B-grid ice dynamics :   I-point (i.e. F-point with sea-ice indexation) 
    580          !                           and scalar wind at T-point ( = | U10m - U_ice | ) (masked) 
    581 !CDIR NOVERRCHK 
    582          DO jj = 2, jpjm1 
    583             DO ji = 2, jpim1   ! B grid : NO vector opt 
    584                ! ... scalar wind at I-point (fld being at T-point) 
    585                zwndi_f = 0.25 * (  sf(jp_wndi)%fnow(ji-1,jj  ,1) + sf(jp_wndi)%fnow(ji  ,jj  ,1)   & 
    586                   &              + sf(jp_wndi)%fnow(ji-1,jj-1,1) + sf(jp_wndi)%fnow(ji  ,jj-1,1)  ) - rn_vfac * pui(ji,jj) 
    587                zwndj_f = 0.25 * (  sf(jp_wndj)%fnow(ji-1,jj  ,1) + sf(jp_wndj)%fnow(ji  ,jj  ,1)   & 
    588                   &              + sf(jp_wndj)%fnow(ji-1,jj-1,1) + sf(jp_wndj)%fnow(ji  ,jj-1,1)  ) - rn_vfac * pvi(ji,jj) 
    589                zwnorm_f = zcoef_wnorm * SQRT( zwndi_f * zwndi_f + zwndj_f * zwndj_f ) 
    590                ! ... ice stress at I-point 
    591                p_taui(ji,jj) = zwnorm_f * zwndi_f 
    592                p_tauj(ji,jj) = zwnorm_f * zwndj_f 
    593                ! ... scalar wind at T-point (fld being at T-point) 
    594                zwndi_t = sf(jp_wndi)%fnow(ji,jj,1) - rn_vfac * 0.25 * (  pui(ji,jj+1) + pui(ji+1,jj+1)   & 
    595                   &                                                    + pui(ji,jj  ) + pui(ji+1,jj  )  ) 
    596                zwndj_t = sf(jp_wndj)%fnow(ji,jj,1) - rn_vfac * 0.25 * (  pvi(ji,jj+1) + pvi(ji+1,jj+1)   & 
    597                   &                                                    + pvi(ji,jj  ) + pvi(ji+1,jj  )  ) 
    598                z_wnds_t(ji,jj)  = SQRT( zwndi_t * zwndi_t + zwndj_t * zwndj_t ) * tmask(ji,jj,1) 
    599             END DO 
    600          END DO 
    601          CALL lbc_lnk( p_taui  , 'I', -1. ) 
    602          CALL lbc_lnk( p_tauj  , 'I', -1. ) 
    603          CALL lbc_lnk( z_wnds_t, 'T',  1. ) 
    604          ! 
    605       CASE( 'C' )                  ! C-grid ice dynamics :   U & V-points (same as ocean) 
    606 #if defined key_vectopt_loop 
    607 !CDIR COLLAPSE 
    608 #endif 
    609          DO jj = 2, jpj 
    610             DO ji = fs_2, jpi   ! vect. opt. 
    611                zwndi_t = (  sf(jp_wndi)%fnow(ji,jj,1) - rn_vfac * 0.5 * ( pui(ji-1,jj  ) + pui(ji,jj) )  ) 
    612                zwndj_t = (  sf(jp_wndj)%fnow(ji,jj,1) - rn_vfac * 0.5 * ( pvi(ji  ,jj-1) + pvi(ji,jj) )  ) 
    613                z_wnds_t(ji,jj)  = SQRT( zwndi_t * zwndi_t + zwndj_t * zwndj_t ) * tmask(ji,jj,1) 
    614             END DO 
    615          END DO 
    616 #if defined key_vectopt_loop 
    617 !CDIR COLLAPSE 
    618 #endif 
    619          DO jj = 2, jpjm1 
    620             DO ji = fs_2, fs_jpim1   ! vect. opt. 
    621                p_taui(ji,jj) = zcoef_wnorm2 * ( z_wnds_t(ji+1,jj  ) + z_wnds_t(ji,jj) )                          & 
    622                   &          * ( 0.5 * (sf(jp_wndi)%fnow(ji+1,jj,1) + sf(jp_wndi)%fnow(ji,jj,1) ) - rn_vfac * pui(ji,jj) ) 
    623                p_tauj(ji,jj) = zcoef_wnorm2 * ( z_wnds_t(ji,jj+1  ) + z_wnds_t(ji,jj) )                          & 
    624                   &          * ( 0.5 * (sf(jp_wndj)%fnow(ji,jj+1,1) + sf(jp_wndj)%fnow(ji,jj,1) ) - rn_vfac * pvi(ji,jj) ) 
    625             END DO 
    626          END DO 
    627          CALL lbc_lnk( p_taui  , 'U', -1. ) 
    628          CALL lbc_lnk( p_tauj  , 'V', -1. ) 
    629          CALL lbc_lnk( z_wnds_t, 'T',  1. ) 
    630          ! 
    631       END SELECT 
    632548 
    633549      zztmp = 1. / ( 1. - albo ) 
    634550      !                                     ! ========================== ! 
    635       DO jl = 1, ijpl                       !  Loop over ice categories  ! 
     551      DO jl = 1, jpl                        !  Loop over ice categories  ! 
    636552         !                                  ! ========================== ! 
    637 !CDIR NOVERRCHK 
    638 !CDIR COLLAPSE 
    639553         DO jj = 1 , jpj 
    640 !CDIR NOVERRCHK 
    641554            DO ji = 1, jpi 
    642555               ! ----------------------------! 
    643556               !      I   Radiative FLUXES   ! 
    644557               ! ----------------------------! 
    645                zst2 = pst(ji,jj,jl) * pst(ji,jj,jl) 
    646                zst3 = pst(ji,jj,jl) * zst2 
     558               zst2 = ptsu(ji,jj,jl) * ptsu(ji,jj,jl) 
     559               zst3 = ptsu(ji,jj,jl) * zst2 
    647560               ! Short Wave (sw) 
    648                p_qsr(ji,jj,jl) = zztmp * ( 1. - palb(ji,jj,jl) ) * qsr(ji,jj) 
     561               qsr_ice(ji,jj,jl) = zztmp * ( 1. - palb(ji,jj,jl) ) * qsr(ji,jj) 
    649562               ! Long  Wave (lw) 
    650                ! iovino 
    651                IF( ff(ji,jj) .GT. 0._wp ) THEN 
    652                   z_qlw(ji,jj,jl) = ( 0.95 * sf(jp_qlw)%fnow(ji,jj,1) - Stef * pst(ji,jj,jl) * zst3 ) * tmask(ji,jj,1) 
    653                ELSE 
    654                   z_qlw(ji,jj,jl) = 0.95 * ( sf(jp_qlw)%fnow(ji,jj,1) - Stef * pst(ji,jj,jl) * zst3 ) * tmask(ji,jj,1) 
    655                ENDIF 
     563               z_qlw(ji,jj,jl) = 0.95 * ( sf(jp_qlw)%fnow(ji,jj,1) - Stef * ptsu(ji,jj,jl) * zst3 ) * tmask(ji,jj,1) 
    656564               ! lw sensitivity 
    657565               z_dqlw(ji,jj,jl) = zcoef_dqlw * zst3                                                
     
    663571               ! ... turbulent heat fluxes 
    664572               ! Sensible Heat 
    665                z_qsb(ji,jj,jl) = rhoa * cpa * Cice * z_wnds_t(ji,jj) * ( pst(ji,jj,jl) - sf(jp_tair)%fnow(ji,jj,1) ) 
     573               z_qsb(ji,jj,jl) = rhoa * cpa * Cice * wndm_ice(ji,jj) * ( ptsu(ji,jj,jl) - sf(jp_tair)%fnow(ji,jj,1) ) 
    666574               ! Latent Heat 
    667                p_qla(ji,jj,jl) = rn_efac * MAX( 0.e0, rhoa * Ls  * Cice * z_wnds_t(ji,jj)   &                            
    668                   &                         * (  11637800. * EXP( -5897.8 / pst(ji,jj,jl) ) / rhoa - sf(jp_humi)%fnow(ji,jj,1)  ) ) 
    669                ! Latent heat sensitivity for ice (Dqla/Dt) 
    670                p_dqla(ji,jj,jl) = rn_efac * zcoef_dqla * z_wnds_t(ji,jj) / ( zst2 ) * EXP( -5897.8 / pst(ji,jj,jl) ) 
     575               qla_ice(ji,jj,jl) = rn_efac * MAX( 0.e0, rhoa * Ls  * Cice * wndm_ice(ji,jj)   &                            
     576                  &                         * (  11637800. * EXP( -5897.8 / ptsu(ji,jj,jl) ) / rhoa - sf(jp_humi)%fnow(ji,jj,1)  ) ) 
     577              ! Latent heat sensitivity for ice (Dqla/Dt) 
     578               IF( qla_ice(ji,jj,jl) > 0._wp ) THEN 
     579                  dqla_ice(ji,jj,jl) = rn_efac * zcoef_dqla * wndm_ice(ji,jj) / ( zst2 ) * EXP( -5897.8 / ptsu(ji,jj,jl) ) 
     580               ELSE 
     581                  dqla_ice(ji,jj,jl) = 0._wp 
     582               ENDIF 
     583 
    671584               ! Sensible heat sensitivity (Dqsb_ice/Dtn_ice) 
    672                z_dqsb(ji,jj,jl) = zcoef_dqsb * z_wnds_t(ji,jj) 
     585               z_dqsb(ji,jj,jl) = zcoef_dqsb * wndm_ice(ji,jj) 
    673586 
    674587               ! ----------------------------! 
     
    676589               ! ----------------------------! 
    677590               ! Downward Non Solar flux 
    678                p_qns (ji,jj,jl) =     z_qlw (ji,jj,jl) - z_qsb (ji,jj,jl) - p_qla (ji,jj,jl)       
     591               qns_ice (ji,jj,jl) =     z_qlw (ji,jj,jl) - z_qsb (ji,jj,jl) - qla_ice (ji,jj,jl) 
    679592               ! Total non solar heat flux sensitivity for ice 
    680                p_dqns(ji,jj,jl) = - ( z_dqlw(ji,jj,jl) + z_dqsb(ji,jj,jl) + p_dqla(ji,jj,jl) )     
     593               dqns_ice(ji,jj,jl) = - ( z_dqlw(ji,jj,jl) + z_dqsb(ji,jj,jl) + dqla_ice(ji,jj,jl) ) 
    681594            END DO 
    682595            ! 
     
    685598      END DO 
    686599      ! 
     600      tprecip(:,:) = sf(jp_prec)%fnow(:,:,1) * rn_pfac      ! total precipitation [kg/m2/s] 
     601      sprecip(:,:) = sf(jp_snow)%fnow(:,:,1) * rn_pfac      ! solid precipitation [kg/m2/s] 
     602      CALL iom_put( 'snowpre', sprecip * 86400. )                  ! Snow precipitation 
     603      CALL iom_put( 'precip' , tprecip * 86400. )                  ! Total precipitation 
     604 
     605#if defined  key_lim3 
     606      CALL wrk_alloc( jpi,jpj, zevap, zsnw )  
     607 
     608      ! --- evaporation --- ! 
     609      z1_lsub = 1._wp / Lsub 
     610      evap_ice (:,:,:) = qla_ice (:,:,:) * z1_lsub ! sublimation 
     611      devap_ice(:,:,:) = dqla_ice(:,:,:) * z1_lsub 
     612      zevap    (:,:)   = emp(:,:) + tprecip(:,:)   ! evaporation over ocean 
     613 
     614      ! --- evaporation minus precipitation --- ! 
     615      zsnw(:,:) = 0._wp 
     616      CALL lim_thd_snwblow( pfrld, zsnw )  ! snow distribution over ice after wind blowing  
     617      emp_oce(:,:) = pfrld(:,:) * zevap(:,:) - ( tprecip(:,:) - sprecip(:,:) ) - sprecip(:,:) * (1._wp - zsnw ) 
     618      emp_ice(:,:) = SUM( a_i_b(:,:,:) * evap_ice(:,:,:), dim=3 ) - sprecip(:,:) * zsnw 
     619      emp_tot(:,:) = emp_oce(:,:) + emp_ice(:,:) 
     620 
     621      ! --- heat flux associated with emp --- ! 
     622      qemp_oce(:,:) = - pfrld(:,:) * zevap(:,:) * sst_m(:,:) * rcp                               & ! evap at sst 
     623         &          + ( tprecip(:,:) - sprecip(:,:) ) * ( sf(jp_tair)%fnow(:,:,1) - rt0 ) * rcp  & ! liquid precip at Tair 
     624         &          +   sprecip(:,:) * ( 1._wp - zsnw ) *                                        & ! solid precip at min(Tair,Tsnow) 
     625         &              ( ( MIN( sf(jp_tair)%fnow(:,:,1), rt0_snow ) - rt0 ) * cpic * tmask(:,:,1) - lfus ) 
     626      qemp_ice(:,:) =   sprecip(:,:) * zsnw *                                                    & ! solid precip (only) 
     627         &              ( ( MIN( sf(jp_tair)%fnow(:,:,1), rt0_snow ) - rt0 ) * cpic * tmask(:,:,1) - lfus ) 
     628 
     629      ! --- total solar and non solar fluxes --- ! 
     630      qns_tot(:,:) = pfrld(:,:) * qns_oce(:,:) + SUM( a_i_b(:,:,:) * qns_ice(:,:,:), dim=3 ) + qemp_ice(:,:) + qemp_oce(:,:) 
     631      qsr_tot(:,:) = pfrld(:,:) * qsr_oce(:,:) + SUM( a_i_b(:,:,:) * qsr_ice(:,:,:), dim=3 ) 
     632 
     633      ! --- heat content of precip over ice in J/m3 (to be used in 1D-thermo) --- ! 
     634      qprec_ice(:,:) = rhosn * ( ( MIN( sf(jp_tair)%fnow(:,:,1), rt0_snow ) - rt0 ) * cpic * tmask(:,:,1) - lfus ) 
     635 
     636      CALL wrk_dealloc( jpi,jpj, zevap, zsnw )  
     637#endif 
     638 
    687639      !-------------------------------------------------------------------- 
    688640      ! FRACTIONs of net shortwave radiation which is not absorbed in the 
    689641      ! thin surface layer and penetrates inside the ice cover 
    690642      ! ( Maykut and Untersteiner, 1971 ; Ebert and Curry, 1993 ) 
    691      
    692 !CDIR COLLAPSE 
    693       p_fr1(:,:) = ( 0.18 * ( 1.0 - zcoef_frca ) + 0.35 * zcoef_frca ) 
    694 !CDIR COLLAPSE 
    695       p_fr2(:,:) = ( 0.82 * ( 1.0 - zcoef_frca ) + 0.65 * zcoef_frca ) 
    696         
    697 !CDIR COLLAPSE 
    698       p_tpr(:,:) = sf(jp_prec)%fnow(:,:,1) * rn_pfac      ! total precipitation [kg/m2/s] 
    699 !CDIR COLLAPSE 
    700       p_spr(:,:) = sf(jp_snow)%fnow(:,:,1) * rn_pfac      ! solid precipitation [kg/m2/s] 
    701       CALL iom_put( 'snowpre', p_spr * 86400. )                  ! Snow precipitation  
    702       CALL iom_put( 'precip', p_tpr * 86400. )                   ! Total precipitation  
     643      ! 
     644      fr1_i0(:,:) = ( 0.18 * ( 1.0 - cldf_ice ) + 0.35 * cldf_ice ) 
     645      fr2_i0(:,:) = ( 0.82 * ( 1.0 - cldf_ice ) + 0.65 * cldf_ice ) 
     646      ! 
    703647      ! 
    704648      IF(ln_ctl) THEN 
    705          CALL prt_ctl(tab3d_1=p_qla   , clinfo1=' blk_ice_core: p_qla  : ', tab3d_2=z_qsb   , clinfo2=' z_qsb  : ', kdim=ijpl) 
    706          CALL prt_ctl(tab3d_1=z_qlw   , clinfo1=' blk_ice_core: z_qlw  : ', tab3d_2=p_dqla  , clinfo2=' p_dqla : ', kdim=ijpl) 
    707          CALL prt_ctl(tab3d_1=z_dqsb  , clinfo1=' blk_ice_core: z_dqsb : ', tab3d_2=z_dqlw  , clinfo2=' z_dqlw : ', kdim=ijpl) 
    708          CALL prt_ctl(tab3d_1=p_dqns  , clinfo1=' blk_ice_core: p_dqns : ', tab3d_2=p_qsr   , clinfo2=' p_qsr  : ', kdim=ijpl) 
    709          CALL prt_ctl(tab3d_1=pst     , clinfo1=' blk_ice_core: pst    : ', tab3d_2=p_qns   , clinfo2=' p_qns  : ', kdim=ijpl) 
    710          CALL prt_ctl(tab2d_1=p_tpr   , clinfo1=' blk_ice_core: p_tpr  : ', tab2d_2=p_spr   , clinfo2=' p_spr  : ') 
    711          CALL prt_ctl(tab2d_1=p_taui  , clinfo1=' blk_ice_core: p_taui : ', tab2d_2=p_tauj  , clinfo2=' p_tauj : ') 
    712          CALL prt_ctl(tab2d_1=z_wnds_t, clinfo1=' blk_ice_core: z_wnds_t : ') 
    713       ENDIF 
    714  
    715       CALL wrk_dealloc( jpi,jpj, z_wnds_t ) 
    716       CALL wrk_dealloc( jpi,jpj,pdim, z_qlw, z_qsb, z_dqlw, z_dqsb )  
    717       ! 
    718       IF( nn_timing == 1 )  CALL timing_stop('blk_ice_core') 
    719       ! 
    720    END SUBROUTINE blk_ice_core 
    721    
    722  
    723    SUBROUTINE TURB_CORE_1Z(zu, sst, T_a, q_sat, q_a,   & 
    724       &                        dU , Cd , Ch   , Ce   ) 
     649         CALL prt_ctl(tab3d_1=qla_ice , clinfo1=' blk_ice_core: qla_ice  : ', tab3d_2=z_qsb   , clinfo2=' z_qsb    : ', kdim=jpl) 
     650         CALL prt_ctl(tab3d_1=z_qlw   , clinfo1=' blk_ice_core: z_qlw    : ', tab3d_2=dqla_ice, clinfo2=' dqla_ice : ', kdim=jpl) 
     651         CALL prt_ctl(tab3d_1=z_dqsb  , clinfo1=' blk_ice_core: z_dqsb   : ', tab3d_2=z_dqlw  , clinfo2=' z_dqlw   : ', kdim=jpl) 
     652         CALL prt_ctl(tab3d_1=dqns_ice, clinfo1=' blk_ice_core: dqns_ice : ', tab3d_2=qsr_ice , clinfo2=' qsr_ice  : ', kdim=jpl) 
     653         CALL prt_ctl(tab3d_1=ptsu    , clinfo1=' blk_ice_core: ptsu     : ', tab3d_2=qns_ice , clinfo2=' qns_ice  : ', kdim=jpl) 
     654         CALL prt_ctl(tab2d_1=tprecip , clinfo1=' blk_ice_core: tprecip  : ', tab2d_2=sprecip , clinfo2=' sprecip  : ') 
     655      ENDIF 
     656 
     657      CALL wrk_dealloc( jpi,jpj,jpl, z_qlw, z_qsb, z_dqlw, z_dqsb ) 
     658      ! 
     659      IF( nn_timing == 1 )  CALL timing_stop('blk_ice_core_flx') 
     660       
     661   END SUBROUTINE blk_ice_core_flx 
     662#endif 
     663 
     664   SUBROUTINE turb_core_2z( zt, zu, sst, T_zt, q_sat, q_zt, dU,    & 
     665      &                      Cd, Ch, Ce , T_zu, q_zu ) 
    725666      !!---------------------------------------------------------------------- 
    726667      !!                      ***  ROUTINE  turb_core  *** 
    727668      !! 
    728669      !! ** Purpose :   Computes turbulent transfert coefficients of surface 
    729       !!                fluxes according to Large & Yeager (2004) 
    730       !! 
    731       !! ** Method  :   I N E R T I A L   D I S S I P A T I O N   M E T H O D 
    732       !!      Momentum, Latent and sensible heat exchange coefficients 
    733       !!      Caution: this procedure should only be used in cases when air 
    734       !!      temperature (T_air), air specific humidity (q_air) and wind (dU) 
    735       !!      are provided at the same height 'zzu'! 
    736       !! 
    737       !! References :   Large & Yeager, 2004 : ??? 
    738       !!---------------------------------------------------------------------- 
    739       REAL(wp)                , INTENT(in   ) ::   zu      ! altitude of wind measurement       [m] 
    740       REAL(wp), DIMENSION(:,:), INTENT(in   ) ::   sst     ! sea surface temperature         [Kelvin] 
    741       REAL(wp), DIMENSION(:,:), INTENT(in   ) ::   T_a     ! potential air temperature       [Kelvin] 
    742       REAL(wp), DIMENSION(:,:), INTENT(in   ) ::   q_sat   ! sea surface specific humidity   [kg/kg] 
    743       REAL(wp), DIMENSION(:,:), INTENT(in   ) ::   q_a     ! specific air humidity           [kg/kg] 
    744       REAL(wp), DIMENSION(:,:), INTENT(in   ) ::   dU      ! wind module |U(zu)-U(0)|        [m/s] 
    745       REAL(wp), DIMENSION(:,:), INTENT(  out) ::   Cd      ! transfert coefficient for momentum       (tau) 
    746       REAL(wp), DIMENSION(:,:), INTENT(  out) ::   Ch      ! transfert coefficient for temperature (Q_sens) 
    747       REAL(wp), DIMENSION(:,:), INTENT(  out) ::   Ce      ! transfert coefficient for evaporation  (Q_lat) 
    748       !! 
    749       INTEGER :: j_itt 
    750       INTEGER , PARAMETER ::   nb_itt = 3 
    751       REAL(wp), PARAMETER ::   grav   = 9.8   ! gravity                        
    752       REAL(wp), PARAMETER ::   kappa  = 0.4   ! von Karman s constant 
    753  
    754       REAL(wp), DIMENSION(:,:), POINTER  ::   dU10          ! dU                                   [m/s] 
    755       REAL(wp), DIMENSION(:,:), POINTER  ::   dT            ! air/sea temperature differeence      [K] 
    756       REAL(wp), DIMENSION(:,:), POINTER  ::   dq            ! air/sea humidity difference          [K] 
    757       REAL(wp), DIMENSION(:,:), POINTER  ::   Cd_n10        ! 10m neutral drag coefficient 
    758       REAL(wp), DIMENSION(:,:), POINTER  ::   Ce_n10        ! 10m neutral latent coefficient 
    759       REAL(wp), DIMENSION(:,:), POINTER  ::   Ch_n10        ! 10m neutral sensible coefficient 
    760       REAL(wp), DIMENSION(:,:), POINTER  ::   sqrt_Cd_n10   ! root square of Cd_n10 
    761       REAL(wp), DIMENSION(:,:), POINTER  ::   sqrt_Cd       ! root square of Cd 
    762       REAL(wp), DIMENSION(:,:), POINTER  ::   T_vpot        ! virtual potential temperature        [K] 
    763       REAL(wp), DIMENSION(:,:), POINTER  ::   T_star        ! turbulent scale of tem. fluct. 
    764       REAL(wp), DIMENSION(:,:), POINTER  ::   q_star        ! turbulent humidity of temp. fluct. 
    765       REAL(wp), DIMENSION(:,:), POINTER  ::   U_star        ! turb. scale of velocity fluct. 
    766       REAL(wp), DIMENSION(:,:), POINTER  ::   L             ! Monin-Obukov length                  [m] 
    767       REAL(wp), DIMENSION(:,:), POINTER  ::   zeta          ! stability parameter at height zu 
    768       REAL(wp), DIMENSION(:,:), POINTER  ::   U_n10         ! neutral wind velocity at 10m         [m]    
    769       REAL(wp), DIMENSION(:,:), POINTER  ::   xlogt, xct, zpsi_h, zpsi_m 
    770        
    771       INTEGER , DIMENSION(:,:), POINTER  ::   stab          ! 1st guess stability test integer 
    772       !!---------------------------------------------------------------------- 
    773       ! 
    774       IF( nn_timing == 1 )  CALL timing_start('TURB_CORE_1Z') 
    775       ! 
    776       CALL wrk_alloc( jpi,jpj, stab )   ! integer 
    777       CALL wrk_alloc( jpi,jpj, dU10, dT, dq, Cd_n10, Ce_n10, Ch_n10, sqrt_Cd_n10, sqrt_Cd, L ) 
    778       CALL wrk_alloc( jpi,jpj, T_vpot, T_star, q_star, U_star, zeta, U_n10, xlogt, xct, zpsi_h, zpsi_m ) 
    779  
    780       !! * Start 
    781       !! Air/sea differences 
    782       dU10 = max(0.5, dU)     ! we don't want to fall under 0.5 m/s 
    783       dT = T_a - sst          ! assuming that T_a is allready the potential temp. at zzu 
    784       dq = q_a - q_sat 
    785       !!     
    786       !! Virtual potential temperature 
    787       T_vpot = T_a*(1. + 0.608*q_a) 
    788       !! 
    789       !! Neutral Drag Coefficient 
    790       stab    = 0.5 + sign(0.5,dT)    ! stable : stab = 1 ; unstable : stab = 0  
    791       IF  ( ln_cdgw ) THEN 
    792         cdn_wave = cdn_wave - rsmall*(tmask(:,:,1)-1) 
    793         Cd_n10(:,:) =   cdn_wave 
    794       ELSE 
    795         Cd_n10  = 1.e-3 * ( 2.7/dU10 + 0.142 + dU10/13.09 )    !   L & Y eq. (6a) 
    796       ENDIF 
    797       sqrt_Cd_n10 = sqrt(Cd_n10) 
    798       Ce_n10  = 1.e-3 * ( 34.6 * sqrt_Cd_n10 )               !   L & Y eq. (6b) 
    799       Ch_n10  = 1.e-3*sqrt_Cd_n10*(18.*stab + 32.7*(1.-stab)) !   L & Y eq. (6c), (6d) 
    800       !! 
    801       !! Initializing transfert coefficients with their first guess neutral equivalents : 
    802       Cd = Cd_n10 ;  Ce = Ce_n10 ;  Ch = Ch_n10 ;  sqrt_Cd = sqrt(Cd) 
    803  
    804       !! * Now starting iteration loop 
    805       DO j_itt=1, nb_itt 
    806          !! Turbulent scales : 
    807          U_star  = sqrt_Cd*dU10                !   L & Y eq. (7a) 
    808          T_star  = Ch/sqrt_Cd*dT               !   L & Y eq. (7b) 
    809          q_star  = Ce/sqrt_Cd*dq               !   L & Y eq. (7c) 
    810  
    811          !! Estimate the Monin-Obukov length : 
    812          L  = (U_star**2)/( kappa*grav*(T_star/T_vpot + q_star/(q_a + 1./0.608)) ) 
    813  
    814          !! Stability parameters : 
    815          zeta  = zu/L ;  zeta   = sign( min(abs(zeta),10.0), zeta ) 
    816          zpsi_h  = psi_h(zeta) 
    817          zpsi_m  = psi_m(zeta) 
    818  
    819          IF  ( ln_cdgw ) THEN 
    820            sqrt_Cd=kappa/((kappa/sqrt_Cd_n10) - zpsi_m) ; Cd=sqrt_Cd*sqrt_Cd; 
    821          ELSE 
    822            !! Shifting the wind speed to 10m and neutral stability : 
    823            U_n10 = dU10*1./(1. + sqrt_Cd_n10/kappa*(log(zu/10.) - zpsi_m)) !  L & Y eq. (9a) 
    824  
    825            !! Updating the neutral 10m transfer coefficients : 
    826            Cd_n10  = 1.e-3 * (2.7/U_n10 + 0.142 + U_n10/13.09)              !  L & Y eq. (6a) 
    827            sqrt_Cd_n10 = sqrt(Cd_n10) 
    828            Ce_n10  = 1.e-3 * (34.6 * sqrt_Cd_n10)                           !  L & Y eq. (6b) 
    829            stab    = 0.5 + sign(0.5,zeta) 
    830            Ch_n10  = 1.e-3*sqrt_Cd_n10*(18.*stab + 32.7*(1.-stab))           !  L & Y eq. (6c), (6d) 
    831  
    832            !! Shifting the neutral  10m transfer coefficients to ( zu , zeta ) : 
    833            !! 
    834            xct = 1. + sqrt_Cd_n10/kappa*(log(zu/10) - zpsi_m) 
    835            Cd  = Cd_n10/(xct*xct) ;  sqrt_Cd = sqrt(Cd) 
    836          ENDIF 
    837          !! 
    838          xlogt = log(zu/10.) - zpsi_h 
    839          !! 
    840          xct = 1. + Ch_n10*xlogt/kappa/sqrt_Cd_n10 
    841          Ch  = Ch_n10*sqrt_Cd/sqrt_Cd_n10/xct 
    842          !! 
    843          xct = 1. + Ce_n10*xlogt/kappa/sqrt_Cd_n10 
    844          Ce  = Ce_n10*sqrt_Cd/sqrt_Cd_n10/xct 
    845          !! 
    846       END DO 
    847       !! 
    848       CALL wrk_dealloc( jpi,jpj, stab )   ! integer 
    849       CALL wrk_dealloc( jpi,jpj, dU10, dT, dq, Cd_n10, Ce_n10, Ch_n10, sqrt_Cd_n10, sqrt_Cd, L ) 
    850       CALL wrk_dealloc( jpi,jpj, T_vpot, T_star, q_star, U_star, zeta, U_n10, xlogt, xct, zpsi_h, zpsi_m ) 
    851       ! 
    852       IF( nn_timing == 1 )  CALL timing_stop('TURB_CORE_1Z') 
    853       ! 
    854     END SUBROUTINE TURB_CORE_1Z 
    855  
    856  
    857     SUBROUTINE TURB_CORE_2Z(zt, zu, sst, T_zt, q_sat, q_zt, dU, Cd, Ch, Ce, T_zu, q_zu) 
    858       !!---------------------------------------------------------------------- 
    859       !!                      ***  ROUTINE  turb_core  *** 
    860       !! 
    861       !! ** Purpose :   Computes turbulent transfert coefficients of surface  
    862       !!                fluxes according to Large & Yeager (2004). 
    863       !! 
    864       !! ** Method  :   I N E R T I A L   D I S S I P A T I O N   M E T H O D 
    865       !!      Momentum, Latent and sensible heat exchange coefficients 
    866       !!      Caution: this procedure should only be used in cases when air 
    867       !!      temperature (T_air) and air specific humidity (q_air) are at a 
    868       !!      different height to wind (dU). 
    869       !! 
    870       !! References :   Large & Yeager, 2004 : ??? 
     670      !!                fluxes according to Large & Yeager (2004) and Large & Yeager (2008) 
     671      !!                If relevant (zt /= zu), adjust temperature and humidity from height zt to zu 
     672      !! 
     673      !! ** Method : Monin Obukhov Similarity Theory  
     674      !!             + Large & Yeager (2004,2008) closure: CD_n10 = f(U_n10) 
     675      !! 
     676      !! ** References :   Large & Yeager, 2004 / Large & Yeager, 2008 
     677      !! 
     678      !! ** Last update: Laurent Brodeau, June 2014: 
     679      !!    - handles both cases zt=zu and zt/=zu 
     680      !!    - optimized: less 2D arrays allocated and less operations 
     681      !!    - better first guess of stability by checking air-sea difference of virtual temperature 
     682      !!       rather than temperature difference only... 
     683      !!    - added function "cd_neutral_10m" that uses the improved parametrization of  
     684      !!      Large & Yeager 2008. Drag-coefficient reduction for Cyclone conditions! 
     685      !!    - using code-wide physical constants defined into "phycst.mod" rather than redifining them 
     686      !!      => 'vkarmn' and 'grav' 
    871687      !!---------------------------------------------------------------------- 
    872688      REAL(wp), INTENT(in   )                     ::   zt       ! height for T_zt and q_zt                   [m] 
     
    876692      REAL(wp), INTENT(in   ), DIMENSION(jpi,jpj) ::   q_sat    ! sea surface specific humidity         [kg/kg] 
    877693      REAL(wp), INTENT(in   ), DIMENSION(jpi,jpj) ::   q_zt     ! specific air humidity                 [kg/kg] 
    878       REAL(wp), INTENT(in   ), DIMENSION(jpi,jpj) ::   dU       ! relative wind module |U(zu)-U(0)|       [m/s] 
     694      REAL(wp), INTENT(in   ), DIMENSION(jpi,jpj) ::   dU       ! relative wind module at zu            [m/s] 
    879695      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   Cd       ! transfer coefficient for momentum         (tau) 
    880696      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   Ch       ! transfer coefficient for sensible heat (Q_sens) 
     
    882698      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   T_zu     ! air temp. shifted at zu                     [K] 
    883699      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   q_zu     ! spec. hum.  shifted at zu               [kg/kg] 
    884  
    885       INTEGER :: j_itt 
    886       INTEGER , PARAMETER :: nb_itt = 5              ! number of itterations 
    887       REAL(wp), PARAMETER ::   grav   = 9.8          ! gravity                        
    888       REAL(wp), PARAMETER ::   kappa  = 0.4          ! von Karman's constant 
    889        
    890       REAL(wp), DIMENSION(:,:), POINTER ::   dU10          ! dU                                [m/s] 
    891       REAL(wp), DIMENSION(:,:), POINTER ::   dT            ! air/sea temperature differeence   [K] 
    892       REAL(wp), DIMENSION(:,:), POINTER ::   dq            ! air/sea humidity difference       [K] 
    893       REAL(wp), DIMENSION(:,:), POINTER ::   Cd_n10        ! 10m neutral drag coefficient 
     700      ! 
     701      INTEGER ::   j_itt 
     702      INTEGER , PARAMETER ::   nb_itt = 5       ! number of itterations 
     703      LOGICAL ::   l_zt_equal_zu = .FALSE.      ! if q and t are given at different height than U 
     704      ! 
     705      REAL(wp), DIMENSION(:,:), POINTER ::   U_zu          ! relative wind at zu                            [m/s] 
    894706      REAL(wp), DIMENSION(:,:), POINTER ::   Ce_n10        ! 10m neutral latent coefficient 
    895707      REAL(wp), DIMENSION(:,:), POINTER ::   Ch_n10        ! 10m neutral sensible coefficient 
    896708      REAL(wp), DIMENSION(:,:), POINTER ::   sqrt_Cd_n10   ! root square of Cd_n10 
    897709      REAL(wp), DIMENSION(:,:), POINTER ::   sqrt_Cd       ! root square of Cd 
    898       REAL(wp), DIMENSION(:,:), POINTER ::   T_vpot        ! virtual potential temperature        [K] 
    899       REAL(wp), DIMENSION(:,:), POINTER ::   T_star        ! turbulent scale of tem. fluct. 
    900       REAL(wp), DIMENSION(:,:), POINTER ::   q_star        ! turbulent humidity of temp. fluct. 
    901       REAL(wp), DIMENSION(:,:), POINTER ::   U_star        ! turb. scale of velocity fluct. 
    902       REAL(wp), DIMENSION(:,:), POINTER ::   L             ! Monin-Obukov length                  [m] 
    903710      REAL(wp), DIMENSION(:,:), POINTER ::   zeta_u        ! stability parameter at height zu 
    904711      REAL(wp), DIMENSION(:,:), POINTER ::   zeta_t        ! stability parameter at height zt 
    905       REAL(wp), DIMENSION(:,:), POINTER ::   U_n10         ! neutral wind velocity at 10m        [m] 
    906       REAL(wp), DIMENSION(:,:), POINTER ::   xlogt, xct, zpsi_hu, zpsi_ht, zpsi_m 
    907  
    908       INTEGER , DIMENSION(:,:), POINTER ::   stab          ! 1st stability test integer 
     712      REAL(wp), DIMENSION(:,:), POINTER ::   zpsi_h_u, zpsi_m_u 
     713      REAL(wp), DIMENSION(:,:), POINTER ::   ztmp0, ztmp1, ztmp2 
     714      REAL(wp), DIMENSION(:,:), POINTER ::   stab          ! 1st stability test integer 
    909715      !!---------------------------------------------------------------------- 
    910       ! 
    911       IF( nn_timing == 1 )  CALL timing_start('TURB_CORE_2Z') 
    912       ! 
    913       CALL wrk_alloc( jpi,jpj, dU10, dT, dq, Cd_n10, Ce_n10, Ch_n10, sqrt_Cd_n10, sqrt_Cd, L ) 
    914       CALL wrk_alloc( jpi,jpj, T_vpot, T_star, q_star, U_star, zeta_u, zeta_t, U_n10 ) 
    915       CALL wrk_alloc( jpi,jpj, xlogt, xct, zpsi_hu, zpsi_ht, zpsi_m ) 
    916       CALL wrk_alloc( jpi,jpj, stab )   ! interger 
    917  
    918       !! Initial air/sea differences 
    919       dU10 = max(0.5, dU)      !  we don't want to fall under 0.5 m/s 
    920       dT = T_zt - sst  
    921       dq = q_zt - q_sat 
    922  
    923       !! Neutral Drag Coefficient : 
    924       stab = 0.5 + sign(0.5,dT)                 ! stab = 1  if dT > 0  -> STABLE 
    925       IF( ln_cdgw ) THEN 
    926         cdn_wave = cdn_wave - rsmall*(tmask(:,:,1)-1) 
    927         Cd_n10(:,:) =   cdn_wave 
     716 
     717      IF( nn_timing == 1 )  CALL timing_start('turb_core_2z') 
     718     
     719      CALL wrk_alloc( jpi,jpj, U_zu, Ce_n10, Ch_n10, sqrt_Cd_n10, sqrt_Cd ) 
     720      CALL wrk_alloc( jpi,jpj, zeta_u, stab ) 
     721      CALL wrk_alloc( jpi,jpj, zpsi_h_u, zpsi_m_u, ztmp0, ztmp1, ztmp2 ) 
     722 
     723      l_zt_equal_zu = .FALSE. 
     724      IF( ABS(zu - zt) < 0.01 ) l_zt_equal_zu = .TRUE.    ! testing "zu == zt" is risky with double precision 
     725 
     726      IF( .NOT. l_zt_equal_zu )   CALL wrk_alloc( jpi,jpj, zeta_t ) 
     727 
     728      U_zu = MAX( 0.5 , dU )   !  relative wind speed at zu (normally 10m), we don't want to fall under 0.5 m/s 
     729 
     730      !! First guess of stability:  
     731      ztmp0 = T_zt*(1. + 0.608*q_zt) - sst*(1. + 0.608*q_sat) ! air-sea difference of virtual pot. temp. at zt 
     732      stab  = 0.5 + sign(0.5,ztmp0)                           ! stab = 1 if dTv > 0  => STABLE, 0 if unstable 
     733 
     734      !! Neutral coefficients at 10m: 
     735      IF( ln_cdgw ) THEN      ! wave drag case 
     736         cdn_wave(:,:) = cdn_wave(:,:) + rsmall * ( 1._wp - tmask(:,:,1) ) 
     737         ztmp0   (:,:) = cdn_wave(:,:) 
    928738      ELSE 
    929         Cd_n10  = 1.e-3*( 2.7/dU10 + 0.142 + dU10/13.09 )  
    930       ENDIF 
    931       sqrt_Cd_n10 = sqrt(Cd_n10) 
     739         ztmp0 = cd_neutral_10m( U_zu ) 
     740      ENDIF 
     741      sqrt_Cd_n10 = SQRT( ztmp0 ) 
    932742      Ce_n10  = 1.e-3*( 34.6 * sqrt_Cd_n10 ) 
    933743      Ch_n10  = 1.e-3*sqrt_Cd_n10*(18.*stab + 32.7*(1. - stab)) 
    934  
     744     
    935745      !! Initializing transf. coeff. with their first guess neutral equivalents : 
    936       Cd = Cd_n10 ;  Ce = Ce_n10 ;  Ch = Ch_n10 ;  sqrt_Cd = sqrt(Cd) 
    937  
    938       !! Initializing z_u values with z_t values : 
    939       T_zu = T_zt ;  q_zu = q_zt 
     746      Cd = ztmp0   ;   Ce = Ce_n10   ;   Ch = Ch_n10   ;   sqrt_Cd = sqrt_Cd_n10 
     747 
     748      !! Initializing values at z_u with z_t values: 
     749      T_zu = T_zt   ;   q_zu = q_zt 
    940750 
    941751      !!  * Now starting iteration loop 
    942752      DO j_itt=1, nb_itt 
    943          dT = T_zu - sst ;  dq = q_zu - q_sat ! Updating air/sea differences 
    944          T_vpot = T_zu*(1. + 0.608*q_zu)    ! Updating virtual potential temperature at zu 
    945          U_star = sqrt_Cd*dU10                ! Updating turbulent scales :   (L & Y eq. (7)) 
    946          T_star  = Ch/sqrt_Cd*dT              ! 
    947          q_star  = Ce/sqrt_Cd*dq              ! 
    948          !! 
    949          L = (U_star*U_star) &                ! Estimate the Monin-Obukov length at height zu 
    950               & / (kappa*grav/T_vpot*(T_star*(1.+0.608*q_zu) + 0.608*T_zu*q_star)) 
     753         ! 
     754         ztmp1 = T_zu - sst   ! Updating air/sea differences 
     755         ztmp2 = q_zu - q_sat  
     756 
     757         ! Updating turbulent scales :   (L&Y 2004 eq. (7)) 
     758         ztmp1  = Ch/sqrt_Cd*ztmp1    ! theta* 
     759         ztmp2  = Ce/sqrt_Cd*ztmp2    ! q* 
     760        
     761         ztmp0 = T_zu*(1. + 0.608*q_zu) ! virtual potential temperature at zu 
     762 
     763         ! Estimate the inverse of Monin-Obukov length (1/L) at height zu: 
     764         ztmp0 =  (vkarmn*grav/ztmp0*(ztmp1*(1.+0.608*q_zu) + 0.608*T_zu*ztmp2)) / (Cd*U_zu*U_zu)  
     765         !                                                                     ( Cd*U_zu*U_zu is U*^2 at zu) 
     766 
    951767         !! Stability parameters : 
    952          zeta_u  = zu/L  ;  zeta_u = sign( min(abs(zeta_u),10.0), zeta_u ) 
    953          zeta_t  = zt/L  ;  zeta_t = sign( min(abs(zeta_t),10.0), zeta_t ) 
    954          zpsi_hu = psi_h(zeta_u) 
    955          zpsi_ht = psi_h(zeta_t) 
    956          zpsi_m  = psi_m(zeta_u) 
    957          !! 
    958          !! Shifting the wind speed to 10m and neutral stability : (L & Y eq.(9a)) 
    959 !        U_n10 = dU10/(1. + sqrt_Cd_n10/kappa*(log(zu/10.) - psi_m(zeta_u))) 
    960          U_n10 = dU10/(1. + sqrt_Cd_n10/kappa*(log(zu/10.) - zpsi_m)) 
    961          !! 
    962          !! Shifting temperature and humidity at zu :          (L & Y eq. (9b-9c)) 
    963 !        T_zu = T_zt - T_star/kappa*(log(zt/zu) + psi_h(zeta_u) - psi_h(zeta_t)) 
    964          T_zu = T_zt - T_star/kappa*(log(zt/zu) + zpsi_hu - zpsi_ht) 
    965 !        q_zu = q_zt - q_star/kappa*(log(zt/zu) + psi_h(zeta_u) - psi_h(zeta_t)) 
    966          q_zu = q_zt - q_star/kappa*(log(zt/zu) + zpsi_hu - zpsi_ht) 
    967          !! 
    968          !! q_zu cannot have a negative value : forcing 0 
    969          stab = 0.5 + sign(0.5,q_zu) ;  q_zu = stab*q_zu 
    970          !! 
    971          IF( ln_cdgw ) THEN 
    972             sqrt_Cd=kappa/((kappa/sqrt_Cd_n10) - zpsi_m) ; Cd=sqrt_Cd*sqrt_Cd; 
     768         zeta_u   = zu*ztmp0   ;  zeta_u = sign( min(abs(zeta_u),10.0), zeta_u ) 
     769         zpsi_h_u = psi_h( zeta_u ) 
     770         zpsi_m_u = psi_m( zeta_u ) 
     771        
     772         !! Shifting temperature and humidity at zu (L&Y 2004 eq. (9b-9c)) 
     773         IF ( .NOT. l_zt_equal_zu ) THEN 
     774            zeta_t = zt*ztmp0 ;  zeta_t = sign( min(abs(zeta_t),10.0), zeta_t ) 
     775            stab = LOG(zu/zt) - zpsi_h_u + psi_h(zeta_t)  ! stab just used as temp array!!! 
     776            T_zu = T_zt + ztmp1/vkarmn*stab    ! ztmp1 is still theta* 
     777            q_zu = q_zt + ztmp2/vkarmn*stab    ! ztmp2 is still q* 
     778            q_zu = max(0., q_zu) 
     779         END IF 
     780        
     781         IF( ln_cdgw ) THEN      ! surface wave case 
     782            sqrt_Cd = vkarmn / ( vkarmn / sqrt_Cd_n10 - zpsi_m_u )  
     783            Cd      = sqrt_Cd * sqrt_Cd 
    973784         ELSE 
    974            !! Updating the neutral 10m transfer coefficients : 
    975            Cd_n10  = 1.e-3 * (2.7/U_n10 + 0.142 + U_n10/13.09)    ! L & Y eq. (6a) 
    976            sqrt_Cd_n10 = sqrt(Cd_n10) 
    977            Ce_n10  = 1.e-3 * (34.6 * sqrt_Cd_n10)                 ! L & Y eq. (6b) 
    978            stab    = 0.5 + sign(0.5,zeta_u) 
    979            Ch_n10  = 1.e-3*sqrt_Cd_n10*(18.*stab + 32.7*(1.-stab)) ! L & Y eq. (6c-6d) 
    980            !! 
    981            !! 
    982            !! Shifting the neutral 10m transfer coefficients to (zu,zeta_u) : 
    983            xct = 1. + sqrt_Cd_n10/kappa*(log(zu/10.) - zpsi_m)   ! L & Y eq. (10a) 
    984            Cd = Cd_n10/(xct*xct) ; sqrt_Cd = sqrt(Cd) 
     785           ! Update neutral wind speed at 10m and neutral Cd at 10m (L&Y 2004 eq. 9a)... 
     786           !   In very rare low-wind conditions, the old way of estimating the 
     787           !   neutral wind speed at 10m leads to a negative value that causes the code 
     788           !   to crash. To prevent this a threshold of 0.25m/s is imposed. 
     789           ztmp0 = MAX( 0.25 , U_zu/(1. + sqrt_Cd_n10/vkarmn*(LOG(zu/10.) - zpsi_m_u)) ) !  U_n10 
     790           ztmp0 = cd_neutral_10m(ztmp0)                                                 ! Cd_n10 
     791           sqrt_Cd_n10 = sqrt(ztmp0) 
     792        
     793           Ce_n10  = 1.e-3 * (34.6 * sqrt_Cd_n10)                     ! L&Y 2004 eq. (6b) 
     794           stab    = 0.5 + sign(0.5,zeta_u)                           ! update stability 
     795           Ch_n10  = 1.e-3*sqrt_Cd_n10*(18.*stab + 32.7*(1. - stab))  ! L&Y 2004 eq. (6c-6d) 
     796 
     797           !! Update of transfer coefficients: 
     798           ztmp1 = 1. + sqrt_Cd_n10/vkarmn*(LOG(zu/10.) - zpsi_m_u)   ! L&Y 2004 eq. (10a) 
     799           Cd      = ztmp0 / ( ztmp1*ztmp1 )    
     800           sqrt_Cd = SQRT( Cd ) 
    985801         ENDIF 
    986          !! 
    987          xlogt = log(zu/10.) - zpsi_hu 
    988          !! 
    989          xct = 1. + Ch_n10*xlogt/kappa/sqrt_Cd_n10               ! L & Y eq. (10b) 
    990          Ch  = Ch_n10*sqrt_Cd/sqrt_Cd_n10/xct 
    991          !! 
    992          xct = 1. + Ce_n10*xlogt/kappa/sqrt_Cd_n10               ! L & Y eq. (10c) 
    993          Ce  = Ce_n10*sqrt_Cd/sqrt_Cd_n10/xct 
    994          !! 
    995          !! 
     802         ! 
     803         ztmp0 = (LOG(zu/10.) - zpsi_h_u) / vkarmn / sqrt_Cd_n10 
     804         ztmp2 = sqrt_Cd / sqrt_Cd_n10 
     805         ztmp1 = 1. + Ch_n10*ztmp0                
     806         Ch  = Ch_n10*ztmp2 / ztmp1  ! L&Y 2004 eq. (10b) 
     807         ! 
     808         ztmp1 = 1. + Ce_n10*ztmp0                
     809         Ce  = Ce_n10*ztmp2 / ztmp1  ! L&Y 2004 eq. (10c) 
     810         ! 
    996811      END DO 
    997       !! 
    998       CALL wrk_dealloc( jpi,jpj, dU10, dT, dq, Cd_n10, Ce_n10, Ch_n10, sqrt_Cd_n10, sqrt_Cd, L ) 
    999       CALL wrk_dealloc( jpi,jpj, T_vpot, T_star, q_star, U_star, zeta_u, zeta_t, U_n10 ) 
    1000       CALL wrk_dealloc( jpi,jpj, xlogt, xct, zpsi_hu, zpsi_ht, zpsi_m ) 
    1001       CALL wrk_dealloc( jpi,jpj, stab )   ! interger 
    1002       ! 
    1003       IF( nn_timing == 1 )  CALL timing_stop('TURB_CORE_2Z') 
    1004       ! 
    1005     END SUBROUTINE TURB_CORE_2Z 
    1006  
    1007  
    1008     FUNCTION psi_m(zta)   !! Psis, L & Y eq. (8c), (8d), (8e) 
     812 
     813      CALL wrk_dealloc( jpi,jpj, U_zu, Ce_n10, Ch_n10, sqrt_Cd_n10, sqrt_Cd ) 
     814      CALL wrk_dealloc( jpi,jpj, zeta_u, stab ) 
     815      CALL wrk_dealloc( jpi,jpj, zpsi_h_u, zpsi_m_u, ztmp0, ztmp1, ztmp2 ) 
     816 
     817      IF( .NOT. l_zt_equal_zu ) CALL wrk_dealloc( jpi,jpj, zeta_t ) 
     818 
     819      IF( nn_timing == 1 )  CALL timing_stop('turb_core_2z') 
     820      ! 
     821   END SUBROUTINE turb_core_2z 
     822 
     823 
     824   FUNCTION cd_neutral_10m( zw10 ) 
     825      !!---------------------------------------------------------------------- 
     826      !! Estimate of the neutral drag coefficient at 10m as a function  
     827      !! of neutral wind  speed at 10m 
     828      !! 
     829      !! Origin: Large & Yeager 2008 eq.(11a) and eq.(11b) 
     830      !! 
     831      !! Author: L. Brodeau, june 2014 
     832      !!----------------------------------------------------------------------     
     833      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   zw10           ! scalar wind speed at 10m (m/s) 
     834      REAL(wp), DIMENSION(jpi,jpj)             ::   cd_neutral_10m 
     835      ! 
     836      REAL(wp), DIMENSION(:,:), POINTER ::   rgt33 
     837      !!----------------------------------------------------------------------     
     838      ! 
     839      CALL wrk_alloc( jpi,jpj, rgt33 ) 
     840      ! 
     841      !! When wind speed > 33 m/s => Cyclone conditions => special treatment 
     842      rgt33 = 0.5_wp + SIGN( 0.5_wp, (zw10 - 33._wp) )   ! If zw10 < 33. => 0, else => 1   
     843      cd_neutral_10m = 1.e-3 * ( & 
     844         &       (1._wp - rgt33)*( 2.7_wp/zw10 + 0.142_wp + zw10/13.09_wp - 3.14807E-10*zw10**6) & ! zw10< 33. 
     845         &      + rgt33         *      2.34   )                                                    ! zw10 >= 33. 
     846      ! 
     847      CALL wrk_dealloc( jpi,jpj, rgt33) 
     848      ! 
     849   END FUNCTION cd_neutral_10m 
     850 
     851 
     852   FUNCTION psi_m(pta)   !! Psis, L&Y 2004 eq. (8c), (8d), (8e) 
    1009853      !------------------------------------------------------------------------------- 
    1010       REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: zta 
    1011  
    1012       REAL(wp), PARAMETER :: pi = 3.141592653589793_wp 
     854      ! universal profile stability function for momentum 
     855      !------------------------------------------------------------------------------- 
     856      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pta 
     857      ! 
    1013858      REAL(wp), DIMENSION(jpi,jpj)             :: psi_m 
    1014859      REAL(wp), DIMENSION(:,:), POINTER        :: X2, X, stabit 
    1015860      !------------------------------------------------------------------------------- 
    1016  
     861      ! 
    1017862      CALL wrk_alloc( jpi,jpj, X2, X, stabit ) 
    1018  
    1019       X2 = sqrt(abs(1. - 16.*zta))  ;  X2 = max(X2 , 1.0) ;  X  = sqrt(X2) 
    1020       stabit    = 0.5 + sign(0.5,zta) 
    1021       psi_m = -5.*zta*stabit  &                                                          ! Stable 
    1022          &    + (1. - stabit)*(2*log((1. + X)/2) + log((1. + X2)/2) - 2*atan(X) + pi/2)  ! Unstable  
    1023  
     863      ! 
     864      X2 = SQRT( ABS( 1. - 16.*pta ) )  ;  X2 = MAX( X2 , 1. )   ;   X = SQRT( X2 ) 
     865      stabit = 0.5 + SIGN( 0.5 , pta ) 
     866      psi_m = -5.*pta*stabit  &                                                          ! Stable 
     867         &    + (1. - stabit)*(2.*LOG((1. + X)*0.5) + LOG((1. + X2)*0.5) - 2.*ATAN(X) + rpi*0.5)  ! Unstable 
     868      ! 
    1024869      CALL wrk_dealloc( jpi,jpj, X2, X, stabit ) 
    1025870      ! 
    1026     END FUNCTION psi_m 
    1027  
    1028  
    1029     FUNCTION psi_h( zta )    !! Psis, L & Y eq. (8c), (8d), (8e) 
     871   END FUNCTION psi_m 
     872 
     873 
     874   FUNCTION psi_h( pta )    !! Psis, L&Y 2004 eq. (8c), (8d), (8e) 
    1030875      !------------------------------------------------------------------------------- 
    1031       REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   zta 
     876      ! universal profile stability function for temperature and humidity 
     877      !------------------------------------------------------------------------------- 
     878      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   pta 
    1032879      ! 
    1033880      REAL(wp), DIMENSION(jpi,jpj)             ::   psi_h 
    1034       REAL(wp), DIMENSION(:,:), POINTER        :: X2, X, stabit 
     881      REAL(wp), DIMENSION(:,:), POINTER        ::   X2, X, stabit 
    1035882      !------------------------------------------------------------------------------- 
    1036  
     883      ! 
    1037884      CALL wrk_alloc( jpi,jpj, X2, X, stabit ) 
    1038  
    1039       X2 = sqrt(abs(1. - 16.*zta))  ;  X2 = max(X2 , 1.) ;  X  = sqrt(X2) 
    1040       stabit    = 0.5 + sign(0.5,zta) 
    1041       psi_h = -5.*zta*stabit  &                                       ! Stable 
    1042          &    + (1. - stabit)*(2.*log( (1. + X2)/2. ))                 ! Unstable 
    1043  
     885      ! 
     886      X2 = SQRT( ABS( 1. - 16.*pta ) )   ;   X2 = MAX( X2 , 1. )   ;   X = SQRT( X2 ) 
     887      stabit = 0.5 + SIGN( 0.5 , pta ) 
     888      psi_h = -5.*pta*stabit   &                                       ! Stable 
     889         &    + (1. - stabit)*(2.*LOG( (1. + X2)*0.5 ))                ! Unstable 
     890      ! 
    1044891      CALL wrk_dealloc( jpi,jpj, X2, X, stabit ) 
    1045892      ! 
    1046     END FUNCTION psi_h 
    1047    
     893   END FUNCTION psi_h 
     894 
    1048895   !!====================================================================== 
    1049896END MODULE sbcblk_core 
  • branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/sbcblk_mfs.F90

    • Property svn:keywords set to Id
    r4624 r5837  
    4646   !!---------------------------------------------------------------------- 
    4747   !! NEMO/OPA 3.2 , LOCEAN-IPSL (2009)  
    48    !! $Id: sbcblk_mfs.F90 1730 2009-11-16 14:34:19Z poddo $ 
     48   !! $Id$ 
    4949   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 
    5050   !!---------------------------------------------------------------------- 
     
    8282      !!              - utau, vtau  i- and j-component of the wind stress 
    8383      !!              - taum        wind stress module at T-point 
    84       !!              - wndm        10m wind module at T-point 
     84      !!              - wndm        10m wind module at T-point over free ocean or leads in presence of sea-ice 
    8585      !!              - qns, qsr    non-slor and solar heat flux 
    8686      !!              - emp         evaporation minus precipitation 
     
    233233         ! Interpolate utau, vtau into the grid_V and grid_V 
    234234         !------------------------------------------------- 
    235  
     235      !     Note the use of 0.5*(2-umask) in order to unmask the stress along coastlines 
     236      !     Note the use of MAX(tmask(i,j),tmask(i+1,j) is to mask tau over ice shelves 
    236237         DO jj = 1, jpjm1 
    237238            DO ji = 1, fs_jpim1 
    238239               utau(ji,jj) = 0.5 * ( 2. - umask(ji,jj,1) ) * ( utau(ji,jj) * tmask(ji,jj,1) & 
    239                &                                + utau(ji+1,jj) * tmask(ji+1,jj,1) ) 
     240               &                                + utau(ji+1,jj) * tmask(ji+1,jj,1) )        & 
     241               &                 * MAX(tmask(ji,jj,1),tmask(ji+1,jj  ,1)) 
    240242               vtau(ji,jj) = 0.5 * ( 2. - vmask(ji,jj,1) ) * ( vtau(ji,jj) * tmask(ji,jj,1) & 
    241                &                                + vtau(ji,jj+1) * tmask(ji,jj+1,1) ) 
     243               &                                + vtau(ji,jj+1) * tmask(ji,jj+1,1) )        & 
     244               &                 * MAX(tmask(ji,jj,1),tmask(ji  ,jj+1,1)) 
    242245            END DO 
    243246         END DO 
  • branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/sbccpl.F90

    r4624 r5837  
    99   !!            3.4  ! 2011_11  (C. Harris) more flexibility + multi-category fields 
    1010   !!---------------------------------------------------------------------- 
    11 #if defined key_oasis3 || defined key_oasis4 
    12    !!---------------------------------------------------------------------- 
    13    !!   'key_oasis3' or 'key_oasis4'   Coupled Ocean/Atmosphere formulation 
    1411   !!---------------------------------------------------------------------- 
    1512   !!   namsbc_cpl      : coupled formulation namlist 
     
    2421   USE sbc_oce         ! Surface boundary condition: ocean fields 
    2522   USE sbc_ice         ! Surface boundary condition: ice fields 
     23   USE sbcapr 
    2624   USE sbcdcy          ! surface boundary condition: diurnal cycle 
    2725   USE phycst          ! physical constants 
    2826#if defined key_lim3 
    29    USE par_ice         ! ice parameters 
    3027   USE ice             ! ice variables 
    3128#endif 
     
    3431   USE ice_2           ! ice variables 
    3532#endif 
    36 #if defined key_oasis3 
    3733   USE cpl_oasis3      ! OASIS3 coupling 
    38 #endif 
    39 #if defined key_oasis4 
    40    USE cpl_oasis4      ! OASIS4 coupling 
    41 #endif 
    4234   USE geo2ocean       !  
    43    USE oce   , ONLY : tsn, un, vn 
     35   USE oce   , ONLY : tsn, un, vn, sshn, ub, vb, sshb, fraqsr_1lev 
    4436   USE albedo          ! 
    4537   USE in_out_manager  ! I/O manager 
     
    4941   USE timing          ! Timing 
    5042   USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
     43   USE eosbn2 
     44   USE sbcrnf   , ONLY : l_rnfcpl 
    5145#if defined key_cpl_carbon_cycle 
    5246   USE p4zflx, ONLY : oce_co2 
    5347#endif 
    54    USE diaar5, ONLY :   lk_diaar5 
    5548#if defined key_cice 
    5649   USE ice_domain_size, only: ncat 
    5750#endif 
     51#if defined key_lim3 
     52   USE limthd_dh       ! for CALL lim_thd_snwblow 
     53#endif 
     54 
    5855   IMPLICIT NONE 
    5956   PRIVATE 
    6057 
     58   PUBLIC   sbc_cpl_init       ! routine called by sbcmod.F90 
    6159   PUBLIC   sbc_cpl_rcv        ! routine called by sbc_ice_lim(_2).F90 
    6260   PUBLIC   sbc_cpl_snd        ! routine called by step.F90 
    6361   PUBLIC   sbc_cpl_ice_tau    ! routine called by sbc_ice_lim(_2).F90 
    6462   PUBLIC   sbc_cpl_ice_flx    ! routine called by sbc_ice_lim(_2).F90 
     63   PUBLIC   sbc_cpl_alloc      ! routine called in sbcice_cice.F90 
    6564 
    6665   INTEGER, PARAMETER ::   jpr_otx1   =  1            ! 3 atmosphere-ocean stress components on grid 1 
     
    9796   INTEGER, PARAMETER ::   jpr_topm   = 32            ! topmeltn 
    9897   INTEGER, PARAMETER ::   jpr_botm   = 33            ! botmeltn 
    99    INTEGER, PARAMETER ::   jprcv      = 33            ! total number of fields received 
    100  
    101    INTEGER, PARAMETER ::   jps_fice   =  1            ! ice fraction  
     98   INTEGER, PARAMETER ::   jpr_sflx   = 34            ! salt flux 
     99   INTEGER, PARAMETER ::   jpr_toce   = 35            ! ocean temperature 
     100   INTEGER, PARAMETER ::   jpr_soce   = 36            ! ocean salinity 
     101   INTEGER, PARAMETER ::   jpr_ocx1   = 37            ! ocean current on grid 1 
     102   INTEGER, PARAMETER ::   jpr_ocy1   = 38            ! 
     103   INTEGER, PARAMETER ::   jpr_ssh    = 39            ! sea surface height 
     104   INTEGER, PARAMETER ::   jpr_fice   = 40            ! ice fraction           
     105   INTEGER, PARAMETER ::   jpr_e3t1st = 41            ! first T level thickness  
     106   INTEGER, PARAMETER ::   jpr_fraqsr = 42            ! fraction of solar net radiation absorbed in the first ocean level 
     107   INTEGER, PARAMETER ::   jprcv      = 42            ! total number of fields received 
     108 
     109   INTEGER, PARAMETER ::   jps_fice   =  1            ! ice fraction sent to the atmosphere 
    102110   INTEGER, PARAMETER ::   jps_toce   =  2            ! ocean temperature 
    103111   INTEGER, PARAMETER ::   jps_tice   =  3            ! ice   temperature 
     
    114122   INTEGER, PARAMETER ::   jps_ivz1   = 14            ! 
    115123   INTEGER, PARAMETER ::   jps_co2    = 15 
    116    INTEGER, PARAMETER ::   jpsnd      = 15            ! total number of fields sended 
     124   INTEGER, PARAMETER ::   jps_soce   = 16            ! ocean salinity 
     125   INTEGER, PARAMETER ::   jps_ssh    = 17            ! sea surface height 
     126   INTEGER, PARAMETER ::   jps_qsroce = 18            ! Qsr above the ocean 
     127   INTEGER, PARAMETER ::   jps_qnsoce = 19            ! Qns above the ocean 
     128   INTEGER, PARAMETER ::   jps_oemp   = 20            ! ocean freshwater budget (evap - precip) 
     129   INTEGER, PARAMETER ::   jps_sflx   = 21            ! salt flux 
     130   INTEGER, PARAMETER ::   jps_otx1   = 22            ! 2 atmosphere-ocean stress components on grid 1 
     131   INTEGER, PARAMETER ::   jps_oty1   = 23            !  
     132   INTEGER, PARAMETER ::   jps_rnf    = 24            ! runoffs 
     133   INTEGER, PARAMETER ::   jps_taum   = 25            ! wind stress module 
     134   INTEGER, PARAMETER ::   jps_fice2  = 26            ! ice fraction sent to OPA (by SAS when doing SAS-OPA coupling) 
     135   INTEGER, PARAMETER ::   jps_e3t1st = 27            ! first level depth (vvl) 
     136   INTEGER, PARAMETER ::   jps_fraqsr = 28            ! fraction of solar net radiation absorbed in the first ocean level 
     137   INTEGER, PARAMETER ::   jpsnd      = 28            ! total number of fields sended 
    117138 
    118139   !                                                         !!** namelist namsbc_cpl ** 
     
    129150   TYPE(FLD_C) ::   sn_rcv_w10m, sn_rcv_taumod, sn_rcv_tau, sn_rcv_dqnsdt, sn_rcv_qsr, sn_rcv_qns, sn_rcv_emp, sn_rcv_rnf 
    130151   TYPE(FLD_C) ::   sn_rcv_cal, sn_rcv_iceflx, sn_rcv_co2                         
    131  
     152   ! Other namelist parameters                        ! 
     153   INTEGER     ::   nn_cplmodel            ! Maximum number of models to/from which NEMO is potentialy sending/receiving data 
     154   LOGICAL     ::   ln_usecplmask          !  use a coupling mask file to merge data received from several models 
     155                                           !   -> file cplmask.nc with the float variable called cplmask (jpi,jpj,nn_cplmodel) 
    132156   TYPE ::   DYNARR      
    133157      REAL(wp), POINTER, DIMENSION(:,:,:)    ::   z3    
     
    140164   INTEGER , ALLOCATABLE, SAVE, DIMENSION(    :) ::   nrcvinfo           ! OASIS info argument 
    141165 
    142 #if ! defined key_lim2   &&   ! defined key_lim3 
    143    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   u_ice, v_ice,fr1_i0,fr2_i0          ! jpi, jpj 
    144    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   tn_ice, alb_ice, qns_ice, dqns_ice  ! (jpi,jpj,jpl) 
    145 #endif 
    146  
    147 #if defined key_cice 
    148    INTEGER, PARAMETER ::   jpl = ncat 
    149 #elif ! defined key_lim2   &&   ! defined key_lim3 
    150    INTEGER, PARAMETER ::   jpl = 1  
    151    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   emp_ice 
    152    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   qsr_ice 
    153 #endif 
    154  
    155 #if ! defined key_lim3   &&  ! defined key_cice 
    156    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::  a_i 
    157 #endif 
    158  
    159 #if ! defined key_lim3 
    160    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::  ht_i, ht_s 
    161 #endif 
    162  
    163 #if ! defined key_cice 
    164    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::  topmelt, botmelt 
    165 #endif 
    166  
    167166   !! Substitution 
     167#  include "domzgr_substitute.h90" 
    168168#  include "vectopt_loop_substitute.h90" 
    169169   !!---------------------------------------------------------------------- 
     
    179179      !!             ***  FUNCTION sbc_cpl_alloc  *** 
    180180      !!---------------------------------------------------------------------- 
    181       INTEGER :: ierr(4),jn 
     181      INTEGER :: ierr(3) 
    182182      !!---------------------------------------------------------------------- 
    183183      ierr(:) = 0 
    184184      ! 
    185185      ALLOCATE( albedo_oce_mix(jpi,jpj), nrcvinfo(jprcv),  STAT=ierr(1) ) 
    186       ! 
    187 #if ! defined key_lim2 && ! defined key_lim3 
    188       ! quick patch to be able to run the coupled model without sea-ice... 
    189       ALLOCATE( u_ice(jpi,jpj) , fr1_i0(jpi,jpj) , tn_ice (jpi,jpj,1) ,     & 
    190                 v_ice(jpi,jpj) , fr2_i0(jpi,jpj) , alb_ice(jpi,jpj,1),      & 
    191                 emp_ice(jpi,jpj) , qns_ice(jpi,jpj,1) , dqns_ice(jpi,jpj,1) , STAT=ierr(2) ) 
     186       
     187#if ! defined key_lim3 && ! defined key_lim2 && ! defined key_cice 
     188      ALLOCATE( a_i(jpi,jpj,1) , STAT=ierr(2) )  ! used in sbcice_if.F90 (done here as there is no sbc_ice_if_init) 
    192189#endif 
    193  
    194 #if ! defined key_lim3 && ! defined key_cice 
    195       ALLOCATE( a_i(jpi,jpj,jpl) , STAT=ierr(3) ) 
    196 #endif 
    197  
    198 #if defined key_cice || defined key_lim2 
    199       ALLOCATE( ht_i(jpi,jpj,jpl) , ht_s(jpi,jpj,jpl) , STAT=ierr(4) ) 
    200 #endif 
     190      ALLOCATE( xcplmask(jpi,jpj,0:nn_cplmodel) , STAT=ierr(3) ) 
     191      ! 
    201192      sbc_cpl_alloc = MAXVAL( ierr ) 
    202193      IF( lk_mpp            )   CALL mpp_sum ( sbc_cpl_alloc ) 
     
    210201      !!             ***  ROUTINE sbc_cpl_init  *** 
    211202      !! 
    212       !! ** Purpose :   Initialisation of send and recieved information from 
     203      !! ** Purpose :   Initialisation of send and received information from 
    213204      !!                the atmospheric component 
    214205      !! 
     
    218209      !!              * initialise the OASIS coupler 
    219210      !!---------------------------------------------------------------------- 
    220       INTEGER, INTENT(in) ::   k_ice    ! ice management in the sbc (=0/1/2/3) 
     211      INTEGER, INTENT(in) ::   k_ice       ! ice management in the sbc (=0/1/2/3) 
    221212      !! 
    222213      INTEGER ::   jn   ! dummy loop index 
    223214      INTEGER ::   ios  ! Local integer output status for namelist read 
     215      INTEGER ::   inum  
    224216      REAL(wp), POINTER, DIMENSION(:,:) ::   zacs, zaos 
    225217      !! 
    226       NAMELIST/namsbc_cpl/  sn_snd_temp, sn_snd_alb   , sn_snd_thick, sn_snd_crt   , sn_snd_co2,   & 
    227          &                  sn_rcv_w10m, sn_rcv_taumod, sn_rcv_tau  , sn_rcv_dqnsdt, sn_rcv_qsr,   & 
    228          &                  sn_rcv_qns , sn_rcv_emp   , sn_rcv_rnf  , sn_rcv_cal   , sn_rcv_iceflx  , sn_rcv_co2 
     218      NAMELIST/namsbc_cpl/  sn_snd_temp, sn_snd_alb   , sn_snd_thick, sn_snd_crt   , sn_snd_co2,      & 
     219         &                  sn_rcv_w10m, sn_rcv_taumod, sn_rcv_tau  , sn_rcv_dqnsdt, sn_rcv_qsr,      & 
     220         &                  sn_rcv_qns , sn_rcv_emp   , sn_rcv_rnf  , sn_rcv_cal   , sn_rcv_iceflx,   & 
     221         &                  sn_rcv_co2 , nn_cplmodel  , ln_usecplmask 
    229222      !!--------------------------------------------------------------------- 
    230223      ! 
     
    250243         WRITE(numout,*)'sbc_cpl_init : namsbc_cpl namelist ' 
    251244         WRITE(numout,*)'~~~~~~~~~~~~' 
     245      ENDIF 
     246      IF( lwp .AND. ln_cpl ) THEN                        ! control print 
    252247         WRITE(numout,*)'  received fields (mutiple ice categogies)' 
    253248         WRITE(numout,*)'      10m wind module                 = ', TRIM(sn_rcv_w10m%cldes  ), ' (', TRIM(sn_rcv_w10m%clcat  ), ')' 
     
    274269         WRITE(numout,*)'                      - mesh          = ', sn_snd_crt%clvgrd 
    275270         WRITE(numout,*)'      oce co2 flux                    = ', TRIM(sn_snd_co2%cldes   ), ' (', TRIM(sn_snd_co2%clcat   ), ')' 
     271         WRITE(numout,*)'  nn_cplmodel                         = ', nn_cplmodel 
     272         WRITE(numout,*)'  ln_usecplmask                       = ', ln_usecplmask 
    276273      ENDIF 
    277274 
     
    391388      srcv(jpr_oemp)%clname = 'OOEvaMPr'      ! ocean water budget = ocean Evap - ocean precip 
    392389      SELECT CASE( TRIM( sn_rcv_emp%cldes ) ) 
     390      CASE( 'none'          )       ! nothing to do 
    393391      CASE( 'oce only'      )   ;   srcv(                                 jpr_oemp   )%laction = .TRUE.  
    394392      CASE( 'conservative'  ) 
     
    402400      !                                                      !     Runoffs & Calving     !    
    403401      !                                                      ! ------------------------- ! 
    404       srcv(jpr_rnf   )%clname = 'O_Runoff'   ;   IF( TRIM( sn_rcv_rnf%cldes ) == 'coupled' )   srcv(jpr_rnf)%laction = .TRUE. 
    405 ! This isn't right - really just want ln_rnf_emp changed 
    406 !                                                 IF( TRIM( sn_rcv_rnf%cldes ) == 'climato' )   THEN   ;   ln_rnf = .TRUE. 
    407 !                                                 ELSE                                                 ;   ln_rnf = .FALSE. 
    408 !                                                 ENDIF 
     402      srcv(jpr_rnf   )%clname = 'O_Runoff' 
     403      IF( TRIM( sn_rcv_rnf%cldes ) == 'coupled' ) THEN 
     404         srcv(jpr_rnf)%laction = .TRUE. 
     405         l_rnfcpl              = .TRUE.                      ! -> no need to read runoffs in sbcrnf 
     406         ln_rnf                = nn_components /= jp_iam_sas ! -> force to go through sbcrnf if not sas 
     407         IF(lwp) WRITE(numout,*) 
     408         IF(lwp) WRITE(numout,*) '   runoffs received from oasis -> force ln_rnf = ', ln_rnf 
     409      ENDIF 
     410      ! 
    409411      srcv(jpr_cal   )%clname = 'OCalving'   ;   IF( TRIM( sn_rcv_cal%cldes ) == 'coupled' )   srcv(jpr_cal)%laction = .TRUE. 
    410412 
     
    416418      srcv(jpr_qnsmix)%clname = 'O_QnsMix' 
    417419      SELECT CASE( TRIM( sn_rcv_qns%cldes ) ) 
     420      CASE( 'none'          )       ! nothing to do 
    418421      CASE( 'oce only'      )   ;   srcv(               jpr_qnsoce   )%laction = .TRUE. 
    419422      CASE( 'conservative'  )   ;   srcv( (/jpr_qnsice, jpr_qnsmix/) )%laction = .TRUE. 
     
    431434      srcv(jpr_qsrmix)%clname = 'O_QsrMix' 
    432435      SELECT CASE( TRIM( sn_rcv_qsr%cldes ) ) 
     436      CASE( 'none'          )       ! nothing to do 
    433437      CASE( 'oce only'      )   ;   srcv(               jpr_qsroce   )%laction = .TRUE. 
    434438      CASE( 'conservative'  )   ;   srcv( (/jpr_qsrice, jpr_qsrmix/) )%laction = .TRUE. 
     
    446450      ! 
    447451      ! non solar sensitivity mandatory for LIM ice model 
    448       IF( TRIM( sn_rcv_dqnsdt%cldes ) == 'none' .AND. k_ice /= 0 .AND. k_ice /= 4) & 
     452      IF( TRIM( sn_rcv_dqnsdt%cldes ) == 'none' .AND. k_ice /= 0 .AND. k_ice /= 4 .AND. nn_components /= jp_iam_sas ) & 
    449453         CALL ctl_stop( 'sbc_cpl_init: sn_rcv_dqnsdt%cldes must be coupled in namsbc_cpl namelist' ) 
    450454      ! non solar sensitivity mandatory for mixed oce-ice solar radiation coupling technique 
     
    479483         srcv(jpr_topm:jpr_botm)%laction = .TRUE. 
    480484      ENDIF 
    481  
    482       ! Allocate all parts of frcv used for received fields 
     485      !                                                      ! ------------------------------- ! 
     486      !                                                      !   OPA-SAS coupling - rcv by opa !    
     487      !                                                      ! ------------------------------- ! 
     488      srcv(jpr_sflx)%clname = 'O_SFLX' 
     489      srcv(jpr_fice)%clname = 'RIceFrc' 
     490      ! 
     491      IF( nn_components == jp_iam_opa ) THEN    ! OPA coupled to SAS via OASIS: force received field by OPA (sent by SAS) 
     492         srcv(:)%laction = .FALSE.   ! force default definition in case of opa <-> sas coupling 
     493         srcv(:)%clgrid  = 'T'       ! force default definition in case of opa <-> sas coupling 
     494         srcv(:)%nsgn    = 1.        ! force default definition in case of opa <-> sas coupling 
     495         srcv( (/jpr_qsroce, jpr_qnsoce, jpr_oemp, jpr_sflx, jpr_fice, jpr_otx1, jpr_oty1, jpr_taum/) )%laction = .TRUE. 
     496         srcv(jpr_otx1)%clgrid = 'U'        ! oce components given at U-point 
     497         srcv(jpr_oty1)%clgrid = 'V'        !           and           V-point 
     498         ! Vectors: change of sign at north fold ONLY if on the local grid 
     499         srcv( (/jpr_otx1,jpr_oty1/) )%nsgn = -1. 
     500         sn_rcv_tau%clvgrd = 'U,V' 
     501         sn_rcv_tau%clvor = 'local grid' 
     502         sn_rcv_tau%clvref = 'spherical' 
     503         sn_rcv_emp%cldes = 'oce only' 
     504         ! 
     505         IF(lwp) THEN                        ! control print 
     506            WRITE(numout,*) 
     507            WRITE(numout,*)'               Special conditions for SAS-OPA coupling  ' 
     508            WRITE(numout,*)'               OPA component  ' 
     509            WRITE(numout,*) 
     510            WRITE(numout,*)'  received fields from SAS component ' 
     511            WRITE(numout,*)'                  ice cover ' 
     512            WRITE(numout,*)'                  oce only EMP  ' 
     513            WRITE(numout,*)'                  salt flux  ' 
     514            WRITE(numout,*)'                  mixed oce-ice solar flux  ' 
     515            WRITE(numout,*)'                  mixed oce-ice non solar flux  ' 
     516            WRITE(numout,*)'                  wind stress U,V on local grid and sperical coordinates ' 
     517            WRITE(numout,*)'                  wind stress module' 
     518            WRITE(numout,*) 
     519         ENDIF 
     520      ENDIF 
     521      !                                                      ! -------------------------------- ! 
     522      !                                                      !   OPA-SAS coupling - rcv by sas  !    
     523      !                                                      ! -------------------------------- ! 
     524      srcv(jpr_toce  )%clname = 'I_SSTSST' 
     525      srcv(jpr_soce  )%clname = 'I_SSSal' 
     526      srcv(jpr_ocx1  )%clname = 'I_OCurx1' 
     527      srcv(jpr_ocy1  )%clname = 'I_OCury1' 
     528      srcv(jpr_ssh   )%clname = 'I_SSHght' 
     529      srcv(jpr_e3t1st)%clname = 'I_E3T1st'    
     530      srcv(jpr_fraqsr)%clname = 'I_FraQsr'    
     531      ! 
     532      IF( nn_components == jp_iam_sas ) THEN 
     533         IF( .NOT. ln_cpl ) srcv(:)%laction = .FALSE.   ! force default definition in case of opa <-> sas coupling 
     534         IF( .NOT. ln_cpl ) srcv(:)%clgrid  = 'T'       ! force default definition in case of opa <-> sas coupling 
     535         IF( .NOT. ln_cpl ) srcv(:)%nsgn    = 1.        ! force default definition in case of opa <-> sas coupling 
     536         srcv( (/jpr_toce, jpr_soce, jpr_ssh, jpr_fraqsr, jpr_ocx1, jpr_ocy1/) )%laction = .TRUE. 
     537         srcv( jpr_e3t1st )%laction = lk_vvl 
     538         srcv(jpr_ocx1)%clgrid = 'U'        ! oce components given at U-point 
     539         srcv(jpr_ocy1)%clgrid = 'V'        !           and           V-point 
     540         ! Vectors: change of sign at north fold ONLY if on the local grid 
     541         srcv(jpr_ocx1:jpr_ocy1)%nsgn = -1. 
     542         ! Change first letter to couple with atmosphere if already coupled OPA 
     543         ! this is nedeed as each variable name used in the namcouple must be unique: 
     544         ! for example O_Runoff received by OPA from SAS and therefore O_Runoff received by SAS from the Atmosphere 
     545         DO jn = 1, jprcv 
     546            IF ( srcv(jn)%clname(1:1) == "O" ) srcv(jn)%clname = "S"//srcv(jn)%clname(2:LEN(srcv(jn)%clname)) 
     547         END DO 
     548         ! 
     549         IF(lwp) THEN                        ! control print 
     550            WRITE(numout,*) 
     551            WRITE(numout,*)'               Special conditions for SAS-OPA coupling  ' 
     552            WRITE(numout,*)'               SAS component  ' 
     553            WRITE(numout,*) 
     554            IF( .NOT. ln_cpl ) THEN 
     555               WRITE(numout,*)'  received fields from OPA component ' 
     556            ELSE 
     557               WRITE(numout,*)'  Additional received fields from OPA component : ' 
     558            ENDIF 
     559            WRITE(numout,*)'               sea surface temperature (Celcius) ' 
     560            WRITE(numout,*)'               sea surface salinity '  
     561            WRITE(numout,*)'               surface currents '  
     562            WRITE(numout,*)'               sea surface height '  
     563            WRITE(numout,*)'               thickness of first ocean T level '         
     564            WRITE(numout,*)'               fraction of solar net radiation absorbed in the first ocean level' 
     565            WRITE(numout,*) 
     566         ENDIF 
     567      ENDIF 
     568       
     569      ! =================================================== ! 
     570      ! Allocate all parts of frcv used for received fields ! 
     571      ! =================================================== ! 
    483572      DO jn = 1, jprcv 
    484573         IF ( srcv(jn)%laction ) ALLOCATE( frcv(jn)%z3(jpi,jpj,srcv(jn)%nct) ) 
    485574      END DO 
    486575      ! Allocate taum part of frcv which is used even when not received as coupling field 
    487       IF ( .NOT. srcv(jpr_taum)%laction ) ALLOCATE( frcv(jpr_taum)%z3(jpi,jpj,srcv(jn)%nct) ) 
     576      IF ( .NOT. srcv(jpr_taum)%laction ) ALLOCATE( frcv(jpr_taum)%z3(jpi,jpj,srcv(jpr_taum)%nct) ) 
     577      ! Allocate w10m part of frcv which is used even when not received as coupling field 
     578      IF ( .NOT. srcv(jpr_w10m)%laction ) ALLOCATE( frcv(jpr_w10m)%z3(jpi,jpj,srcv(jpr_w10m)%nct) ) 
     579      ! Allocate jpr_otx1 part of frcv which is used even when not received as coupling field 
     580      IF ( .NOT. srcv(jpr_otx1)%laction ) ALLOCATE( frcv(jpr_otx1)%z3(jpi,jpj,srcv(jpr_otx1)%nct) ) 
     581      IF ( .NOT. srcv(jpr_oty1)%laction ) ALLOCATE( frcv(jpr_oty1)%z3(jpi,jpj,srcv(jpr_oty1)%nct) ) 
    488582      ! Allocate itx1 and ity1 as they are used in sbc_cpl_ice_tau even if srcv(jpr_itx1)%laction = .FALSE. 
    489583      IF( k_ice /= 0 ) THEN 
    490          IF ( .NOT. srcv(jpr_itx1)%laction ) ALLOCATE( frcv(jpr_itx1)%z3(jpi,jpj,srcv(jn)%nct) ) 
    491          IF ( .NOT. srcv(jpr_ity1)%laction ) ALLOCATE( frcv(jpr_ity1)%z3(jpi,jpj,srcv(jn)%nct) ) 
     584         IF ( .NOT. srcv(jpr_itx1)%laction ) ALLOCATE( frcv(jpr_itx1)%z3(jpi,jpj,srcv(jpr_itx1)%nct) ) 
     585         IF ( .NOT. srcv(jpr_ity1)%laction ) ALLOCATE( frcv(jpr_ity1)%z3(jpi,jpj,srcv(jpr_ity1)%nct) ) 
    492586      END IF 
    493587 
     
    509603      ssnd(jps_tmix)%clname = 'O_TepMix' 
    510604      SELECT CASE( TRIM( sn_snd_temp%cldes ) ) 
    511       CASE( 'none'         )       ! nothing to do 
    512       CASE( 'oce only'             )   ;   ssnd(   jps_toce            )%laction = .TRUE. 
    513       CASE( 'weighted oce and ice' ) 
     605      CASE( 'none'                                 )       ! nothing to do 
     606      CASE( 'oce only'                             )   ;   ssnd( jps_toce )%laction = .TRUE. 
     607      CASE( 'oce and ice' , 'weighted oce and ice' ) 
    514608         ssnd( (/jps_toce, jps_tice/) )%laction = .TRUE. 
    515609         IF ( TRIM( sn_snd_temp%clcat ) == 'yes' )  ssnd(jps_tice)%nct = jpl 
    516       CASE( 'mixed oce-ice'        )   ;   ssnd(   jps_tmix            )%laction = .TRUE. 
     610      CASE( 'mixed oce-ice'                        )   ;   ssnd( jps_tmix )%laction = .TRUE. 
    517611      CASE default   ;   CALL ctl_stop( 'sbc_cpl_init: wrong definition of sn_snd_temp%cldes' ) 
    518612      END SELECT 
    519       
     613            
    520614      !                                                      ! ------------------------- ! 
    521615      !                                                      !          Albedo           ! 
     
    524618      ssnd(jps_albmix)%clname = 'O_AlbMix' 
    525619      SELECT CASE( TRIM( sn_snd_alb%cldes ) ) 
    526       CASE( 'none'               ! nothing to do 
    527       CASE( 'weighted ice'  )   ;  ssnd(jps_albice)%laction = .TRUE. 
    528       CASE( 'mixed oce-ice' )   ;  ssnd(jps_albmix)%laction = .TRUE. 
     620      CASE( 'none'                 )     ! nothing to do 
     621      CASE( 'ice' , 'weighted ice' )   ; ssnd(jps_albice)%laction = .TRUE. 
     622      CASE( 'mixed oce-ice'        )   ; ssnd(jps_albmix)%laction = .TRUE. 
    529623      CASE default   ;   CALL ctl_stop( 'sbc_cpl_init: wrong definition of sn_snd_alb%cldes' ) 
    530624      END SELECT 
     
    550644         IF ( TRIM( sn_snd_thick%clcat ) == 'yes' ) ssnd(jps_fice)%nct = jpl 
    551645      ENDIF 
    552  
     646       
    553647      SELECT CASE ( TRIM( sn_snd_thick%cldes ) ) 
    554648      CASE( 'none'         )       ! nothing to do 
     
    557651         IF ( TRIM( sn_snd_thick%clcat ) == 'yes' ) THEN 
    558652            ssnd(jps_hice:jps_hsnw)%nct = jpl 
    559          ELSE 
    560             IF ( jpl > 1 ) THEN 
    561 CALL ctl_stop( 'sbc_cpl_init: use weighted ice and snow option for sn_snd_thick%cldes if not exchanging category fields' ) 
    562             ENDIF 
    563653         ENDIF 
    564654      CASE ( 'weighted ice and snow' )  
     
    599689      !                                                      ! ------------------------- ! 
    600690      ssnd(jps_co2)%clname = 'O_CO2FLX' ;  IF( TRIM(sn_snd_co2%cldes) == 'coupled' )    ssnd(jps_co2 )%laction = .TRUE. 
     691 
     692      !                                                      ! ------------------------------- ! 
     693      !                                                      !   OPA-SAS coupling - snd by opa !    
     694      !                                                      ! ------------------------------- ! 
     695      ssnd(jps_ssh   )%clname = 'O_SSHght'  
     696      ssnd(jps_soce  )%clname = 'O_SSSal'  
     697      ssnd(jps_e3t1st)%clname = 'O_E3T1st'    
     698      ssnd(jps_fraqsr)%clname = 'O_FraQsr' 
     699      ! 
     700      IF( nn_components == jp_iam_opa ) THEN 
     701         ssnd(:)%laction = .FALSE.   ! force default definition in case of opa <-> sas coupling 
     702         ssnd( (/jps_toce, jps_soce, jps_ssh, jps_fraqsr, jps_ocx1, jps_ocy1/) )%laction = .TRUE. 
     703         ssnd( jps_e3t1st )%laction = lk_vvl 
     704         ! vector definition: not used but cleaner... 
     705         ssnd(jps_ocx1)%clgrid  = 'U'        ! oce components given at U-point 
     706         ssnd(jps_ocy1)%clgrid  = 'V'        !           and           V-point 
     707         sn_snd_crt%clvgrd = 'U,V' 
     708         sn_snd_crt%clvor = 'local grid' 
     709         sn_snd_crt%clvref = 'spherical' 
     710         ! 
     711         IF(lwp) THEN                        ! control print 
     712            WRITE(numout,*) 
     713            WRITE(numout,*)'  sent fields to SAS component ' 
     714            WRITE(numout,*)'               sea surface temperature (T before, Celcius) ' 
     715            WRITE(numout,*)'               sea surface salinity '  
     716            WRITE(numout,*)'               surface currents U,V on local grid and spherical coordinates'  
     717            WRITE(numout,*)'               sea surface height '  
     718            WRITE(numout,*)'               thickness of first ocean T level '         
     719            WRITE(numout,*)'               fraction of solar net radiation absorbed in the first ocean level' 
     720            WRITE(numout,*) 
     721         ENDIF 
     722      ENDIF 
     723      !                                                      ! ------------------------------- ! 
     724      !                                                      !   OPA-SAS coupling - snd by sas !    
     725      !                                                      ! ------------------------------- ! 
     726      ssnd(jps_sflx  )%clname = 'I_SFLX'      
     727      ssnd(jps_fice2 )%clname = 'IIceFrc' 
     728      ssnd(jps_qsroce)%clname = 'I_QsrOce'    
     729      ssnd(jps_qnsoce)%clname = 'I_QnsOce'    
     730      ssnd(jps_oemp  )%clname = 'IOEvaMPr'  
     731      ssnd(jps_otx1  )%clname = 'I_OTaux1'    
     732      ssnd(jps_oty1  )%clname = 'I_OTauy1'    
     733      ssnd(jps_rnf   )%clname = 'I_Runoff'    
     734      ssnd(jps_taum  )%clname = 'I_TauMod'    
     735      ! 
     736      IF( nn_components == jp_iam_sas ) THEN 
     737         IF( .NOT. ln_cpl ) ssnd(:)%laction = .FALSE.   ! force default definition in case of opa <-> sas coupling 
     738         ssnd( (/jps_qsroce, jps_qnsoce, jps_oemp, jps_fice2, jps_sflx, jps_otx1, jps_oty1, jps_taum/) )%laction = .TRUE. 
     739         ! 
     740         ! Change first letter to couple with atmosphere if already coupled with sea_ice 
     741         ! this is nedeed as each variable name used in the namcouple must be unique: 
     742         ! for example O_SSTSST sent by OPA to SAS and therefore S_SSTSST sent by SAS to the Atmosphere 
     743         DO jn = 1, jpsnd 
     744            IF ( ssnd(jn)%clname(1:1) == "O" ) ssnd(jn)%clname = "S"//ssnd(jn)%clname(2:LEN(ssnd(jn)%clname)) 
     745         END DO 
     746         ! 
     747         IF(lwp) THEN                        ! control print 
     748            WRITE(numout,*) 
     749            IF( .NOT. ln_cpl ) THEN 
     750               WRITE(numout,*)'  sent fields to OPA component ' 
     751            ELSE 
     752               WRITE(numout,*)'  Additional sent fields to OPA component : ' 
     753            ENDIF 
     754            WRITE(numout,*)'                  ice cover ' 
     755            WRITE(numout,*)'                  oce only EMP  ' 
     756            WRITE(numout,*)'                  salt flux  ' 
     757            WRITE(numout,*)'                  mixed oce-ice solar flux  ' 
     758            WRITE(numout,*)'                  mixed oce-ice non solar flux  ' 
     759            WRITE(numout,*)'                  wind stress U,V components' 
     760            WRITE(numout,*)'                  wind stress module' 
     761         ENDIF 
     762      ENDIF 
     763 
    601764      ! 
    602765      ! ================================ ! 
     
    604767      ! ================================ ! 
    605768 
    606       CALL cpl_prism_define(jprcv, jpsnd)             
    607       ! 
    608       IF( ln_dm2dc .AND. ( cpl_prism_freq( jpr_qsroce ) + cpl_prism_freq( jpr_qsrmix ) /= 86400 ) )   & 
     769      CALL cpl_define(jprcv, jpsnd, nn_cplmodel) 
     770       
     771      IF (ln_usecplmask) THEN  
     772         xcplmask(:,:,:) = 0. 
     773         CALL iom_open( 'cplmask', inum ) 
     774         CALL iom_get( inum, jpdom_unknown, 'cplmask', xcplmask(1:nlci,1:nlcj,1:nn_cplmodel),   & 
     775            &          kstart = (/ mig(1),mjg(1),1 /), kcount = (/ nlci,nlcj,nn_cplmodel /) ) 
     776         CALL iom_close( inum ) 
     777      ELSE 
     778         xcplmask(:,:,:) = 1. 
     779      ENDIF 
     780      xcplmask(:,:,0) = 1. - SUM( xcplmask(:,:,1:nn_cplmodel), dim = 3 ) 
     781      ! 
     782      ncpl_qsr_freq = cpl_freq( 'O_QsrOce' ) + cpl_freq( 'O_QsrMix' ) + cpl_freq( 'I_QsrOce' ) + cpl_freq( 'I_QsrMix' ) 
     783      IF( ln_dm2dc .AND. ln_cpl .AND. ncpl_qsr_freq /= 86400 )   & 
    609784         &   CALL ctl_stop( 'sbc_cpl_init: diurnal cycle reconstruction (ln_dm2dc) needs daily couping for solar radiation' ) 
     785      ncpl_qsr_freq = 86400 / ncpl_qsr_freq 
    610786 
    611787      CALL wrk_dealloc( jpi,jpj, zacs, zaos ) 
     
    654830      !! 
    655831      !! ** Action  :   update  utau, vtau   ocean stress at U,V grid  
    656       !!                        taum, wndm   wind stres and wind speed module at T-point 
     832      !!                        taum         wind stress module at T-point 
     833      !!                        wndm         wind speed  module at T-point over free ocean or leads in presence of sea-ice 
    657834      !!                        qns          non solar heat fluxes including emp heat content    (ocean only case) 
    658835      !!                                     and the latent heat flux of solid precip. melting 
     
    660837      !!                        emp          upward mass flux [evap. - precip. (- runoffs) (- calving)] (ocean only case) 
    661838      !!---------------------------------------------------------------------- 
    662       INTEGER, INTENT(in) ::   kt       ! ocean model time step index 
    663       INTEGER, INTENT(in) ::   k_fsbc   ! frequency of sbc (-> ice model) computation  
    664       INTEGER, INTENT(in) ::   k_ice    ! ice management in the sbc (=0/1/2/3) 
    665       !! 
    666       LOGICAL ::    llnewtx, llnewtau      ! update wind stress components and module?? 
     839      INTEGER, INTENT(in)           ::   kt          ! ocean model time step index 
     840      INTEGER, INTENT(in)           ::   k_fsbc      ! frequency of sbc (-> ice model) computation  
     841      INTEGER, INTENT(in)           ::   k_ice       ! ice management in the sbc (=0/1/2/3) 
     842 
     843      !! 
     844      LOGICAL  ::   llnewtx, llnewtau      ! update wind stress components and module?? 
    667845      INTEGER  ::   ji, jj, jn             ! dummy loop indices 
    668846      INTEGER  ::   isec                   ! number of seconds since nit000 (assuming rdttra did not change since nit000) 
     
    672850      REAL(wp) ::   zcdrag = 1.5e-3        ! drag coefficient 
    673851      REAL(wp) ::   zzx, zzy               ! temporary variables 
    674       REAL(wp), POINTER, DIMENSION(:,:) ::   ztx, zty  
     852      REAL(wp), POINTER, DIMENSION(:,:) ::   ztx, zty, zmsk, zemp, zqns, zqsr 
    675853      !!---------------------------------------------------------------------- 
    676854      ! 
    677855      IF( nn_timing == 1 )  CALL timing_start('sbc_cpl_rcv') 
    678856      ! 
    679       CALL wrk_alloc( jpi,jpj, ztx, zty ) 
    680  
    681       IF( kt == nit000 )   CALL sbc_cpl_init( k_ice )          ! initialisation 
    682  
    683       !                                                 ! Receive all the atmos. fields (including ice information) 
    684       isec = ( kt - nit000 ) * NINT( rdttra(1) )             ! date of exchanges 
    685       DO jn = 1, jprcv                                       ! received fields sent by the atmosphere 
    686          IF( srcv(jn)%laction )   CALL cpl_prism_rcv( jn, isec, frcv(jn)%z3, nrcvinfo(jn) ) 
     857      CALL wrk_alloc( jpi,jpj, ztx, zty, zmsk, zemp, zqns, zqsr ) 
     858      ! 
     859      IF( ln_mixcpl )   zmsk(:,:) = 1. - xcplmask(:,:,0) 
     860      ! 
     861      !                                                      ! ======================================================= ! 
     862      !                                                      ! Receive all the atmos. fields (including ice information) 
     863      !                                                      ! ======================================================= ! 
     864      isec = ( kt - nit000 ) * NINT( rdttra(1) )                ! date of exchanges 
     865      DO jn = 1, jprcv                                          ! received fields sent by the atmosphere 
     866         IF( srcv(jn)%laction )   CALL cpl_rcv( jn, isec, frcv(jn)%z3, xcplmask(:,:,1:nn_cplmodel), nrcvinfo(jn) ) 
    687867      END DO 
    688868 
     
    744924         ! 
    745925      ENDIF 
    746        
    747926      !                                                      ! ========================= ! 
    748927      !                                                      !    wind stress module     !   (taum) 
     
    773952         ENDIF 
    774953      ENDIF 
    775        
     954      ! 
    776955      !                                                      ! ========================= ! 
    777956      !                                                      !      10 m wind speed      !   (wndm) 
     
    786965!CDIR NOVERRCHK 
    787966               DO ji = 1, jpi  
    788                   wndm(ji,jj) = SQRT( frcv(jpr_taum)%z3(ji,jj,1) * zcoef ) 
     967                  frcv(jpr_w10m)%z3(ji,jj,1) = SQRT( frcv(jpr_taum)%z3(ji,jj,1) * zcoef ) 
    789968               END DO 
    790969            END DO 
    791970         ENDIF 
    792       ELSE 
    793          IF ( nrcvinfo(jpr_w10m) == OASIS_Rcv ) wndm(:,:) = frcv(jpr_w10m)%z3(:,:,1) 
    794971      ENDIF 
    795972 
     
    798975      IF( MOD( kt-1, k_fsbc ) == 0 ) THEN 
    799976         ! 
    800          utau(:,:) = frcv(jpr_otx1)%z3(:,:,1) 
    801          vtau(:,:) = frcv(jpr_oty1)%z3(:,:,1) 
    802          taum(:,:) = frcv(jpr_taum)%z3(:,:,1) 
     977         IF( ln_mixcpl ) THEN 
     978            utau(:,:) = utau(:,:) * xcplmask(:,:,0) + frcv(jpr_otx1)%z3(:,:,1) * zmsk(:,:) 
     979            vtau(:,:) = vtau(:,:) * xcplmask(:,:,0) + frcv(jpr_oty1)%z3(:,:,1) * zmsk(:,:) 
     980            taum(:,:) = taum(:,:) * xcplmask(:,:,0) + frcv(jpr_taum)%z3(:,:,1) * zmsk(:,:) 
     981            wndm(:,:) = wndm(:,:) * xcplmask(:,:,0) + frcv(jpr_w10m)%z3(:,:,1) * zmsk(:,:) 
     982         ELSE 
     983            utau(:,:) = frcv(jpr_otx1)%z3(:,:,1) 
     984            vtau(:,:) = frcv(jpr_oty1)%z3(:,:,1) 
     985            taum(:,:) = frcv(jpr_taum)%z3(:,:,1) 
     986            wndm(:,:) = frcv(jpr_w10m)%z3(:,:,1) 
     987         ENDIF 
    803988         CALL iom_put( "taum_oce", taum )   ! output wind stress module 
    804989         !   
     
    806991 
    807992#if defined key_cpl_carbon_cycle 
    808       !                                                              ! atmosph. CO2 (ppm) 
     993      !                                                      ! ================== ! 
     994      !                                                      ! atmosph. CO2 (ppm) ! 
     995      !                                                      ! ================== ! 
    809996      IF( srcv(jpr_co2)%laction )   atm_co2(:,:) = frcv(jpr_co2)%z3(:,:,1) 
    810997#endif 
    811998 
     999      !  Fields received by SAS when OASIS coupling 
     1000      !  (arrays no more filled at sbcssm stage) 
     1001      !                                                      ! ================== ! 
     1002      !                                                      !        SSS         ! 
     1003      !                                                      ! ================== ! 
     1004      IF( srcv(jpr_soce)%laction ) THEN                      ! received by sas in case of opa <-> sas coupling 
     1005         sss_m(:,:) = frcv(jpr_soce)%z3(:,:,1) 
     1006         CALL iom_put( 'sss_m', sss_m ) 
     1007      ENDIF 
     1008      !                                                
     1009      !                                                      ! ================== ! 
     1010      !                                                      !        SST         ! 
     1011      !                                                      ! ================== ! 
     1012      IF( srcv(jpr_toce)%laction ) THEN                      ! received by sas in case of opa <-> sas coupling 
     1013         sst_m(:,:) = frcv(jpr_toce)%z3(:,:,1) 
     1014         IF( srcv(jpr_soce)%laction .AND. ln_useCT ) THEN    ! make sure that sst_m is the potential temperature 
     1015            sst_m(:,:) = eos_pt_from_ct( sst_m(:,:), sss_m(:,:) ) 
     1016         ENDIF 
     1017      ENDIF 
     1018      !                                                      ! ================== ! 
     1019      !                                                      !        SSH         ! 
     1020      !                                                      ! ================== ! 
     1021      IF( srcv(jpr_ssh )%laction ) THEN                      ! received by sas in case of opa <-> sas coupling 
     1022         ssh_m(:,:) = frcv(jpr_ssh )%z3(:,:,1) 
     1023         CALL iom_put( 'ssh_m', ssh_m ) 
     1024      ENDIF 
     1025      !                                                      ! ================== ! 
     1026      !                                                      !  surface currents  ! 
     1027      !                                                      ! ================== ! 
     1028      IF( srcv(jpr_ocx1)%laction ) THEN                      ! received by sas in case of opa <-> sas coupling 
     1029         ssu_m(:,:) = frcv(jpr_ocx1)%z3(:,:,1) 
     1030         ub (:,:,1) = ssu_m(:,:)                             ! will be used in sbcice_lim in the call of lim_sbc_tau 
     1031         CALL iom_put( 'ssu_m', ssu_m ) 
     1032      ENDIF 
     1033      IF( srcv(jpr_ocy1)%laction ) THEN 
     1034         ssv_m(:,:) = frcv(jpr_ocy1)%z3(:,:,1) 
     1035         vb (:,:,1) = ssv_m(:,:)                             ! will be used in sbcice_lim in the call of lim_sbc_tau 
     1036         CALL iom_put( 'ssv_m', ssv_m ) 
     1037      ENDIF 
     1038      !                                                      ! ======================== ! 
     1039      !                                                      !  first T level thickness ! 
     1040      !                                                      ! ======================== ! 
     1041      IF( srcv(jpr_e3t1st )%laction ) THEN                   ! received by sas in case of opa <-> sas coupling 
     1042         e3t_m(:,:) = frcv(jpr_e3t1st )%z3(:,:,1) 
     1043         CALL iom_put( 'e3t_m', e3t_m(:,:) ) 
     1044      ENDIF 
     1045      !                                                      ! ================================ ! 
     1046      !                                                      !  fraction of solar net radiation ! 
     1047      !                                                      ! ================================ ! 
     1048      IF( srcv(jpr_fraqsr)%laction ) THEN                    ! received by sas in case of opa <-> sas coupling 
     1049         frq_m(:,:) = frcv(jpr_fraqsr)%z3(:,:,1) 
     1050         CALL iom_put( 'frq_m', frq_m ) 
     1051      ENDIF 
     1052       
    8121053      !                                                      ! ========================= ! 
    813       IF( k_ice <= 1 ) THEN                                  !  heat & freshwater fluxes ! (Ocean only case) 
     1054      IF( k_ice <= 1 .AND. MOD( kt-1, k_fsbc ) == 0 ) THEN   !  heat & freshwater fluxes ! (Ocean only case) 
    8141055         !                                                   ! ========================= ! 
    8151056         ! 
    8161057         !                                                       ! total freshwater fluxes over the ocean (emp) 
    817          SELECT CASE( TRIM( sn_rcv_emp%cldes ) )                                    ! evaporation - precipitation 
    818          CASE( 'conservative' ) 
    819             emp(:,:) = frcv(jpr_tevp)%z3(:,:,1) - ( frcv(jpr_rain)%z3(:,:,1) + frcv(jpr_snow)%z3(:,:,1) ) 
    820          CASE( 'oce only', 'oce and ice' ) 
    821             emp(:,:) = frcv(jpr_oemp)%z3(:,:,1) 
    822          CASE default 
    823             CALL ctl_stop( 'sbc_cpl_rcv: wrong definition of sn_rcv_emp%cldes' ) 
    824          END SELECT 
     1058         IF( srcv(jpr_oemp)%laction .OR. srcv(jpr_rain)%laction ) THEN 
     1059            SELECT CASE( TRIM( sn_rcv_emp%cldes ) )                                    ! evaporation - precipitation 
     1060            CASE( 'conservative' ) 
     1061               zemp(:,:) = frcv(jpr_tevp)%z3(:,:,1) - ( frcv(jpr_rain)%z3(:,:,1) + frcv(jpr_snow)%z3(:,:,1) ) 
     1062            CASE( 'oce only', 'oce and ice' ) 
     1063               zemp(:,:) = frcv(jpr_oemp)%z3(:,:,1) 
     1064            CASE default 
     1065               CALL ctl_stop( 'sbc_cpl_rcv: wrong definition of sn_rcv_emp%cldes' ) 
     1066            END SELECT 
     1067         ELSE 
     1068            zemp(:,:) = 0._wp 
     1069         ENDIF 
    8251070         ! 
    8261071         !                                                        ! runoffs and calving (added in emp) 
    827          IF( srcv(jpr_rnf)%laction )   emp(:,:) = emp(:,:) - frcv(jpr_rnf)%z3(:,:,1) 
    828          IF( srcv(jpr_cal)%laction )   emp(:,:) = emp(:,:) - frcv(jpr_cal)%z3(:,:,1) 
    829          ! 
    830 !!gm :  this seems to be internal cooking, not sure to need that in a generic interface  
    831 !!gm                                       at least should be optional... 
    832 !!         IF( TRIM( sn_rcv_rnf%cldes ) == 'coupled' ) THEN     ! add to the total freshwater budget 
    833 !!            ! remove negative runoff 
    834 !!            zcumulpos = SUM( MAX( frcv(jpr_rnf)%z3(:,:,1), 0.e0 ) * e1t(:,:) * e2t(:,:) * tmask_i(:,:) )  
    835 !!            zcumulneg = SUM( MIN( frcv(jpr_rnf)%z3(:,:,1), 0.e0 ) * e1t(:,:) * e2t(:,:) * tmask_i(:,:) ) 
    836 !!            IF( lk_mpp )   CALL mpp_sum( zcumulpos )   ! sum over the global domain 
    837 !!            IF( lk_mpp )   CALL mpp_sum( zcumulneg )  
    838 !!            IF( zcumulpos /= 0. ) THEN                 ! distribute negative runoff on positive runoff grid points 
    839 !!               zcumulneg = 1.e0 + zcumulneg / zcumulpos 
    840 !!               frcv(jpr_rnf)%z3(:,:,1) = MAX( frcv(jpr_rnf)%z3(:,:,1), 0.e0 ) * zcumulneg 
    841 !!            ENDIF      
    842 !!            ! add runoff to e-p  
    843 !!            emp(:,:) = emp(:,:) - frcv(jpr_rnf)%z3(:,:,1) 
    844 !!         ENDIF 
    845 !!gm  end of internal cooking 
     1072         IF( srcv(jpr_rnf)%laction )     rnf(:,:) = frcv(jpr_rnf)%z3(:,:,1) 
     1073         IF( srcv(jpr_cal)%laction )     zemp(:,:) = zemp(:,:) - frcv(jpr_cal)%z3(:,:,1) 
     1074          
     1075         IF( ln_mixcpl ) THEN   ;   emp(:,:) = emp(:,:) * xcplmask(:,:,0) + zemp(:,:) * zmsk(:,:) 
     1076         ELSE                   ;   emp(:,:) =                              zemp(:,:) 
     1077         ENDIF 
    8461078         ! 
    8471079         !                                                       ! non solar heat flux over the ocean (qns) 
    848          IF( srcv(jpr_qnsoce)%laction )   qns(:,:) = frcv(jpr_qnsoce)%z3(:,:,1) 
    849          IF( srcv(jpr_qnsmix)%laction )   qns(:,:) = frcv(jpr_qnsmix)%z3(:,:,1) 
    850          ! add the latent heat of solid precip. melting 
    851          IF( srcv(jpr_snow  )%laction )   THEN                         ! update qns over the free ocean with: 
    852               qns(:,:) = qns(:,:) - frcv(jpr_snow)%z3(:,:,1) * lfus  & ! energy for melting solid precipitation over the free ocean 
    853            &           - emp(:,:) * sst_m(:,:) * rcp                   ! remove heat content due to mass flux (assumed to be at SST) 
     1080         IF(      srcv(jpr_qnsoce)%laction ) THEN   ;   zqns(:,:) = frcv(jpr_qnsoce)%z3(:,:,1) 
     1081         ELSE IF( srcv(jpr_qnsmix)%laction ) THEN   ;   zqns(:,:) = frcv(jpr_qnsmix)%z3(:,:,1) 
     1082         ELSE                                       ;   zqns(:,:) = 0._wp 
     1083         END IF 
     1084         ! update qns over the free ocean with: 
     1085         IF( nn_components /= jp_iam_opa ) THEN 
     1086            zqns(:,:) =  zqns(:,:) - zemp(:,:) * sst_m(:,:) * rcp         ! remove heat content due to mass flux (assumed to be at SST) 
     1087            IF( srcv(jpr_snow  )%laction ) THEN 
     1088               zqns(:,:) = zqns(:,:) - frcv(jpr_snow)%z3(:,:,1) * lfus    ! energy for melting solid precipitation over the free ocean 
     1089            ENDIF 
     1090         ENDIF 
     1091         IF( ln_mixcpl ) THEN   ;   qns(:,:) = qns(:,:) * xcplmask(:,:,0) + zqns(:,:) * zmsk(:,:) 
     1092         ELSE                   ;   qns(:,:) =                              zqns(:,:) 
    8541093         ENDIF 
    8551094 
    8561095         !                                                       ! solar flux over the ocean          (qsr) 
    857          IF( srcv(jpr_qsroce)%laction )   qsr(:,:) = frcv(jpr_qsroce)%z3(:,:,1) 
    858          IF( srcv(jpr_qsrmix)%laction )   qsr(:,:) = frcv(jpr_qsrmix)%z3(:,:,1) 
    859          IF( ln_dm2dc )   qsr(:,:) = sbc_dcy( qsr )                           ! modify qsr to include the diurnal cycle 
     1096         IF     ( srcv(jpr_qsroce)%laction ) THEN   ;   zqsr(:,:) = frcv(jpr_qsroce)%z3(:,:,1) 
     1097         ELSE IF( srcv(jpr_qsrmix)%laction ) then   ;   zqsr(:,:) = frcv(jpr_qsrmix)%z3(:,:,1) 
     1098         ELSE                                       ;   zqsr(:,:) = 0._wp 
     1099         ENDIF 
     1100         IF( ln_dm2dc .AND. ln_cpl )   zqsr(:,:) = sbc_dcy( zqsr )   ! modify qsr to include the diurnal cycle 
     1101         IF( ln_mixcpl ) THEN   ;   qsr(:,:) = qsr(:,:) * xcplmask(:,:,0) + zqsr(:,:) * zmsk(:,:) 
     1102         ELSE                   ;   qsr(:,:) =                              zqsr(:,:) 
     1103         ENDIF 
    8601104         ! 
    861    
    862       ENDIF 
    863       ! 
    864       CALL wrk_dealloc( jpi,jpj, ztx, zty ) 
     1105         ! salt flux over the ocean (received by opa in case of opa <-> sas coupling) 
     1106         IF( srcv(jpr_sflx )%laction )   sfx(:,:) = frcv(jpr_sflx  )%z3(:,:,1) 
     1107         ! Ice cover  (received by opa in case of opa <-> sas coupling) 
     1108         IF( srcv(jpr_fice )%laction )   fr_i(:,:) = frcv(jpr_fice )%z3(:,:,1) 
     1109         ! 
     1110 
     1111      ENDIF 
     1112      ! 
     1113      CALL wrk_dealloc( jpi,jpj, ztx, zty, zmsk, zemp, zqns, zqsr ) 
    8651114      ! 
    8661115      IF( nn_timing == 1 )  CALL timing_stop('sbc_cpl_rcv') 
     
    9141163      CALL wrk_alloc( jpi,jpj, ztx, zty ) 
    9151164 
    916 !AC Pour eviter un stress nul sur la glace dans le cas mixed oce-ice 
    917       IF( srcv(jpr_itx1)%laction .AND. TRIM( sn_rcv_tau%cldes ) == 'oce and ice') THEN   ;   itx =  jpr_itx1    
     1165      IF( srcv(jpr_itx1)%laction ) THEN   ;   itx =  jpr_itx1    
    9181166      ELSE                                ;   itx =  jpr_otx1 
    9191167      ENDIF 
     
    9221170      IF(  nrcvinfo(itx) == OASIS_Rcv ) THEN 
    9231171 
    924          !                                                                                              ! ======================= ! 
    925 !AC Pour eviter un stress nul sur la glace dans le cas mixes oce-ice 
    926          IF( srcv(jpr_itx1)%laction .AND. TRIM( sn_rcv_tau%cldes ) == 'oce and ice') THEN               !   ice stress received   ! 
    927             !                                                                                           ! ======================= ! 
     1172         !                                                      ! ======================= ! 
     1173         IF( srcv(jpr_itx1)%laction ) THEN                      !   ice stress received   ! 
     1174            !                                                   ! ======================= ! 
    9281175            !   
    9291176            IF( TRIM( sn_rcv_tau%clvref ) == 'cartesian' ) THEN            ! 2 components on the sphere 
     
    9611208            ! 
    9621209         ENDIF 
    963  
    9641210         !                                                      ! ======================= ! 
    9651211         !                                                      !     put on ice grid     ! 
     
    10831329    
    10841330 
    1085    SUBROUTINE sbc_cpl_ice_flx( p_frld  , palbi   , psst    , pist    ) 
     1331   SUBROUTINE sbc_cpl_ice_flx( p_frld, palbi, psst, pist ) 
    10861332      !!---------------------------------------------------------------------- 
    10871333      !!             ***  ROUTINE sbc_cpl_ice_flx  *** 
     
    11251371      REAL(wp), INTENT(in   ), DIMENSION(:,:)   ::   p_frld     ! lead fraction                [0 to 1] 
    11261372      ! optional arguments, used only in 'mixed oce-ice' case 
    1127       REAL(wp), INTENT(in   ), DIMENSION(:,:,:), OPTIONAL ::   palbi   ! ice albedo  
    1128       REAL(wp), INTENT(in   ), DIMENSION(:,:  ), OPTIONAL ::   psst    ! sea surface temperature     [Celcius] 
    1129       REAL(wp), INTENT(in   ), DIMENSION(:,:,:), OPTIONAL ::   pist    ! ice surface temperature     [Kelvin] 
    1130       ! 
    1131       INTEGER ::   jl   ! dummy loop index 
    1132       REAL(wp), POINTER, DIMENSION(:,:) ::   zcptn, ztmp, zicefr 
     1373      REAL(wp), INTENT(in   ), DIMENSION(:,:,:), OPTIONAL ::   palbi      ! all skies ice albedo  
     1374      REAL(wp), INTENT(in   ), DIMENSION(:,:  ), OPTIONAL ::   psst       ! sea surface temperature     [Celsius] 
     1375      REAL(wp), INTENT(in   ), DIMENSION(:,:,:), OPTIONAL ::   pist       ! ice surface temperature     [Kelvin] 
     1376      ! 
     1377      INTEGER ::   jl         ! dummy loop index 
     1378      REAL(wp), POINTER, DIMENSION(:,:  ) ::   zcptn, ztmp, zicefr, zmsk 
     1379      REAL(wp), POINTER, DIMENSION(:,:  ) ::   zemp_tot, zemp_ice, zsprecip, ztprecip, zqns_tot, zqsr_tot 
     1380      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zqns_ice, zqsr_ice, zdqns_ice 
     1381      REAL(wp), POINTER, DIMENSION(:,:  ) ::   zevap, zsnw, zqns_oce, zqsr_oce, zqprec_ice, zqemp_oce ! for LIM3 
    11331382      !!---------------------------------------------------------------------- 
    11341383      ! 
    11351384      IF( nn_timing == 1 )  CALL timing_start('sbc_cpl_ice_flx') 
    11361385      ! 
    1137       CALL wrk_alloc( jpi,jpj, zcptn, ztmp, zicefr ) 
    1138  
     1386      CALL wrk_alloc( jpi,jpj,     zcptn, ztmp, zicefr, zmsk, zemp_tot, zemp_ice, zsprecip, ztprecip, zqns_tot, zqsr_tot ) 
     1387      CALL wrk_alloc( jpi,jpj,jpl, zqns_ice, zqsr_ice, zdqns_ice ) 
     1388 
     1389      IF( ln_mixcpl )   zmsk(:,:) = 1. - xcplmask(:,:,0) 
    11391390      zicefr(:,:) = 1.- p_frld(:,:) 
    11401391      zcptn(:,:) = rcp * sst_m(:,:) 
     
    11441395      !                                                      ! ========================= ! 
    11451396      ! 
    1146       !                                                           ! total Precipitations - total Evaporation (emp_tot) 
    1147       !                                                           ! solid precipitation  - sublimation       (emp_ice) 
    1148       !                                                           ! solid Precipitation                      (sprecip) 
     1397      !                                                           ! total Precipitation - total Evaporation (emp_tot) 
     1398      !                                                           ! solid precipitation - sublimation       (emp_ice) 
     1399      !                                                           ! solid Precipitation                     (sprecip) 
     1400      !                                                           ! liquid + solid Precipitation            (tprecip) 
    11491401      SELECT CASE( TRIM( sn_rcv_emp%cldes ) ) 
    11501402      CASE( 'conservative'  )   ! received fields: jpr_rain, jpr_snow, jpr_ievp, jpr_tevp 
    1151          sprecip(:,:) = frcv(jpr_snow)%z3(:,:,1)                 ! May need to ensure positive here 
    1152          tprecip(:,:) = frcv(jpr_rain)%z3(:,:,1) + sprecip (:,:) ! May need to ensure positive here 
    1153          emp_tot(:,:) = frcv(jpr_tevp)%z3(:,:,1) - tprecip(:,:) 
    1154          emp_ice(:,:) = frcv(jpr_ievp)%z3(:,:,1) - frcv(jpr_snow)%z3(:,:,1) 
    1155                            CALL iom_put( 'rain'         , frcv(jpr_rain)%z3(:,:,1)              )   ! liquid precipitation  
    1156          IF( lk_diaar5 )   CALL iom_put( 'hflx_rain_cea', frcv(jpr_rain)%z3(:,:,1) * zcptn(:,:) )   ! heat flux from liq. precip.  
    1157          ztmp(:,:) = frcv(jpr_tevp)%z3(:,:,1) - frcv(jpr_ievp)%z3(:,:,1) * zicefr(:,:) 
    1158                            CALL iom_put( 'evap_ao_cea'  , ztmp                            )   ! ice-free oce evap (cell average) 
    1159          IF( lk_diaar5 )   CALL iom_put( 'hflx_evap_cea', ztmp(:,:         ) * zcptn(:,:) )   ! heat flux from from evap (cell ave) 
     1403         zsprecip(:,:) = frcv(jpr_snow)%z3(:,:,1)                  ! May need to ensure positive here 
     1404         ztprecip(:,:) = frcv(jpr_rain)%z3(:,:,1) + zsprecip(:,:)  ! May need to ensure positive here 
     1405         zemp_tot(:,:) = frcv(jpr_tevp)%z3(:,:,1) - ztprecip(:,:) 
     1406         zemp_ice(:,:) = frcv(jpr_ievp)%z3(:,:,1) - frcv(jpr_snow)%z3(:,:,1) 
     1407            CALL iom_put( 'rain'         , frcv(jpr_rain)%z3(:,:,1)              )   ! liquid precipitation  
     1408         IF( iom_use('hflx_rain_cea') )   & 
     1409            CALL iom_put( 'hflx_rain_cea', frcv(jpr_rain)%z3(:,:,1) * zcptn(:,:) )   ! heat flux from liq. precip.  
     1410         IF( iom_use('evap_ao_cea') .OR. iom_use('hflx_evap_cea') )   & 
     1411            ztmp(:,:) = frcv(jpr_tevp)%z3(:,:,1) - frcv(jpr_ievp)%z3(:,:,1) * zicefr(:,:) 
     1412         IF( iom_use('evap_ao_cea'  ) )   & 
     1413            CALL iom_put( 'evap_ao_cea'  , ztmp                   )   ! ice-free oce evap (cell average) 
     1414         IF( iom_use('hflx_evap_cea') )   & 
     1415            CALL iom_put( 'hflx_evap_cea', ztmp(:,:) * zcptn(:,:) )   ! heat flux from from evap (cell average) 
    11601416      CASE( 'oce and ice'   )   ! received fields: jpr_sbpr, jpr_semp, jpr_oemp, jpr_ievp 
    1161          emp_tot(:,:) = p_frld(:,:) * frcv(jpr_oemp)%z3(:,:,1) + zicefr(:,:) * frcv(jpr_sbpr)%z3(:,:,1) 
    1162          emp_ice(:,:) = frcv(jpr_semp)%z3(:,:,1) 
    1163          sprecip(:,:) = - frcv(jpr_semp)%z3(:,:,1) + frcv(jpr_ievp)%z3(:,:,1) 
     1417         zemp_tot(:,:) = p_frld(:,:) * frcv(jpr_oemp)%z3(:,:,1) + zicefr(:,:) * frcv(jpr_sbpr)%z3(:,:,1) 
     1418         zemp_ice(:,:) = frcv(jpr_semp)%z3(:,:,1) 
     1419         zsprecip(:,:) = frcv(jpr_ievp)%z3(:,:,1) - frcv(jpr_semp)%z3(:,:,1) 
     1420         ztprecip(:,:) = frcv(jpr_semp)%z3(:,:,1) - frcv(jpr_sbpr)%z3(:,:,1) + zsprecip(:,:) 
    11641421      END SELECT 
    11651422 
    1166       CALL iom_put( 'snowpre'    , sprecip                                )   ! Snow 
    1167       CALL iom_put( 'snow_ao_cea', sprecip(:,:         ) * p_frld(:,:)    )   ! Snow        over ice-free ocean  (cell average) 
    1168       CALL iom_put( 'snow_ai_cea', sprecip(:,:         ) * zicefr(:,:)    )   ! Snow        over sea-ice         (cell average) 
    1169       CALL iom_put( 'subl_ai_cea', frcv(jpr_ievp)%z3(:,:,1) * zicefr(:,:) )   ! Sublimation over sea-ice         (cell average) 
     1423      IF( iom_use('subl_ai_cea') )   & 
     1424         CALL iom_put( 'subl_ai_cea', frcv(jpr_ievp)%z3(:,:,1) * zicefr(:,:) )   ! Sublimation over sea-ice         (cell average) 
    11701425      !    
    11711426      !                                                           ! runoffs and calving (put in emp_tot) 
    1172       IF( srcv(jpr_rnf)%laction ) THEN  
    1173          emp_tot(:,:) = emp_tot(:,:) - frcv(jpr_rnf)%z3(:,:,1) 
    1174                            CALL iom_put( 'runoffs'      , frcv(jpr_rnf)%z3(:,:,1)              )   ! rivers 
    1175          IF( lk_diaar5 )   CALL iom_put( 'hflx_rnf_cea' , frcv(jpr_rnf)%z3(:,:,1) * zcptn(:,:) )   ! heat flux from rivers 
    1176       ENDIF 
     1427      IF( srcv(jpr_rnf)%laction )   rnf(:,:) = frcv(jpr_rnf)%z3(:,:,1) 
    11771428      IF( srcv(jpr_cal)%laction ) THEN  
    1178          emp_tot(:,:) = emp_tot(:,:) - frcv(jpr_cal)%z3(:,:,1) 
    1179          CALL iom_put( 'calving', frcv(jpr_cal)%z3(:,:,1) ) 
    1180       ENDIF 
    1181       ! 
    1182 !!gm :  this seems to be internal cooking, not sure to need that in a generic interface  
    1183 !!gm                                       at least should be optional... 
    1184 !!       ! remove negative runoff                            ! sum over the global domain 
    1185 !!       zcumulpos = SUM( MAX( frcv(jpr_rnf)%z3(:,:,1), 0.e0 ) * e1t(:,:) * e2t(:,:) * tmask_i(:,:) )  
    1186 !!       zcumulneg = SUM( MIN( frcv(jpr_rnf)%z3(:,:,1), 0.e0 ) * e1t(:,:) * e2t(:,:) * tmask_i(:,:) ) 
    1187 !!       IF( lk_mpp )   CALL mpp_sum( zcumulpos ) 
    1188 !!       IF( lk_mpp )   CALL mpp_sum( zcumulneg )  
    1189 !!       IF( zcumulpos /= 0. ) THEN                          ! distribute negative runoff on positive runoff grid points 
    1190 !!          zcumulneg = 1.e0 + zcumulneg / zcumulpos 
    1191 !!          frcv(jpr_rnf)%z3(:,:,1) = MAX( frcv(jpr_rnf)%z3(:,:,1), 0.e0 ) * zcumulneg 
    1192 !!       ENDIF      
    1193 !!       emp_tot(:,:) = emp_tot(:,:) - frcv(jpr_rnf)%z3(:,:,1)   ! add runoff to e-p  
    1194 !! 
    1195 !!gm  end of internal cooking 
     1429         zemp_tot(:,:) = zemp_tot(:,:) - frcv(jpr_cal)%z3(:,:,1) 
     1430         CALL iom_put( 'calving_cea', frcv(jpr_cal)%z3(:,:,1) ) 
     1431      ENDIF 
     1432 
     1433      IF( ln_mixcpl ) THEN 
     1434         emp_tot(:,:) = emp_tot(:,:) * xcplmask(:,:,0) + zemp_tot(:,:) * zmsk(:,:) 
     1435         emp_ice(:,:) = emp_ice(:,:) * xcplmask(:,:,0) + zemp_ice(:,:) * zmsk(:,:) 
     1436         sprecip(:,:) = sprecip(:,:) * xcplmask(:,:,0) + zsprecip(:,:) * zmsk(:,:) 
     1437         tprecip(:,:) = tprecip(:,:) * xcplmask(:,:,0) + ztprecip(:,:) * zmsk(:,:) 
     1438      ELSE 
     1439         emp_tot(:,:) =                                  zemp_tot(:,:) 
     1440         emp_ice(:,:) =                                  zemp_ice(:,:) 
     1441         sprecip(:,:) =                                  zsprecip(:,:) 
     1442         tprecip(:,:) =                                  ztprecip(:,:) 
     1443      ENDIF 
     1444 
     1445         CALL iom_put( 'snowpre'    , sprecip                                )   ! Snow 
     1446      IF( iom_use('snow_ao_cea') )   & 
     1447         CALL iom_put( 'snow_ao_cea', sprecip(:,:) * p_frld(:,:)             )   ! Snow        over ice-free ocean  (cell average) 
     1448      IF( iom_use('snow_ai_cea') )   & 
     1449         CALL iom_put( 'snow_ai_cea', sprecip(:,:) * zicefr(:,:)             )   ! Snow        over sea-ice         (cell average) 
    11961450 
    11971451      !                                                      ! ========================= ! 
     
    11991453      !                                                      ! ========================= ! 
    12001454      CASE( 'oce only' )                                     ! the required field is directly provided 
    1201          qns_tot(:,:  ) = frcv(jpr_qnsoce)%z3(:,:,1) 
     1455         zqns_tot(:,:  ) = frcv(jpr_qnsoce)%z3(:,:,1) 
    12021456      CASE( 'conservative' )                                      ! the required fields are directly provided 
    1203          qns_tot(:,:  ) = frcv(jpr_qnsmix)%z3(:,:,1) 
     1457         zqns_tot(:,:  ) = frcv(jpr_qnsmix)%z3(:,:,1) 
    12041458         IF ( TRIM(sn_rcv_qns%clcat) == 'yes' ) THEN 
    1205             qns_ice(:,:,1:jpl) = frcv(jpr_qnsice)%z3(:,:,1:jpl) 
     1459            zqns_ice(:,:,1:jpl) = frcv(jpr_qnsice)%z3(:,:,1:jpl) 
    12061460         ELSE 
    12071461            ! Set all category values equal for the moment 
    12081462            DO jl=1,jpl 
    1209                qns_ice(:,:,jl) = frcv(jpr_qnsice)%z3(:,:,1) 
     1463               zqns_ice(:,:,jl) = frcv(jpr_qnsice)%z3(:,:,1) 
    12101464            ENDDO 
    12111465         ENDIF 
    12121466      CASE( 'oce and ice' )       ! the total flux is computed from ocean and ice fluxes 
    1213          qns_tot(:,:  ) =  p_frld(:,:) * frcv(jpr_qnsoce)%z3(:,:,1) 
     1467         zqns_tot(:,:  ) =  p_frld(:,:) * frcv(jpr_qnsoce)%z3(:,:,1) 
    12141468         IF ( TRIM(sn_rcv_qns%clcat) == 'yes' ) THEN 
    12151469            DO jl=1,jpl 
    1216                qns_tot(:,:   ) = qns_tot(:,:) + a_i(:,:,jl) * frcv(jpr_qnsice)%z3(:,:,jl)    
    1217                qns_ice(:,:,jl) = frcv(jpr_qnsice)%z3(:,:,jl) 
     1470               zqns_tot(:,:   ) = zqns_tot(:,:) + a_i(:,:,jl) * frcv(jpr_qnsice)%z3(:,:,jl)    
     1471               zqns_ice(:,:,jl) = frcv(jpr_qnsice)%z3(:,:,jl) 
    12181472            ENDDO 
    12191473         ELSE 
     1474            qns_tot(:,:   ) = qns_tot(:,:) + zicefr(:,:) * frcv(jpr_qnsice)%z3(:,:,1) 
    12201475            DO jl=1,jpl 
    1221                qns_tot(:,:   ) = qns_tot(:,:) + zicefr(:,:) * frcv(jpr_qnsice)%z3(:,:,1) 
    1222                qns_ice(:,:,jl) = frcv(jpr_qnsice)%z3(:,:,1) 
     1476               zqns_tot(:,:   ) = zqns_tot(:,:) + zicefr(:,:) * frcv(jpr_qnsice)%z3(:,:,1) 
     1477               zqns_ice(:,:,jl) = frcv(jpr_qnsice)%z3(:,:,1) 
    12231478            ENDDO 
    12241479         ENDIF 
    12251480      CASE( 'mixed oce-ice' )     ! the ice flux is cumputed from the total flux, the SST and ice informations 
    12261481! ** NEED TO SORT OUT HOW THIS SHOULD WORK IN THE MULTI-CATEGORY CASE - CURRENTLY NOT ALLOWED WHEN INTERFACE INITIALISED ** 
    1227          qns_tot(:,:  ) = frcv(jpr_qnsmix)%z3(:,:,1) 
    1228          qns_ice(:,:,1) = frcv(jpr_qnsmix)%z3(:,:,1)    & 
     1482         zqns_tot(:,:  ) = frcv(jpr_qnsmix)%z3(:,:,1) 
     1483         zqns_ice(:,:,1) = frcv(jpr_qnsmix)%z3(:,:,1)    & 
    12291484            &            + frcv(jpr_dqnsdt)%z3(:,:,1) * ( pist(:,:,1) - ( (rt0 + psst(:,:  ) ) * p_frld(:,:)   & 
    12301485            &                                                   +          pist(:,:,1)   * zicefr(:,:) ) ) 
    12311486      END SELECT 
    1232       ztmp(:,:) = p_frld(:,:) * sprecip(:,:) * lfus 
    1233       qns_tot(:,:) = qns_tot(:,:)                         &            ! qns_tot update over free ocean with: 
    1234          &          - ztmp(:,:)                           &            ! remove the latent heat flux of solid precip. melting 
    1235          &          - (  emp_tot(:,:)                     &            ! remove the heat content of mass flux (assumed to be at SST) 
    1236          &             - emp_ice(:,:) * zicefr(:,:)  ) * zcptn(:,:)  
    1237       IF( lk_diaar5 )   CALL iom_put( 'hflx_snow_cea', ztmp + sprecip(:,:) * zcptn(:,:) )   ! heat flux from snow (cell average) 
    12381487!!gm 
    1239 !!    currently it is taken into account in leads budget but not in the qns_tot, and thus not in  
     1488!!    currently it is taken into account in leads budget but not in the zqns_tot, and thus not in  
    12401489!!    the flux that enter the ocean.... 
    12411490!!    moreover 1 - it is not diagnose anywhere....  
     
    12461495      IF( srcv(jpr_cal)%laction ) THEN                            ! Iceberg melting  
    12471496         ztmp(:,:) = frcv(jpr_cal)%z3(:,:,1) * lfus               ! add the latent heat of iceberg melting  
    1248          qns_tot(:,:) = qns_tot(:,:) - ztmp(:,:) 
    1249          IF( lk_diaar5 )   CALL iom_put( 'hflx_cal_cea', ztmp + frcv(jpr_cal)%z3(:,:,1) * zcptn(:,:) )   ! heat flux from calving 
    1250       ENDIF 
     1497         zqns_tot(:,:) = zqns_tot(:,:) - ztmp(:,:) 
     1498         IF( iom_use('hflx_cal_cea') )   & 
     1499            CALL iom_put( 'hflx_cal_cea', ztmp + frcv(jpr_cal)%z3(:,:,1) * zcptn(:,:) )   ! heat flux from calving 
     1500      ENDIF 
     1501 
     1502      ztmp(:,:) = p_frld(:,:) * zsprecip(:,:) * lfus 
     1503      IF( iom_use('hflx_snow_cea') )    CALL iom_put( 'hflx_snow_cea', ztmp + sprecip(:,:) * zcptn(:,:) )   ! heat flux from snow (cell average) 
     1504 
     1505#if defined key_lim3 
     1506      CALL wrk_alloc( jpi,jpj, zevap, zsnw, zqns_oce, zqprec_ice, zqemp_oce )  
     1507 
     1508      ! --- evaporation --- ! 
     1509      ! clem: evap_ice is set to 0 for LIM3 since we still do not know what to do with sublimation 
     1510      ! the problem is: the atm. imposes both mass evaporation and heat removed from the snow/ice 
     1511      !                 but it is incoherent WITH the ice model   
     1512      DO jl=1,jpl 
     1513         evap_ice(:,:,jl) = 0._wp  ! should be: frcv(jpr_ievp)%z3(:,:,1) 
     1514      ENDDO 
     1515      zevap(:,:) = zemp_tot(:,:) + ztprecip(:,:) ! evaporation over ocean 
     1516 
     1517      ! --- evaporation minus precipitation --- ! 
     1518      emp_oce(:,:) = emp_tot(:,:) - emp_ice(:,:) 
     1519 
     1520      ! --- non solar flux over ocean --- ! 
     1521      !         note: p_frld cannot be = 0 since we limit the ice concentration to amax 
     1522      zqns_oce = 0._wp 
     1523      WHERE( p_frld /= 0._wp )  zqns_oce(:,:) = ( zqns_tot(:,:) - SUM( a_i * zqns_ice, dim=3 ) ) / p_frld(:,:) 
     1524 
     1525      ! --- heat flux associated with emp --- ! 
     1526      zsnw(:,:) = 0._wp 
     1527      CALL lim_thd_snwblow( p_frld, zsnw )  ! snow distribution over ice after wind blowing 
     1528      zqemp_oce(:,:) = -      zevap(:,:)                   * p_frld(:,:)      *   zcptn(:,:)   &      ! evap 
     1529         &             + ( ztprecip(:,:) - zsprecip(:,:) )                    *   zcptn(:,:)   &      ! liquid precip 
     1530         &             +   zsprecip(:,:)                   * ( 1._wp - zsnw ) * ( zcptn(:,:) - lfus ) ! solid precip over ocean 
     1531      qemp_ice(:,:)  = -   frcv(jpr_ievp)%z3(:,:,1)        * zicefr(:,:)      *   zcptn(:,:)   &      ! ice evap 
     1532         &             +   zsprecip(:,:)                   * zsnw             * ( zcptn(:,:) - lfus ) ! solid precip over ice 
     1533 
     1534      ! --- heat content of precip over ice in J/m3 (to be used in 1D-thermo) --- ! 
     1535      zqprec_ice(:,:) = rhosn * ( zcptn(:,:) - lfus ) 
     1536 
     1537      ! --- total non solar flux --- ! 
     1538      zqns_tot(:,:) = zqns_tot(:,:) + qemp_ice(:,:) + zqemp_oce(:,:) 
     1539 
     1540      ! --- in case both coupled/forced are active, we must mix values --- !  
     1541      IF( ln_mixcpl ) THEN 
     1542         qns_tot(:,:) = qns_tot(:,:) * xcplmask(:,:,0) + zqns_tot(:,:)* zmsk(:,:) 
     1543         qns_oce(:,:) = qns_oce(:,:) * xcplmask(:,:,0) + zqns_oce(:,:)* zmsk(:,:) 
     1544         DO jl=1,jpl 
     1545            qns_ice(:,:,jl) = qns_ice(:,:,jl) * xcplmask(:,:,0) +  zqns_ice(:,:,jl)* zmsk(:,:) 
     1546         ENDDO 
     1547         qprec_ice(:,:) = qprec_ice(:,:) * xcplmask(:,:,0) + zqprec_ice(:,:)* zmsk(:,:) 
     1548         qemp_oce (:,:) =  qemp_oce(:,:) * xcplmask(:,:,0) +  zqemp_oce(:,:)* zmsk(:,:) 
     1549!!clem         evap_ice(:,:) = evap_ice(:,:) * xcplmask(:,:,0) 
     1550      ELSE 
     1551         qns_tot  (:,:  ) = zqns_tot  (:,:  ) 
     1552         qns_oce  (:,:  ) = zqns_oce  (:,:  ) 
     1553         qns_ice  (:,:,:) = zqns_ice  (:,:,:) 
     1554         qprec_ice(:,:)   = zqprec_ice(:,:) 
     1555         qemp_oce (:,:)   = zqemp_oce (:,:) 
     1556      ENDIF 
     1557 
     1558      CALL wrk_dealloc( jpi,jpj, zevap, zsnw, zqns_oce, zqprec_ice, zqemp_oce )  
     1559#else 
     1560 
     1561      ! clem: this formulation is certainly wrong... but better than it was... 
     1562      zqns_tot(:,:) = zqns_tot(:,:)                       &            ! zqns_tot update over free ocean with: 
     1563         &          - ztmp(:,:)                           &            ! remove the latent heat flux of solid precip. melting 
     1564         &          - (  zemp_tot(:,:)                    &            ! remove the heat content of mass flux (assumed to be at SST) 
     1565         &             - zemp_ice(:,:) * zicefr(:,:)  ) * zcptn(:,:)  
     1566 
     1567     IF( ln_mixcpl ) THEN 
     1568         qns_tot(:,:) = qns(:,:) * p_frld(:,:) + SUM( qns_ice(:,:,:) * a_i(:,:,:), dim=3 )   ! total flux from blk 
     1569         qns_tot(:,:) = qns_tot(:,:) * xcplmask(:,:,0) +  zqns_tot(:,:)* zmsk(:,:) 
     1570         DO jl=1,jpl 
     1571            qns_ice(:,:,jl) = qns_ice(:,:,jl) * xcplmask(:,:,0) +  zqns_ice(:,:,jl)* zmsk(:,:) 
     1572         ENDDO 
     1573      ELSE 
     1574         qns_tot(:,:  ) = zqns_tot(:,:  ) 
     1575         qns_ice(:,:,:) = zqns_ice(:,:,:) 
     1576      ENDIF 
     1577 
     1578#endif 
    12511579 
    12521580      !                                                      ! ========================= ! 
     
    12541582      !                                                      ! ========================= ! 
    12551583      CASE( 'oce only' ) 
    1256          qsr_tot(:,:  ) = MAX( 0._wp , frcv(jpr_qsroce)%z3(:,:,1) ) 
     1584         zqsr_tot(:,:  ) = MAX( 0._wp , frcv(jpr_qsroce)%z3(:,:,1) ) 
    12571585      CASE( 'conservative' ) 
    1258          qsr_tot(:,:  ) = frcv(jpr_qsrmix)%z3(:,:,1) 
     1586         zqsr_tot(:,:  ) = frcv(jpr_qsrmix)%z3(:,:,1) 
    12591587         IF ( TRIM(sn_rcv_qsr%clcat) == 'yes' ) THEN 
    1260             qsr_ice(:,:,1:jpl) = frcv(jpr_qsrice)%z3(:,:,1:jpl) 
     1588            zqsr_ice(:,:,1:jpl) = frcv(jpr_qsrice)%z3(:,:,1:jpl) 
    12611589         ELSE 
    12621590            ! Set all category values equal for the moment 
    12631591            DO jl=1,jpl 
    1264                qsr_ice(:,:,jl) = frcv(jpr_qsrice)%z3(:,:,1) 
     1592               zqsr_ice(:,:,jl) = frcv(jpr_qsrice)%z3(:,:,1) 
    12651593            ENDDO 
    12661594         ENDIF 
    1267          qsr_tot(:,:  ) = frcv(jpr_qsrmix)%z3(:,:,1) 
    1268          qsr_ice(:,:,1) = frcv(jpr_qsrice)%z3(:,:,1) 
     1595         zqsr_tot(:,:  ) = frcv(jpr_qsrmix)%z3(:,:,1) 
     1596         zqsr_ice(:,:,1) = frcv(jpr_qsrice)%z3(:,:,1) 
    12691597      CASE( 'oce and ice' ) 
    1270          qsr_tot(:,:  ) =  p_frld(:,:) * frcv(jpr_qsroce)%z3(:,:,1) 
     1598         zqsr_tot(:,:  ) =  p_frld(:,:) * frcv(jpr_qsroce)%z3(:,:,1) 
    12711599         IF ( TRIM(sn_rcv_qsr%clcat) == 'yes' ) THEN 
    12721600            DO jl=1,jpl 
    1273                qsr_tot(:,:   ) = qsr_tot(:,:) + a_i(:,:,jl) * frcv(jpr_qsrice)%z3(:,:,jl)    
    1274                qsr_ice(:,:,jl) = frcv(jpr_qsrice)%z3(:,:,jl) 
     1601               zqsr_tot(:,:   ) = zqsr_tot(:,:) + a_i(:,:,jl) * frcv(jpr_qsrice)%z3(:,:,jl)    
     1602               zqsr_ice(:,:,jl) = frcv(jpr_qsrice)%z3(:,:,jl) 
    12751603            ENDDO 
    12761604         ELSE 
     1605            qsr_tot(:,:   ) = qsr_tot(:,:) + zicefr(:,:) * frcv(jpr_qsrice)%z3(:,:,1) 
    12771606            DO jl=1,jpl 
    1278                qsr_tot(:,:   ) = qsr_tot(:,:) + zicefr(:,:) * frcv(jpr_qsrice)%z3(:,:,1) 
    1279                qsr_ice(:,:,jl) = frcv(jpr_qsrice)%z3(:,:,1) 
     1607               zqsr_tot(:,:   ) = zqsr_tot(:,:) + zicefr(:,:) * frcv(jpr_qsrice)%z3(:,:,1) 
     1608               zqsr_ice(:,:,jl) = frcv(jpr_qsrice)%z3(:,:,1) 
    12801609            ENDDO 
    12811610         ENDIF 
    12821611      CASE( 'mixed oce-ice' ) 
    1283          qsr_tot(:,:  ) = frcv(jpr_qsrmix)%z3(:,:,1) 
     1612         zqsr_tot(:,:  ) = frcv(jpr_qsrmix)%z3(:,:,1) 
    12841613! ** NEED TO SORT OUT HOW THIS SHOULD WORK IN THE MULTI-CATEGORY CASE - CURRENTLY NOT ALLOWED WHEN INTERFACE INITIALISED ** 
    12851614!       Create solar heat flux over ice using incoming solar heat flux and albedos 
    12861615!       ( see OASIS3 user guide, 5th edition, p39 ) 
    1287          qsr_ice(:,:,1) = frcv(jpr_qsrmix)%z3(:,:,1) * ( 1.- palbi(:,:,1) )   & 
     1616         zqsr_ice(:,:,1) = frcv(jpr_qsrmix)%z3(:,:,1) * ( 1.- palbi(:,:,1) )   & 
    12881617            &            / (  1.- ( albedo_oce_mix(:,:  ) * p_frld(:,:)       & 
    12891618            &                     + palbi         (:,:,1) * zicefr(:,:) ) ) 
    12901619      END SELECT 
    1291       IF( ln_dm2dc ) THEN   ! modify qsr to include the diurnal cycle 
    1292          qsr_tot(:,:  ) = sbc_dcy( qsr_tot(:,:  ) ) 
     1620      IF( ln_dm2dc .AND. ln_cpl ) THEN   ! modify qsr to include the diurnal cycle 
     1621         zqsr_tot(:,:  ) = sbc_dcy( zqsr_tot(:,:  ) ) 
    12931622         DO jl=1,jpl 
    1294             qsr_ice(:,:,jl) = sbc_dcy( qsr_ice(:,:,jl) ) 
     1623            zqsr_ice(:,:,jl) = sbc_dcy( zqsr_ice(:,:,jl) ) 
    12951624         ENDDO 
    12961625      ENDIF 
    12971626 
    1298       SELECT CASE( TRIM( sn_rcv_dqnsdt%cldes ) ) 
     1627#if defined key_lim3 
     1628      CALL wrk_alloc( jpi,jpj, zqsr_oce )  
     1629      ! --- solar flux over ocean --- ! 
     1630      !         note: p_frld cannot be = 0 since we limit the ice concentration to amax 
     1631      zqsr_oce = 0._wp 
     1632      WHERE( p_frld /= 0._wp )  zqsr_oce(:,:) = ( zqsr_tot(:,:) - SUM( a_i * zqsr_ice, dim=3 ) ) / p_frld(:,:) 
     1633 
     1634      IF( ln_mixcpl ) THEN   ;   qsr_oce(:,:) = qsr_oce(:,:) * xcplmask(:,:,0) +  zqsr_oce(:,:)* zmsk(:,:) 
     1635      ELSE                   ;   qsr_oce(:,:) = zqsr_oce(:,:)   ;   ENDIF 
     1636 
     1637      CALL wrk_dealloc( jpi,jpj, zqsr_oce )  
     1638#endif 
     1639 
     1640      IF( ln_mixcpl ) THEN 
     1641         qsr_tot(:,:) = qsr(:,:) * p_frld(:,:) + SUM( qsr_ice(:,:,:) * a_i(:,:,:), dim=3 )   ! total flux from blk 
     1642         qsr_tot(:,:) = qsr_tot(:,:) * xcplmask(:,:,0) +  zqsr_tot(:,:)* zmsk(:,:) 
     1643         DO jl=1,jpl 
     1644            qsr_ice(:,:,jl) = qsr_ice(:,:,jl) * xcplmask(:,:,0) +  zqsr_ice(:,:,jl)* zmsk(:,:) 
     1645         ENDDO 
     1646      ELSE 
     1647         qsr_tot(:,:  ) = zqsr_tot(:,:  ) 
     1648         qsr_ice(:,:,:) = zqsr_ice(:,:,:) 
     1649      ENDIF 
     1650 
     1651      !                                                      ! ========================= ! 
     1652      SELECT CASE( TRIM( sn_rcv_dqnsdt%cldes ) )             !          d(qns)/dt        ! 
     1653      !                                                      ! ========================= ! 
    12991654      CASE ('coupled') 
    13001655         IF ( TRIM(sn_rcv_dqnsdt%clcat) == 'yes' ) THEN 
    1301             dqns_ice(:,:,1:jpl) = frcv(jpr_dqnsdt)%z3(:,:,1:jpl) 
     1656            zdqns_ice(:,:,1:jpl) = frcv(jpr_dqnsdt)%z3(:,:,1:jpl) 
    13021657         ELSE 
    13031658            ! Set all category values equal for the moment 
    13041659            DO jl=1,jpl 
    1305                dqns_ice(:,:,jl) = frcv(jpr_dqnsdt)%z3(:,:,1) 
     1660               zdqns_ice(:,:,jl) = frcv(jpr_dqnsdt)%z3(:,:,1) 
    13061661            ENDDO 
    13071662         ENDIF 
    13081663      END SELECT 
    1309  
    1310       SELECT CASE( TRIM( sn_rcv_iceflx%cldes ) ) 
     1664       
     1665      IF( ln_mixcpl ) THEN 
     1666         DO jl=1,jpl 
     1667            dqns_ice(:,:,jl) = dqns_ice(:,:,jl) * xcplmask(:,:,0) + zdqns_ice(:,:,jl) * zmsk(:,:) 
     1668         ENDDO 
     1669      ELSE 
     1670         dqns_ice(:,:,:) = zdqns_ice(:,:,:) 
     1671      ENDIF 
     1672       
     1673      !                                                      ! ========================= ! 
     1674      SELECT CASE( TRIM( sn_rcv_iceflx%cldes ) )             !    topmelt and botmelt    ! 
     1675      !                                                      ! ========================= ! 
    13111676      CASE ('coupled') 
    13121677         topmelt(:,:,:)=frcv(jpr_topm)%z3(:,:,:) 
     
    13141679      END SELECT 
    13151680 
    1316       !    Ice Qsr penetration used (only?)in lim2 or lim3  
    1317       ! fraction of net shortwave radiation which is not absorbed in the thin surface layer  
    1318       ! and penetrates inside the ice cover ( Maykut and Untersteiner, 1971 ; Elbert anbd Curry, 1993 ) 
     1681      ! Surface transimission parameter io (Maykut Untersteiner , 1971 ; Ebert and Curry, 1993 ) 
     1682      ! Used for LIM2 and LIM3 
    13191683      ! Coupled case: since cloud cover is not received from atmosphere  
    1320       !               ===> defined as constant value -> definition done in sbc_cpl_init 
    1321       fr1_i0(:,:) = 0.18 
    1322       fr2_i0(:,:) = 0.82 
    1323  
    1324  
    1325       CALL wrk_dealloc( jpi,jpj, zcptn, ztmp, zicefr ) 
     1684      !               ===> used prescribed cloud fraction representative for polar oceans in summer (0.81) 
     1685      fr1_i0(:,:) = ( 0.18 * ( 1.0 - cldf_ice ) + 0.35 * cldf_ice ) 
     1686      fr2_i0(:,:) = ( 0.82 * ( 1.0 - cldf_ice ) + 0.65 * cldf_ice ) 
     1687 
     1688      CALL wrk_dealloc( jpi,jpj,     zcptn, ztmp, zicefr, zmsk, zemp_tot, zemp_ice, zsprecip, ztprecip, zqns_tot, zqsr_tot ) 
     1689      CALL wrk_dealloc( jpi,jpj,jpl, zqns_ice, zqsr_ice, zdqns_ice ) 
    13261690      ! 
    13271691      IF( nn_timing == 1 )  CALL timing_stop('sbc_cpl_ice_flx') 
     
    13361700      !! ** Purpose :   provide the ocean-ice informations to the atmosphere 
    13371701      !! 
    1338       !! ** Method  :   send to the atmosphere through a call to cpl_prism_snd 
     1702      !! ** Method  :   send to the atmosphere through a call to cpl_snd 
    13391703      !!              all the needed fields (as defined in sbc_cpl_init) 
    13401704      !!---------------------------------------------------------------------- 
     
    13431707      INTEGER ::   ji, jj, jl   ! dummy loop indices 
    13441708      INTEGER ::   isec, info   ! local integer 
     1709      REAL(wp) ::   zumax, zvmax 
    13451710      REAL(wp), POINTER, DIMENSION(:,:)   ::   zfr_l, ztmp1, ztmp2, zotx1, zoty1, zotz1, zitx1, zity1, zitz1 
    13461711      REAL(wp), POINTER, DIMENSION(:,:,:) ::   ztmp3, ztmp4    
     
    13551720 
    13561721      zfr_l(:,:) = 1.- fr_i(:,:) 
    1357  
    13581722      !                                                      ! ------------------------- ! 
    13591723      !                                                      !    Surface temperature    !   in Kelvin 
    13601724      !                                                      ! ------------------------- ! 
    13611725      IF( ssnd(jps_toce)%laction .OR. ssnd(jps_tice)%laction .OR. ssnd(jps_tmix)%laction ) THEN 
    1362          SELECT CASE( sn_snd_temp%cldes) 
    1363          CASE( 'oce only'             )   ;   ztmp1(:,:) =   tsn(:,:,1,jp_tem) + rt0 
    1364          CASE( 'weighted oce and ice' )   ;   ztmp1(:,:) = ( tsn(:,:,1,jp_tem) + rt0 ) * zfr_l(:,:)    
    1365             SELECT CASE( sn_snd_temp%clcat ) 
    1366             CASE( 'yes' )    
    1367                ztmp3(:,:,1:jpl) = tn_ice(:,:,1:jpl) * a_i(:,:,1:jpl) 
    1368             CASE( 'no' ) 
    1369                ztmp3(:,:,:) = 0.0 
     1726          
     1727         IF ( nn_components == jp_iam_opa ) THEN 
     1728            ztmp1(:,:) = tsn(:,:,1,jp_tem)   ! send temperature as it is (potential or conservative) -> use of ln_useCT on the received part 
     1729         ELSE 
     1730            ! we must send the surface potential temperature  
     1731            IF( ln_useCT )  THEN    ;   ztmp1(:,:) = eos_pt_from_ct( tsn(:,:,1,jp_tem), tsn(:,:,1,jp_sal) ) 
     1732            ELSE                    ;   ztmp1(:,:) = tsn(:,:,1,jp_tem) 
     1733            ENDIF 
     1734            ! 
     1735            SELECT CASE( sn_snd_temp%cldes) 
     1736            CASE( 'oce only'             )   ;   ztmp1(:,:) =   ztmp1(:,:) + rt0 
     1737            CASE( 'oce and ice'          )   ;   ztmp1(:,:) =   ztmp1(:,:) + rt0 
     1738               SELECT CASE( sn_snd_temp%clcat ) 
     1739               CASE( 'yes' )    
     1740                  ztmp3(:,:,1:jpl) = tn_ice(:,:,1:jpl) 
     1741               CASE( 'no' ) 
     1742                  WHERE( SUM( a_i, dim=3 ) /= 0. ) 
     1743                     ztmp3(:,:,1) = SUM( tn_ice * a_i, dim=3 ) / SUM( a_i, dim=3 ) 
     1744                  ELSEWHERE 
     1745                     ztmp3(:,:,1) = rt0 ! TODO: Is freezing point a good default? (Maybe SST is better?) 
     1746                  END WHERE 
     1747               CASE default   ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_temp%clcat' ) 
     1748               END SELECT 
     1749            CASE( 'weighted oce and ice' )   ;   ztmp1(:,:) = ( ztmp1(:,:) + rt0 ) * zfr_l(:,:)    
     1750               SELECT CASE( sn_snd_temp%clcat ) 
     1751               CASE( 'yes' )    
     1752                  ztmp3(:,:,1:jpl) = tn_ice(:,:,1:jpl) * a_i(:,:,1:jpl) 
     1753               CASE( 'no' ) 
     1754                  ztmp3(:,:,:) = 0.0 
     1755                  DO jl=1,jpl 
     1756                     ztmp3(:,:,1) = ztmp3(:,:,1) + tn_ice(:,:,jl) * a_i(:,:,jl) 
     1757                  ENDDO 
     1758               CASE default                  ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_temp%clcat' ) 
     1759               END SELECT 
     1760            CASE( 'mixed oce-ice'        )    
     1761               ztmp1(:,:) = ( ztmp1(:,:) + rt0 ) * zfr_l(:,:)  
    13701762               DO jl=1,jpl 
    1371                   ztmp3(:,:,1) = ztmp3(:,:,1) + tn_ice(:,:,jl) * a_i(:,:,jl) 
     1763                  ztmp1(:,:) = ztmp1(:,:) + tn_ice(:,:,jl) * a_i(:,:,jl) 
    13721764               ENDDO 
    1373             CASE default                  ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_temp%clcat' ) 
     1765            CASE default                     ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_temp%cldes' ) 
    13741766            END SELECT 
    1375          CASE( 'mixed oce-ice'        )    
    1376             ztmp1(:,:) = ( tsn(:,:,1,1) + rt0 ) * zfr_l(:,:)  
    1377             DO jl=1,jpl 
    1378                ztmp1(:,:) = ztmp1(:,:) + tn_ice(:,:,jl) * a_i(:,:,jl) 
    1379             ENDDO 
    1380          CASE default                     ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_temp%cldes' ) 
     1767         ENDIF 
     1768         IF( ssnd(jps_toce)%laction )   CALL cpl_snd( jps_toce, isec, RESHAPE ( ztmp1, (/jpi,jpj,1/) ), info ) 
     1769         IF( ssnd(jps_tice)%laction )   CALL cpl_snd( jps_tice, isec, ztmp3, info ) 
     1770         IF( ssnd(jps_tmix)%laction )   CALL cpl_snd( jps_tmix, isec, RESHAPE ( ztmp1, (/jpi,jpj,1/) ), info ) 
     1771      ENDIF 
     1772      !                                                      ! ------------------------- ! 
     1773      !                                                      !           Albedo          ! 
     1774      !                                                      ! ------------------------- ! 
     1775      IF( ssnd(jps_albice)%laction ) THEN                         ! ice  
     1776         SELECT CASE( sn_snd_alb%cldes ) 
     1777         CASE( 'ice'          )   ; ztmp3(:,:,1:jpl) = alb_ice(:,:,1:jpl) 
     1778         CASE( 'weighted ice' )   ; ztmp3(:,:,1:jpl) = alb_ice(:,:,1:jpl) * a_i(:,:,1:jpl) 
     1779         CASE default             ; CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_alb%cldes' ) 
    13811780         END SELECT 
    1382          IF( ssnd(jps_toce)%laction )   CALL cpl_prism_snd( jps_toce, isec, RESHAPE ( ztmp1, (/jpi,jpj,1/) ), info ) 
    1383          IF( ssnd(jps_tice)%laction )   CALL cpl_prism_snd( jps_tice, isec, ztmp3, info ) 
    1384          IF( ssnd(jps_tmix)%laction )   CALL cpl_prism_snd( jps_tmix, isec, RESHAPE ( ztmp1, (/jpi,jpj,1/) ), info ) 
    1385       ENDIF 
    1386       ! 
    1387       !                                                      ! ------------------------- ! 
    1388       !                                                      !           Albedo          ! 
    1389       !                                                      ! ------------------------- ! 
    1390       IF( ssnd(jps_albice)%laction ) THEN                         ! ice  
    1391          ztmp3(:,:,1:jpl) = alb_ice(:,:,1:jpl) * a_i(:,:,1:jpl) 
    1392          CALL cpl_prism_snd( jps_albice, isec, ztmp3, info ) 
     1781         CALL cpl_snd( jps_albice, isec, ztmp3, info ) 
    13931782      ENDIF 
    13941783      IF( ssnd(jps_albmix)%laction ) THEN                         ! mixed ice-ocean 
     
    13971786            ztmp1(:,:) = ztmp1(:,:) + alb_ice(:,:,jl) * a_i(:,:,jl) 
    13981787         ENDDO 
    1399          CALL cpl_prism_snd( jps_albmix, isec, RESHAPE ( ztmp1, (/jpi,jpj,1/) ), info ) 
     1788         CALL cpl_snd( jps_albmix, isec, RESHAPE ( ztmp1, (/jpi,jpj,1/) ), info ) 
    14001789      ENDIF 
    14011790      !                                                      ! ------------------------- ! 
    14021791      !                                                      !  Ice fraction & Thickness !  
    14031792      !                                                      ! ------------------------- ! 
    1404       ! Send ice fraction field  
     1793      ! Send ice fraction field to atmosphere 
    14051794      IF( ssnd(jps_fice)%laction ) THEN 
    14061795         SELECT CASE( sn_snd_thick%clcat ) 
     
    14091798         CASE default    ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_thick%clcat' ) 
    14101799         END SELECT 
    1411          CALL cpl_prism_snd( jps_fice, isec, ztmp3, info ) 
     1800         IF( ssnd(jps_fice)%laction )   CALL cpl_snd( jps_fice, isec, ztmp3, info ) 
     1801      ENDIF 
     1802       
     1803      ! Send ice fraction field to OPA (sent by SAS in SAS-OPA coupling) 
     1804      IF( ssnd(jps_fice2)%laction ) THEN 
     1805         ztmp3(:,:,1) = fr_i(:,:) 
     1806         IF( ssnd(jps_fice2)%laction )   CALL cpl_snd( jps_fice2, isec, ztmp3, info ) 
    14121807      ENDIF 
    14131808 
     
    14301825            END SELECT 
    14311826         CASE( 'ice and snow'         )    
    1432             ztmp3(:,:,1:jpl) = ht_i(:,:,1:jpl) 
    1433             ztmp4(:,:,1:jpl) = ht_s(:,:,1:jpl) 
     1827            SELECT CASE( sn_snd_thick%clcat ) 
     1828            CASE( 'yes' ) 
     1829               ztmp3(:,:,1:jpl) = ht_i(:,:,1:jpl) 
     1830               ztmp4(:,:,1:jpl) = ht_s(:,:,1:jpl) 
     1831            CASE( 'no' ) 
     1832               WHERE( SUM( a_i, dim=3 ) /= 0. ) 
     1833                  ztmp3(:,:,1) = SUM( ht_i * a_i, dim=3 ) / SUM( a_i, dim=3 ) 
     1834                  ztmp4(:,:,1) = SUM( ht_s * a_i, dim=3 ) / SUM( a_i, dim=3 ) 
     1835               ELSEWHERE 
     1836                 ztmp3(:,:,1) = 0. 
     1837                 ztmp4(:,:,1) = 0. 
     1838               END WHERE 
     1839            CASE default                  ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_thick%clcat' ) 
     1840            END SELECT 
    14341841         CASE default                     ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_thick%cldes' ) 
    14351842         END SELECT 
    1436          IF( ssnd(jps_hice)%laction )   CALL cpl_prism_snd( jps_hice, isec, ztmp3, info ) 
    1437          IF( ssnd(jps_hsnw)%laction )   CALL cpl_prism_snd( jps_hsnw, isec, ztmp4, info ) 
     1843         IF( ssnd(jps_hice)%laction )   CALL cpl_snd( jps_hice, isec, ztmp3, info ) 
     1844         IF( ssnd(jps_hsnw)%laction )   CALL cpl_snd( jps_hsnw, isec, ztmp4, info ) 
    14381845      ENDIF 
    14391846      ! 
     
    14421849      !                                                      !  CO2 flux from PISCES     !  
    14431850      !                                                      ! ------------------------- ! 
    1444       IF( ssnd(jps_co2)%laction )   CALL cpl_prism_snd( jps_co2, isec, RESHAPE ( oce_co2, (/jpi,jpj,1/) ) , info ) 
     1851      IF( ssnd(jps_co2)%laction )   CALL cpl_snd( jps_co2, isec, RESHAPE ( oce_co2, (/jpi,jpj,1/) ) , info ) 
    14451852      ! 
    14461853#endif 
     
    14571864         !                                                              i-1  i   i 
    14581865         !                                                               i      i+1 (for I) 
    1459          SELECT CASE( TRIM( sn_snd_crt%cldes ) ) 
    1460          CASE( 'oce only'             )      ! C-grid ==> T 
    1461             DO jj = 2, jpjm1 
    1462                DO ji = fs_2, fs_jpim1   ! vector opt. 
    1463                   zotx1(ji,jj) = 0.5 * ( un(ji,jj,1) + un(ji-1,jj  ,1) ) 
    1464                   zoty1(ji,jj) = 0.5 * ( vn(ji,jj,1) + vn(ji  ,jj-1,1) )  
    1465                END DO 
    1466             END DO 
    1467          CASE( 'weighted oce and ice' )    
    1468             SELECT CASE ( cp_ice_msh ) 
    1469             CASE( 'C' )                      ! Ocean and Ice on C-grid ==> T 
     1866         IF( nn_components == jp_iam_opa ) THEN 
     1867            zotx1(:,:) = un(:,:,1)   
     1868            zoty1(:,:) = vn(:,:,1)   
     1869         ELSE         
     1870            SELECT CASE( TRIM( sn_snd_crt%cldes ) ) 
     1871            CASE( 'oce only'             )      ! C-grid ==> T 
    14701872               DO jj = 2, jpjm1 
    14711873                  DO ji = fs_2, fs_jpim1   ! vector opt. 
    1472                      zotx1(ji,jj) = 0.5 * ( un   (ji,jj,1) + un   (ji-1,jj  ,1) ) * zfr_l(ji,jj)   
    1473                      zoty1(ji,jj) = 0.5 * ( vn   (ji,jj,1) + vn   (ji  ,jj-1,1) ) * zfr_l(ji,jj) 
    1474                      zitx1(ji,jj) = 0.5 * ( u_ice(ji,jj  ) + u_ice(ji-1,jj    ) ) *  fr_i(ji,jj) 
    1475                      zity1(ji,jj) = 0.5 * ( v_ice(ji,jj  ) + v_ice(ji  ,jj-1  ) ) *  fr_i(ji,jj) 
     1874                     zotx1(ji,jj) = 0.5 * ( un(ji,jj,1) + un(ji-1,jj  ,1) ) 
     1875                     zoty1(ji,jj) = 0.5 * ( vn(ji,jj,1) + vn(ji  ,jj-1,1) )  
    14761876                  END DO 
    14771877               END DO 
    1478             CASE( 'I' )                      ! Ocean on C grid, Ice on I-point (B-grid) ==> T 
    1479                DO jj = 2, jpjm1 
    1480                   DO ji = 2, jpim1   ! NO vector opt. 
    1481                      zotx1(ji,jj) = 0.5  * ( un(ji,jj,1)      + un(ji-1,jj  ,1) ) * zfr_l(ji,jj)   
    1482                      zoty1(ji,jj) = 0.5  * ( vn(ji,jj,1)      + vn(ji  ,jj-1,1) ) * zfr_l(ji,jj)   
    1483                      zitx1(ji,jj) = 0.25 * ( u_ice(ji+1,jj+1) + u_ice(ji,jj+1)                     & 
    1484                         &                  + u_ice(ji+1,jj  ) + u_ice(ji,jj  )  ) *  fr_i(ji,jj) 
    1485                      zity1(ji,jj) = 0.25 * ( v_ice(ji+1,jj+1) + v_ice(ji,jj+1)                     & 
    1486                         &                  + v_ice(ji+1,jj  ) + v_ice(ji,jj  )  ) *  fr_i(ji,jj) 
     1878            CASE( 'weighted oce and ice' )    
     1879               SELECT CASE ( cp_ice_msh ) 
     1880               CASE( 'C' )                      ! Ocean and Ice on C-grid ==> T 
     1881                  DO jj = 2, jpjm1 
     1882                     DO ji = fs_2, fs_jpim1   ! vector opt. 
     1883                        zotx1(ji,jj) = 0.5 * ( un   (ji,jj,1) + un   (ji-1,jj  ,1) ) * zfr_l(ji,jj)   
     1884                        zoty1(ji,jj) = 0.5 * ( vn   (ji,jj,1) + vn   (ji  ,jj-1,1) ) * zfr_l(ji,jj) 
     1885                        zitx1(ji,jj) = 0.5 * ( u_ice(ji,jj  ) + u_ice(ji-1,jj    ) ) *  fr_i(ji,jj) 
     1886                        zity1(ji,jj) = 0.5 * ( v_ice(ji,jj  ) + v_ice(ji  ,jj-1  ) ) *  fr_i(ji,jj) 
     1887                     END DO 
    14871888                  END DO 
    1488                END DO 
    1489             CASE( 'F' )                      ! Ocean on C grid, Ice on F-point (B-grid) ==> T 
    1490                DO jj = 2, jpjm1 
    1491                   DO ji = 2, jpim1   ! NO vector opt. 
    1492                      zotx1(ji,jj) = 0.5  * ( un(ji,jj,1)      + un(ji-1,jj  ,1) ) * zfr_l(ji,jj)   
    1493                      zoty1(ji,jj) = 0.5  * ( vn(ji,jj,1)      + vn(ji  ,jj-1,1) ) * zfr_l(ji,jj)   
    1494                      zitx1(ji,jj) = 0.25 * ( u_ice(ji-1,jj-1) + u_ice(ji,jj-1)                     & 
    1495                         &                  + u_ice(ji-1,jj  ) + u_ice(ji,jj  )  ) *  fr_i(ji,jj) 
    1496                      zity1(ji,jj) = 0.25 * ( v_ice(ji-1,jj-1) + v_ice(ji,jj-1)                     & 
    1497                         &                  + v_ice(ji-1,jj  ) + v_ice(ji,jj  )  ) *  fr_i(ji,jj) 
     1889               CASE( 'I' )                      ! Ocean on C grid, Ice on I-point (B-grid) ==> T 
     1890                  DO jj = 2, jpjm1 
     1891                     DO ji = 2, jpim1   ! NO vector opt. 
     1892                        zotx1(ji,jj) = 0.5  * ( un(ji,jj,1)      + un(ji-1,jj  ,1) ) * zfr_l(ji,jj)   
     1893                        zoty1(ji,jj) = 0.5  * ( vn(ji,jj,1)      + vn(ji  ,jj-1,1) ) * zfr_l(ji,jj)   
     1894                        zitx1(ji,jj) = 0.25 * ( u_ice(ji+1,jj+1) + u_ice(ji,jj+1)                     & 
     1895                           &                  + u_ice(ji+1,jj  ) + u_ice(ji,jj  )  ) *  fr_i(ji,jj) 
     1896                        zity1(ji,jj) = 0.25 * ( v_ice(ji+1,jj+1) + v_ice(ji,jj+1)                     & 
     1897                           &                  + v_ice(ji+1,jj  ) + v_ice(ji,jj  )  ) *  fr_i(ji,jj) 
     1898                     END DO 
    14981899                  END DO 
    1499                END DO 
     1900               CASE( 'F' )                      ! Ocean on C grid, Ice on F-point (B-grid) ==> T 
     1901                  DO jj = 2, jpjm1 
     1902                     DO ji = 2, jpim1   ! NO vector opt. 
     1903                        zotx1(ji,jj) = 0.5  * ( un(ji,jj,1)      + un(ji-1,jj  ,1) ) * zfr_l(ji,jj)   
     1904                        zoty1(ji,jj) = 0.5  * ( vn(ji,jj,1)      + vn(ji  ,jj-1,1) ) * zfr_l(ji,jj)   
     1905                        zitx1(ji,jj) = 0.25 * ( u_ice(ji-1,jj-1) + u_ice(ji,jj-1)                     & 
     1906                           &                  + u_ice(ji-1,jj  ) + u_ice(ji,jj  )  ) *  fr_i(ji,jj) 
     1907                        zity1(ji,jj) = 0.25 * ( v_ice(ji-1,jj-1) + v_ice(ji,jj-1)                     & 
     1908                           &                  + v_ice(ji-1,jj  ) + v_ice(ji,jj  )  ) *  fr_i(ji,jj) 
     1909                     END DO 
     1910                  END DO 
     1911               END SELECT 
     1912               CALL lbc_lnk( zitx1, 'T', -1. )   ;   CALL lbc_lnk( zity1, 'T', -1. ) 
     1913            CASE( 'mixed oce-ice'        ) 
     1914               SELECT CASE ( cp_ice_msh ) 
     1915               CASE( 'C' )                      ! Ocean and Ice on C-grid ==> T 
     1916                  DO jj = 2, jpjm1 
     1917                     DO ji = fs_2, fs_jpim1   ! vector opt. 
     1918                        zotx1(ji,jj) = 0.5 * ( un   (ji,jj,1) + un   (ji-1,jj  ,1) ) * zfr_l(ji,jj)   & 
     1919                           &         + 0.5 * ( u_ice(ji,jj  ) + u_ice(ji-1,jj    ) ) *  fr_i(ji,jj) 
     1920                        zoty1(ji,jj) = 0.5 * ( vn   (ji,jj,1) + vn   (ji  ,jj-1,1) ) * zfr_l(ji,jj)   & 
     1921                           &         + 0.5 * ( v_ice(ji,jj  ) + v_ice(ji  ,jj-1  ) ) *  fr_i(ji,jj) 
     1922                     END DO 
     1923                  END DO 
     1924               CASE( 'I' )                      ! Ocean on C grid, Ice on I-point (B-grid) ==> T 
     1925                  DO jj = 2, jpjm1 
     1926                     DO ji = 2, jpim1   ! NO vector opt. 
     1927                        zotx1(ji,jj) = 0.5  * ( un(ji,jj,1)      + un(ji-1,jj  ,1) ) * zfr_l(ji,jj)   &    
     1928                           &         + 0.25 * ( u_ice(ji+1,jj+1) + u_ice(ji,jj+1)                     & 
     1929                           &                  + u_ice(ji+1,jj  ) + u_ice(ji,jj  )  ) *  fr_i(ji,jj) 
     1930                        zoty1(ji,jj) = 0.5  * ( vn(ji,jj,1)      + vn(ji  ,jj-1,1) ) * zfr_l(ji,jj)   &  
     1931                           &         + 0.25 * ( v_ice(ji+1,jj+1) + v_ice(ji,jj+1)                     & 
     1932                           &                  + v_ice(ji+1,jj  ) + v_ice(ji,jj  )  ) *  fr_i(ji,jj) 
     1933                     END DO 
     1934                  END DO 
     1935               CASE( 'F' )                      ! Ocean on C grid, Ice on F-point (B-grid) ==> T 
     1936                  DO jj = 2, jpjm1 
     1937                     DO ji = 2, jpim1   ! NO vector opt. 
     1938                        zotx1(ji,jj) = 0.5  * ( un(ji,jj,1)      + un(ji-1,jj  ,1) ) * zfr_l(ji,jj)   &    
     1939                           &         + 0.25 * ( u_ice(ji-1,jj-1) + u_ice(ji,jj-1)                     & 
     1940                           &                  + u_ice(ji-1,jj  ) + u_ice(ji,jj  )  ) *  fr_i(ji,jj) 
     1941                        zoty1(ji,jj) = 0.5  * ( vn(ji,jj,1)      + vn(ji  ,jj-1,1) ) * zfr_l(ji,jj)   &  
     1942                           &         + 0.25 * ( v_ice(ji-1,jj-1) + v_ice(ji,jj-1)                     & 
     1943                           &                  + v_ice(ji-1,jj  ) + v_ice(ji,jj  )  ) *  fr_i(ji,jj) 
     1944                     END DO 
     1945                  END DO 
     1946               END SELECT 
    15001947            END SELECT 
    1501             CALL lbc_lnk( zitx1, 'T', -1. )   ;   CALL lbc_lnk( zity1, 'T', -1. ) 
    1502          CASE( 'mixed oce-ice'        ) 
    1503             SELECT CASE ( cp_ice_msh ) 
    1504             CASE( 'C' )                      ! Ocean and Ice on C-grid ==> T 
    1505                DO jj = 2, jpjm1 
    1506                   DO ji = fs_2, fs_jpim1   ! vector opt. 
    1507                      zotx1(ji,jj) = 0.5 * ( un   (ji,jj,1) + un   (ji-1,jj  ,1) ) * zfr_l(ji,jj)   & 
    1508                         &         + 0.5 * ( u_ice(ji,jj  ) + u_ice(ji-1,jj    ) ) *  fr_i(ji,jj) 
    1509                      zoty1(ji,jj) = 0.5 * ( vn   (ji,jj,1) + vn   (ji  ,jj-1,1) ) * zfr_l(ji,jj)   & 
    1510                         &         + 0.5 * ( v_ice(ji,jj  ) + v_ice(ji  ,jj-1  ) ) *  fr_i(ji,jj) 
    1511                   END DO 
    1512                END DO 
    1513             CASE( 'I' )                      ! Ocean on C grid, Ice on I-point (B-grid) ==> T 
    1514                DO jj = 2, jpjm1 
    1515                   DO ji = 2, jpim1   ! NO vector opt. 
    1516                      zotx1(ji,jj) = 0.5  * ( un(ji,jj,1)      + un(ji-1,jj  ,1) ) * zfr_l(ji,jj)   &    
    1517                         &         + 0.25 * ( u_ice(ji+1,jj+1) + u_ice(ji,jj+1)                     & 
    1518                         &                  + u_ice(ji+1,jj  ) + u_ice(ji,jj  )  ) *  fr_i(ji,jj) 
    1519                      zoty1(ji,jj) = 0.5  * ( vn(ji,jj,1)      + vn(ji  ,jj-1,1) ) * zfr_l(ji,jj)   &  
    1520                         &         + 0.25 * ( v_ice(ji+1,jj+1) + v_ice(ji,jj+1)                     & 
    1521                         &                  + v_ice(ji+1,jj  ) + v_ice(ji,jj  )  ) *  fr_i(ji,jj) 
    1522                   END DO 
    1523                END DO 
    1524             CASE( 'F' )                      ! Ocean on C grid, Ice on F-point (B-grid) ==> T 
    1525                DO jj = 2, jpjm1 
    1526                   DO ji = 2, jpim1   ! NO vector opt. 
    1527                      zotx1(ji,jj) = 0.5  * ( un(ji,jj,1)      + un(ji-1,jj  ,1) ) * zfr_l(ji,jj)   &    
    1528                         &         + 0.25 * ( u_ice(ji-1,jj-1) + u_ice(ji,jj-1)                     & 
    1529                         &                  + u_ice(ji-1,jj  ) + u_ice(ji,jj  )  ) *  fr_i(ji,jj) 
    1530                      zoty1(ji,jj) = 0.5  * ( vn(ji,jj,1)      + vn(ji  ,jj-1,1) ) * zfr_l(ji,jj)   &  
    1531                         &         + 0.25 * ( v_ice(ji-1,jj-1) + v_ice(ji,jj-1)                     & 
    1532                         &                  + v_ice(ji-1,jj  ) + v_ice(ji,jj  )  ) *  fr_i(ji,jj) 
    1533                   END DO 
    1534                END DO 
    1535             END SELECT 
    1536          END SELECT 
    1537          CALL lbc_lnk( zotx1, ssnd(jps_ocx1)%clgrid, -1. )   ;   CALL lbc_lnk( zoty1, ssnd(jps_ocy1)%clgrid, -1. ) 
     1948            CALL lbc_lnk( zotx1, ssnd(jps_ocx1)%clgrid, -1. )   ;   CALL lbc_lnk( zoty1, ssnd(jps_ocy1)%clgrid, -1. ) 
     1949            ! 
     1950         ENDIF 
    15381951         ! 
    15391952         ! 
     
    15651978         ENDIF 
    15661979         ! 
    1567          IF( ssnd(jps_ocx1)%laction )   CALL cpl_prism_snd( jps_ocx1, isec, RESHAPE ( zotx1, (/jpi,jpj,1/) ), info )   ! ocean x current 1st grid 
    1568          IF( ssnd(jps_ocy1)%laction )   CALL cpl_prism_snd( jps_ocy1, isec, RESHAPE ( zoty1, (/jpi,jpj,1/) ), info )   ! ocean y current 1st grid 
    1569          IF( ssnd(jps_ocz1)%laction )   CALL cpl_prism_snd( jps_ocz1, isec, RESHAPE ( zotz1, (/jpi,jpj,1/) ), info )   ! ocean z current 1st grid 
     1980         IF( ssnd(jps_ocx1)%laction )   CALL cpl_snd( jps_ocx1, isec, RESHAPE ( zotx1, (/jpi,jpj,1/) ), info )   ! ocean x current 1st grid 
     1981         IF( ssnd(jps_ocy1)%laction )   CALL cpl_snd( jps_ocy1, isec, RESHAPE ( zoty1, (/jpi,jpj,1/) ), info )   ! ocean y current 1st grid 
     1982         IF( ssnd(jps_ocz1)%laction )   CALL cpl_snd( jps_ocz1, isec, RESHAPE ( zotz1, (/jpi,jpj,1/) ), info )   ! ocean z current 1st grid 
    15701983         ! 
    1571          IF( ssnd(jps_ivx1)%laction )   CALL cpl_prism_snd( jps_ivx1, isec, RESHAPE ( zitx1, (/jpi,jpj,1/) ), info )   ! ice   x current 1st grid 
    1572          IF( ssnd(jps_ivy1)%laction )   CALL cpl_prism_snd( jps_ivy1, isec, RESHAPE ( zity1, (/jpi,jpj,1/) ), info )   ! ice   y current 1st grid 
    1573          IF( ssnd(jps_ivz1)%laction )   CALL cpl_prism_snd( jps_ivz1, isec, RESHAPE ( zitz1, (/jpi,jpj,1/) ), info )   ! ice   z current 1st grid 
     1984         IF( ssnd(jps_ivx1)%laction )   CALL cpl_snd( jps_ivx1, isec, RESHAPE ( zitx1, (/jpi,jpj,1/) ), info )   ! ice   x current 1st grid 
     1985         IF( ssnd(jps_ivy1)%laction )   CALL cpl_snd( jps_ivy1, isec, RESHAPE ( zity1, (/jpi,jpj,1/) ), info )   ! ice   y current 1st grid 
     1986         IF( ssnd(jps_ivz1)%laction )   CALL cpl_snd( jps_ivz1, isec, RESHAPE ( zitz1, (/jpi,jpj,1/) ), info )   ! ice   z current 1st grid 
    15741987         !  
    15751988      ENDIF 
    15761989      ! 
     1990      ! 
     1991      !  Fields sent by OPA to SAS when doing OPA<->SAS coupling 
     1992      !                                                        ! SSH 
     1993      IF( ssnd(jps_ssh )%laction )  THEN 
     1994         !                          ! removed inverse barometer ssh when Patm 
     1995         !                          forcing is used (for sea-ice dynamics) 
     1996         IF( ln_apr_dyn ) THEN   ;   ztmp1(:,:) = sshb(:,:) - 0.5 * ( ssh_ib(:,:) + ssh_ibb(:,:) ) 
     1997         ELSE                    ;   ztmp1(:,:) = sshn(:,:) 
     1998         ENDIF 
     1999         CALL cpl_snd( jps_ssh   , isec, RESHAPE ( ztmp1            , (/jpi,jpj,1/) ), info ) 
     2000 
     2001      ENDIF 
     2002      !                                                        ! SSS 
     2003      IF( ssnd(jps_soce  )%laction )  THEN 
     2004         CALL cpl_snd( jps_soce  , isec, RESHAPE ( tsn(:,:,1,jp_sal), (/jpi,jpj,1/) ), info ) 
     2005      ENDIF 
     2006      !                                                        ! first T level thickness  
     2007      IF( ssnd(jps_e3t1st )%laction )  THEN 
     2008         CALL cpl_snd( jps_e3t1st, isec, RESHAPE ( fse3t_n(:,:,1)   , (/jpi,jpj,1/) ), info ) 
     2009      ENDIF 
     2010      !                                                        ! Qsr fraction 
     2011      IF( ssnd(jps_fraqsr)%laction )  THEN 
     2012         CALL cpl_snd( jps_fraqsr, isec, RESHAPE ( fraqsr_1lev(:,:) , (/jpi,jpj,1/) ), info ) 
     2013      ENDIF 
     2014      ! 
     2015      !  Fields sent by SAS to OPA when OASIS coupling 
     2016      !                                                        ! Solar heat flux 
     2017      IF( ssnd(jps_qsroce)%laction )  CALL cpl_snd( jps_qsroce, isec, RESHAPE ( qsr , (/jpi,jpj,1/) ), info ) 
     2018      IF( ssnd(jps_qnsoce)%laction )  CALL cpl_snd( jps_qnsoce, isec, RESHAPE ( qns , (/jpi,jpj,1/) ), info ) 
     2019      IF( ssnd(jps_oemp  )%laction )  CALL cpl_snd( jps_oemp  , isec, RESHAPE ( emp , (/jpi,jpj,1/) ), info ) 
     2020      IF( ssnd(jps_sflx  )%laction )  CALL cpl_snd( jps_sflx  , isec, RESHAPE ( sfx , (/jpi,jpj,1/) ), info ) 
     2021      IF( ssnd(jps_otx1  )%laction )  CALL cpl_snd( jps_otx1  , isec, RESHAPE ( utau, (/jpi,jpj,1/) ), info ) 
     2022      IF( ssnd(jps_oty1  )%laction )  CALL cpl_snd( jps_oty1  , isec, RESHAPE ( vtau, (/jpi,jpj,1/) ), info ) 
     2023      IF( ssnd(jps_rnf   )%laction )  CALL cpl_snd( jps_rnf   , isec, RESHAPE ( rnf , (/jpi,jpj,1/) ), info ) 
     2024      IF( ssnd(jps_taum  )%laction )  CALL cpl_snd( jps_taum  , isec, RESHAPE ( taum, (/jpi,jpj,1/) ), info ) 
     2025 
    15772026      CALL wrk_dealloc( jpi,jpj, zfr_l, ztmp1, ztmp2, zotx1, zoty1, zotz1, zitx1, zity1, zitz1 ) 
    15782027      CALL wrk_dealloc( jpi,jpj,jpl, ztmp3, ztmp4 ) 
     
    15822031   END SUBROUTINE sbc_cpl_snd 
    15832032    
    1584 #else 
    1585    !!---------------------------------------------------------------------- 
    1586    !!   Dummy module                                            NO coupling 
    1587    !!---------------------------------------------------------------------- 
    1588    USE par_kind        ! kind definition 
    1589 CONTAINS 
    1590    SUBROUTINE sbc_cpl_snd( kt ) 
    1591       WRITE(*,*) 'sbc_cpl_snd: You should not have seen this print! error?', kt 
    1592    END SUBROUTINE sbc_cpl_snd 
    1593    ! 
    1594    SUBROUTINE sbc_cpl_rcv( kt, k_fsbc, k_ice )      
    1595       WRITE(*,*) 'sbc_cpl_snd: You should not have seen this print! error?', kt, k_fsbc, k_ice 
    1596    END SUBROUTINE sbc_cpl_rcv 
    1597    ! 
    1598    SUBROUTINE sbc_cpl_ice_tau( p_taui, p_tauj )      
    1599       REAL(wp), INTENT(out), DIMENSION(:,:) ::   p_taui   ! i- & j-components of atmos-ice stress [N/m2] 
    1600       REAL(wp), INTENT(out), DIMENSION(:,:) ::   p_tauj   ! at I-point (B-grid) or U & V-point (C-grid) 
    1601       p_taui(:,:) = 0.   ;   p_tauj(:,:) = 0. ! stupid definition to avoid warning message when compiling... 
    1602       WRITE(*,*) 'sbc_cpl_snd: You should not have seen this print! error?' 
    1603    END SUBROUTINE sbc_cpl_ice_tau 
    1604    ! 
    1605    SUBROUTINE sbc_cpl_ice_flx( p_frld , palbi   , psst    , pist  ) 
    1606       REAL(wp), INTENT(in   ), DIMENSION(:,:  ) ::   p_frld     ! lead fraction                [0 to 1] 
    1607       REAL(wp), INTENT(in   ), DIMENSION(:,:,:), OPTIONAL ::   palbi   ! ice albedo 
    1608       REAL(wp), INTENT(in   ), DIMENSION(:,:  ), OPTIONAL ::   psst    ! sea surface temperature      [Celcius] 
    1609       REAL(wp), INTENT(in   ), DIMENSION(:,:,:), OPTIONAL ::   pist    ! ice surface temperature      [Kelvin] 
    1610       WRITE(*,*) 'sbc_cpl_snd: You should not have seen this print! error?', p_frld(1,1), palbi(1,1,1), psst(1,1), pist(1,1,1)  
    1611    END SUBROUTINE sbc_cpl_ice_flx 
    1612     
    1613 #endif 
    1614  
    16152033   !!====================================================================== 
    16162034END MODULE sbccpl 
  • branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/sbcflx.F90

    r4624 r5837  
    156156            END DO 
    157157         END DO 
     158         taum(:,:) = taum(:,:) * tmask(:,:,1) ; wndm(:,:) = wndm(:,:) * tmask(:,:,1) 
    158159         CALL lbc_lnk( taum(:,:), 'T', 1. )   ;   CALL lbc_lnk( wndm(:,:), 'T', 1. ) 
    159160 
  • branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/sbcfwb.F90

    r4347 r5837  
    88   !!            3.0  ! 2006-08  (G. Madec)  Surface module 
    99   !!            3.2  ! 2009-07  (C. Talandier) emp mean s spread over erp area  
     10   !!            3.6  ! 2014-11  (P. Mathiot  ) add ice shelf melting 
    1011   !!---------------------------------------------------------------------- 
    1112 
     
    1920   USE phycst          ! physical constants 
    2021   USE sbcrnf          ! ocean runoffs 
     22   USE sbcisf          ! ice shelf melting contribution 
    2123   USE sbcssr          ! SS damping terms 
    2224   USE in_out_manager  ! I/O manager 
     
    5759      !!                =1 global mean of emp set to zero at each nn_fsbc time step 
    5860      !!                =2 annual global mean corrected from previous year 
     61      !!                =3 global mean of emp set to zero at each nn_fsbc time step 
     62      !!                   & spread out over erp area depending its sign 
    5963      !! Note: if sea ice is embedded it is taken into account when computing the budget  
    6064      !!---------------------------------------------------------------------- 
     
    8185            IF( kn_fwb == 1 )   WRITE(numout,*) '          instantaneously set to zero' 
    8286            IF( kn_fwb == 2 )   WRITE(numout,*) '          adjusted from previous year budget' 
    83          ENDIF 
    84          ! 
    85          area = glob_sum( e1e2t(:,:) )           ! interior global domain surface 
    86          ! 
    87 #if ! defined key_lim2 &&  ! defined key_lim3 && ! defined key_cice  
     87            IF( kn_fwb == 3 )   WRITE(numout,*) '          fwf set to zero and spread out over erp area' 
     88         ENDIF 
     89         ! 
     90         IF( kn_fwb == 3 .AND. nn_sssr /= 2 )   CALL ctl_stop( 'sbc_fwb: nn_fwb = 3 requires nn_sssr = 2, we stop ' ) 
     91         IF( kn_fwb == 3 .AND. ln_isfcav    )   CALL ctl_stop( 'sbc_fwb: nn_fwb = 3 with ln_isfcav = .TRUE. not working, we stop ' ) 
     92         ! 
     93         area = glob_sum( e1e2t(:,:) * tmask(:,:,1))           ! interior global domain surface 
     94         ! isf cavities are excluded because it can feedback to the melting with generation of inhibition of plumes 
     95         ! and in case of no melt, it can generate HSSW. 
     96         ! 
     97#if ! defined key_lim2 &&  ! defined key_lim3 && ! defined key_cice 
    8898         snwice_mass_b(:,:) = 0.e0               ! no sea-ice model is being used : no snow+ice mass 
    8999         snwice_mass  (:,:) = 0.e0 
     
    98108         ! 
    99109         IF( MOD( kt-1, kn_fsbc ) == 0 ) THEN 
    100             z_fwf = glob_sum( e1e2t(:,:) * ( emp(:,:) - rnf(:,:) -  snwice_fmass(:,:) ) ) / area   ! sum over the global domain 
     110            z_fwf = glob_sum( e1e2t(:,:) * ( emp(:,:) - rnf(:,:) + rdivisf * fwfisf(:,:) -  snwice_fmass(:,:) ) ) / area   ! sum over the global domain 
    101111            zcoef = z_fwf * rcp 
    102             emp(:,:) = emp(:,:) - z_fwf  
    103             qns(:,:) = qns(:,:) + zcoef * sst_m(:,:) ! account for change to the heat budget due to fw correction 
     112            emp(:,:) = emp(:,:) - z_fwf              * tmask(:,:,1) 
     113            qns(:,:) = qns(:,:) + zcoef * sst_m(:,:) * tmask(:,:,1) ! account for change to the heat budget due to fw correction 
    104114         ENDIF 
    105115         ! 
     
    132142         IF( MOD( kt-1, kn_fsbc ) == 0 ) THEN         ! correct the freshwater fluxes 
    133143            zcoef = fwfold * rcp 
    134             emp(:,:) = emp(:,:) + fwfold 
    135             qns(:,:) = qns(:,:) - zcoef * sst_m(:,:) ! account for change to the heat budget due to fw correction 
     144            emp(:,:) = emp(:,:) + fwfold             * tmask(:,:,1) 
     145            qns(:,:) = qns(:,:) - zcoef * sst_m(:,:) * tmask(:,:,1) ! account for change to the heat budget due to fw correction 
    136146         ENDIF 
    137147         ! 
     
    142152         ENDIF 
    143153         ! 
     154      CASE ( 3 )                             !==  global fwf set to zero and spread out over erp area  ==! 
     155         ! 
     156         IF( MOD( kt-1, kn_fsbc ) == 0 ) THEN 
     157            ztmsk_pos(:,:) = tmask_i(:,:)                      ! Select <0 and >0 area of erp 
     158            WHERE( erp < 0._wp )   ztmsk_pos = 0._wp 
     159            ztmsk_neg(:,:) = tmask_i(:,:) - ztmsk_pos(:,:) 
     160            ! 
     161            zsurf_neg = glob_sum( e1e2t(:,:)*ztmsk_neg(:,:) )  ! Area filled by <0 and >0 erp  
     162            zsurf_pos = glob_sum( e1e2t(:,:)*ztmsk_pos(:,:) ) 
     163            !                                                  ! fwf global mean (excluding ocean to ice/snow exchanges)  
     164            z_fwf     = glob_sum( e1e2t(:,:) * ( emp(:,:) - rnf(:,:) + rdivisf * fwfisf(:,:) - snwice_fmass(:,:) ) ) / area 
     165            !             
     166            IF( z_fwf < 0._wp ) THEN         ! spread out over >0 erp area to increase evaporation 
     167                zsurf_tospread      = zsurf_pos 
     168                ztmsk_tospread(:,:) = ztmsk_pos(:,:) 
     169            ELSE                             ! spread out over <0 erp area to increase precipitation 
     170                zsurf_tospread      = zsurf_neg 
     171                ztmsk_tospread(:,:) = ztmsk_neg(:,:) 
     172            ENDIF 
     173            ! 
     174            zsum_fwf   = glob_sum( e1e2t(:,:) * z_fwf )         ! fwf global mean over <0 or >0 erp area 
     175!!gm :  zsum_fwf   = z_fwf * area   ???  it is right?  I think so.... 
     176            z_fwf_nsrf =  zsum_fwf / ( zsurf_tospread + rsmall ) 
     177            !                                                  ! weight to respect erp field 2D structure  
     178            zsum_erp   = glob_sum( ztmsk_tospread(:,:) * erp(:,:) * e1e2t(:,:) ) 
     179            z_wgt(:,:) = ztmsk_tospread(:,:) * erp(:,:) / ( zsum_erp + rsmall ) 
     180            !                                                  ! final correction term to apply 
     181            zerp_cor(:,:) = -1. * z_fwf_nsrf * zsurf_tospread * z_wgt(:,:) 
     182            ! 
     183!!gm   ===>>>>  lbc_lnk should be useless as all the computation is done over the whole domain ! 
     184            CALL lbc_lnk( zerp_cor, 'T', 1. ) 
     185            ! 
     186            emp(:,:) = emp(:,:) + zerp_cor(:,:) 
     187            qns(:,:) = qns(:,:) - zerp_cor(:,:) * rcp * sst_m(:,:)  ! account for change to the heat budget due to fw correction 
     188            erp(:,:) = erp(:,:) + zerp_cor(:,:) 
     189            ! 
     190            IF( nprint == 1 .AND. lwp ) THEN                   ! control print 
     191               IF( z_fwf < 0._wp ) THEN 
     192                  WRITE(numout,*)'   z_fwf < 0' 
     193                  WRITE(numout,*)'   SUM(erp+)     = ', SUM( ztmsk_tospread(:,:)*erp(:,:)*e1e2t(:,:) )*1.e-9,' Sv' 
     194               ELSE 
     195                  WRITE(numout,*)'   z_fwf >= 0' 
     196                  WRITE(numout,*)'   SUM(erp-)     = ', SUM( ztmsk_tospread(:,:)*erp(:,:)*e1e2t(:,:) )*1.e-9,' Sv' 
     197               ENDIF 
     198               WRITE(numout,*)'   SUM(empG)     = ', SUM( z_fwf*e1e2t(:,:) )*1.e-9,' Sv' 
     199               WRITE(numout,*)'   z_fwf         = ', z_fwf      ,' Kg/m2/s' 
     200               WRITE(numout,*)'   z_fwf_nsrf    = ', z_fwf_nsrf ,' Kg/m2/s' 
     201               WRITE(numout,*)'   MIN(zerp_cor) = ', MINVAL(zerp_cor)  
     202               WRITE(numout,*)'   MAX(zerp_cor) = ', MAXVAL(zerp_cor)  
     203            ENDIF 
     204         ENDIF 
     205         ! 
    144206      CASE DEFAULT                           !==  you should never be there  ==! 
    145          CALL ctl_stop( 'sbc_fwb : wrong nn_fwb value for the FreshWater Budget correction, choose either 1 or 2' ) 
     207         CALL ctl_stop( 'sbc_fwb : wrong nn_fwb value for the FreshWater Budget correction, choose either 1, 2 or 3' ) 
    146208         ! 
    147209      END SELECT 
  • branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/sbcice_cice.F90

    • Property svn:keywords set to Id
    r4627 r5837  
    1717   USE phycst, only : rcp, rau0, r1_rau0, rhosn, rhoic 
    1818   USE in_out_manager  ! I/O manager 
     19   USE iom, ONLY : iom_put,iom_use              ! I/O manager library !!Joakim edit 
    1920   USE lib_mpp         ! distributed memory computing library 
    2021   USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
     
    2324   USE daymod          ! calendar 
    2425   USE fldread         ! read input fields 
    25  
    2626   USE sbc_oce         ! Surface boundary condition: ocean fields 
    2727   USE sbc_ice         ! Surface boundary condition: ice   fields 
     
    3838   USE ice_calendar, only: dt 
    3939   USE ice_state, only: aice,aicen,uvel,vvel,vsno,vsnon,vice,vicen 
     40# if defined key_cice4 
    4041   USE ice_flux, only: strax,stray,strocnx,strocny,frain,fsnow,  & 
     42                strocnxT,strocnyT,                               &  
    4143                sst,sss,uocn,vocn,ss_tltx,ss_tlty,fsalt_gbm,     & 
    4244                fresh_gbm,fhocn_gbm,fswthru_gbm,frzmlt,          & 
     
    4446                uatm,vatm,wind,fsw,flw,Tair,potT,Qa,rhoa,zlvl,   & 
    4547                swvdr,swvdf,swidr,swidf 
     48   USE ice_therm_vertical, only: calc_Tsfc 
     49#else 
     50   USE ice_flux, only: strax,stray,strocnx,strocny,frain,fsnow,  & 
     51                strocnxT,strocnyT,                               &  
     52                sst,sss,uocn,vocn,ss_tltx,ss_tlty,fsalt_ai,     & 
     53                fresh_ai,fhocn_ai,fswthru_ai,frzmlt,          & 
     54                flatn_f,fsurfn_f,fcondtopn_f,                    & 
     55                uatm,vatm,wind,fsw,flw,Tair,potT,Qa,rhoa,zlvl,   & 
     56                swvdr,swvdf,swidr,swidf 
     57   USE ice_therm_shared, only: calc_Tsfc 
     58#endif 
    4659   USE ice_forcing, only: frcvdr,frcvdf,frcidr,frcidf 
    4760   USE ice_atmo, only: calc_strair 
    48    USE ice_therm_vertical, only: calc_Tsfc 
    4961 
    5062   USE CICE_InitMod 
     
    8496#  include "domzgr_substitute.h90" 
    8597 
     98   !! $Id$ 
    8699CONTAINS 
    87100 
     
    95108   END FUNCTION sbc_ice_cice_alloc 
    96109 
    97    SUBROUTINE sbc_ice_cice( kt, nsbc ) 
     110   SUBROUTINE sbc_ice_cice( kt, ksbc ) 
    98111      !!--------------------------------------------------------------------- 
    99112      !!                  ***  ROUTINE sbc_ice_cice  *** 
     
    113126      !!--------------------------------------------------------------------- 
    114127      INTEGER, INTENT(in) ::   kt      ! ocean time step 
    115       INTEGER, INTENT(in) ::   nsbc    ! surface forcing type 
     128      INTEGER, INTENT(in) ::   ksbc    ! surface forcing type 
    116129      !!---------------------------------------------------------------------- 
    117130      ! 
     
    123136 
    124137         ! Make sure any fluxes required for CICE are set 
    125          IF ( nsbc == 2 ) THEN 
     138         IF      ( ksbc == jp_flx ) THEN 
    126139            CALL cice_sbc_force(kt) 
    127          ELSE IF ( nsbc == 5 ) THEN 
     140         ELSE IF ( ksbc == jp_purecpl ) THEN 
    128141            CALL sbc_cpl_ice_flx( 1.0-fr_i  ) 
    129142         ENDIF 
    130143 
    131          CALL cice_sbc_in ( kt, nsbc ) 
     144         CALL cice_sbc_in  ( kt, ksbc ) 
    132145         CALL CICE_Run 
    133          CALL cice_sbc_out ( kt, nsbc ) 
    134  
    135          IF ( nsbc == 5 )  CALL cice_sbc_hadgam(kt+1) 
     146         CALL cice_sbc_out ( kt, ksbc ) 
     147 
     148         IF ( ksbc == jp_purecpl )  CALL cice_sbc_hadgam(kt+1) 
    136149 
    137150      ENDIF                                          ! End sea-ice time step only 
     
    141154   END SUBROUTINE sbc_ice_cice 
    142155 
    143    SUBROUTINE cice_sbc_init (nsbc) 
     156   SUBROUTINE cice_sbc_init (ksbc) 
    144157      !!--------------------------------------------------------------------- 
    145158      !!                    ***  ROUTINE cice_sbc_init  *** 
    146159      !! ** Purpose: Initialise ice related fields for NEMO and coupling 
    147160      !! 
    148       INTEGER, INTENT( in  ) ::   nsbc                ! surface forcing type 
     161      INTEGER, INTENT( in  ) ::   ksbc                ! surface forcing type 
    149162      REAL(wp), DIMENSION(:,:), POINTER :: ztmp1, ztmp2 
    150163      REAL(wp) ::   zcoefu, zcoefv, zcoeff            ! local scalar 
    151       INTEGER  ::   ji, jj, jl                        ! dummy loop indices 
     164      INTEGER  ::   ji, jj, jl, jk                    ! dummy loop indices 
    152165      !!--------------------------------------------------------------------- 
    153166 
     
    161174      jj_off = INT ( (jpjglo - ny_global) / 2 ) 
    162175 
     176#if defined key_nemocice_decomp 
     177      ! Pass initial SST from NEMO to CICE so ice is initialised correctly if 
     178      ! there is no restart file. 
     179      ! Values from a CICE restart file would overwrite this 
     180      IF ( .NOT. ln_rstart ) THEN     
     181         CALL nemo2cice( tsn(:,:,1,jp_tem) , sst , 'T' , 1.)  
     182      ENDIF   
     183#endif 
     184 
    163185! Initialize CICE 
    164186      CALL CICE_Initialize 
    165187 
    166188! Do some CICE consistency checks 
    167       IF ( (nsbc == 2) .OR. (nsbc == 5) ) THEN 
     189      IF ( (ksbc == jp_flx) .OR. (ksbc == jp_purecpl) ) THEN 
    168190         IF ( calc_strair .OR. calc_Tsfc ) THEN 
    169191            CALL ctl_stop( 'STOP', 'cice_sbc_init : Forcing option requires calc_strair=F and calc_Tsfc=F in ice_in' ) 
    170192         ENDIF 
    171       ELSEIF (nsbc == 4) THEN 
     193      ELSEIF (ksbc == jp_core) THEN 
    172194         IF ( .NOT. (calc_strair .AND. calc_Tsfc) ) THEN 
    173195            CALL ctl_stop( 'STOP', 'cice_sbc_init : Forcing option requires calc_strair=T and calc_Tsfc=T in ice_in' ) 
     
    190212 
    191213      CALL cice2nemo(aice,fr_i, 'T', 1. ) 
    192       IF ( (nsbc == 2).OR.(nsbc == 5) ) THEN 
     214      IF ( (ksbc == jp_flx) .OR. (ksbc == jp_purecpl) ) THEN 
    193215         DO jl=1,ncat 
    194216            CALL cice2nemo(aicen(:,:,jl,:),a_i(:,:,jl), 'T', 1. ) 
     
    218240         snwice_mass_b(:,:) = 0.0_wp         ! no mass exchanges 
    219241      ENDIF 
    220       IF( nn_ice_embd == 2 .AND.          &  ! full embedment (case 2) & no restart :  
    221          &   .NOT.ln_rstart ) THEN           ! deplete the initial ssh belew sea-ice area 
    222          sshn(:,:) = sshn(:,:) - snwice_mass(:,:) * r1_rau0 
    223          sshb(:,:) = sshb(:,:) - snwice_mass(:,:) * r1_rau0 
    224          ! 
     242      IF( .NOT. ln_rstart ) THEN 
     243         IF( nn_ice_embd == 2 ) THEN            ! full embedment (case 2) deplete the initial ssh below sea-ice area 
     244            sshn(:,:) = sshn(:,:) - snwice_mass(:,:) * r1_rau0 
     245            sshb(:,:) = sshb(:,:) - snwice_mass(:,:) * r1_rau0 
     246#if defined key_vvl             
     247           ! key_vvl necessary? clem: yes for compilation purpose 
     248            DO jk = 1,jpkm1                     ! adjust initial vertical scale factors 
     249               fse3t_n(:,:,jk) = e3t_0(:,:,jk)*( 1._wp + sshn(:,:)*tmask(:,:,1)/(ht_0(:,:) + 1.0 - tmask(:,:,1)) ) 
     250               fse3t_b(:,:,jk) = e3t_0(:,:,jk)*( 1._wp + sshb(:,:)*tmask(:,:,1)/(ht_0(:,:) + 1.0 - tmask(:,:,1)) ) 
     251            ENDDO 
     252            fse3t_a(:,:,:) = fse3t_b(:,:,:) 
     253            ! Reconstruction of all vertical scale factors at now and before time 
     254            ! steps 
     255            ! ============================================================================= 
     256            ! Horizontal scale factor interpolations 
     257            ! -------------------------------------- 
     258            CALL dom_vvl_interpol( fse3t_b(:,:,:), fse3u_b(:,:,:), 'U' ) 
     259            CALL dom_vvl_interpol( fse3t_b(:,:,:), fse3v_b(:,:,:), 'V' ) 
     260            CALL dom_vvl_interpol( fse3t_n(:,:,:), fse3u_n(:,:,:), 'U' ) 
     261            CALL dom_vvl_interpol( fse3t_n(:,:,:), fse3v_n(:,:,:), 'V' ) 
     262            CALL dom_vvl_interpol( fse3u_n(:,:,:), fse3f_n(:,:,:), 'F' ) 
     263            ! Vertical scale factor interpolations 
     264            ! ------------------------------------ 
     265            CALL dom_vvl_interpol( fse3t_n(:,:,:), fse3w_n (:,:,:), 'W'  ) 
     266            CALL dom_vvl_interpol( fse3u_n(:,:,:), fse3uw_n(:,:,:), 'UW' ) 
     267            CALL dom_vvl_interpol( fse3v_n(:,:,:), fse3vw_n(:,:,:), 'VW' ) 
     268            CALL dom_vvl_interpol( fse3u_b(:,:,:), fse3uw_b(:,:,:), 'UW' ) 
     269            CALL dom_vvl_interpol( fse3v_b(:,:,:), fse3vw_b(:,:,:), 'VW' ) 
     270            ! t- and w- points depth 
     271            ! ---------------------- 
     272            fsdept_n(:,:,1) = 0.5_wp * fse3w_n(:,:,1) 
     273            fsdepw_n(:,:,1) = 0.0_wp 
     274            fsde3w_n(:,:,1) = fsdept_n(:,:,1) - sshn(:,:) 
     275            DO jk = 2, jpk 
     276               fsdept_n(:,:,jk) = fsdept_n(:,:,jk-1) + fse3w_n(:,:,jk) 
     277               fsdepw_n(:,:,jk) = fsdepw_n(:,:,jk-1) + fse3t_n(:,:,jk-1) 
     278               fsde3w_n(:,:,jk) = fsdept_n(:,:,jk  ) - sshn   (:,:) 
     279            END DO 
     280#endif 
     281         ENDIF 
    225282      ENDIF 
    226283  
     
    232289 
    233290    
    234    SUBROUTINE cice_sbc_in (kt, nsbc) 
     291   SUBROUTINE cice_sbc_in (kt, ksbc) 
    235292      !!--------------------------------------------------------------------- 
    236293      !!                    ***  ROUTINE cice_sbc_in  *** 
     
    238295      !!--------------------------------------------------------------------- 
    239296      INTEGER, INTENT(in   ) ::   kt   ! ocean time step 
    240       INTEGER, INTENT(in   ) ::   nsbc ! surface forcing type 
     297      INTEGER, INTENT(in   ) ::   ksbc ! surface forcing type 
    241298 
    242299      INTEGER  ::   ji, jj, jl                   ! dummy loop indices       
     
    262319! forced and coupled case  
    263320 
    264       IF ( (nsbc == 2).OR.(nsbc == 5) ) THEN 
     321      IF ( (ksbc == jp_flx).OR.(ksbc == jp_purecpl) ) THEN 
    265322 
    266323         ztmpn(:,:,:)=0.0 
     
    287344 
    288345! Surface downward latent heat flux (CI_5) 
    289          IF (nsbc == 2) THEN 
     346         IF (ksbc == jp_flx) THEN 
    290347            DO jl=1,ncat 
    291348               ztmpn(:,:,jl)=qla_ice(:,:,1)*a_i(:,:,jl) 
     
    316373! GBM conductive flux through ice (CI_6) 
    317374!  Convert to GBM 
    318             IF (nsbc == 2) THEN 
     375            IF (ksbc == jp_flx) THEN 
    319376               ztmp(:,:) = botmelt(:,:,jl)*a_i(:,:,jl) 
    320377            ELSE 
     
    325382! GBM surface heat flux (CI_7) 
    326383!  Convert to GBM 
    327             IF (nsbc == 2) THEN 
     384            IF (ksbc == jp_flx) THEN 
    328385               ztmp(:,:) = (topmelt(:,:,jl)+botmelt(:,:,jl))*a_i(:,:,jl)  
    329386            ELSE 
     
    333390         ENDDO 
    334391 
    335       ELSE IF (nsbc == 4) THEN 
     392      ELSE IF (ksbc == jp_core) THEN 
    336393 
    337394! Pass CORE forcing fields to CICE (which will calculate heat fluxes etc itself) 
     
    375432 
    376433! Snowfall 
    377 ! Ensure fsnow is positive (as in CICE routine prepare_forcing)   
     434! Ensure fsnow is positive (as in CICE routine prepare_forcing) 
     435      IF( iom_use('snowpre') )   CALL iom_put('snowpre',MAX( (1.0-fr_i(:,:))*sprecip(:,:) ,0.0)) !!Joakim edit   
    378436      ztmp(:,:)=MAX(fr_i(:,:)*sprecip(:,:),0.0)   
    379437      CALL nemo2cice(ztmp,fsnow,'T', 1. )  
    380438 
    381439! Rainfall 
     440      IF( iom_use('precip') )   CALL iom_put('precip', (1.0-fr_i(:,:))*(tprecip(:,:)-sprecip(:,:)) ) !!Joakim edit 
    382441      ztmp(:,:)=fr_i(:,:)*(tprecip(:,:)-sprecip(:,:)) 
    383442      CALL nemo2cice(ztmp,frain,'T', 1. )  
     
    450509      CALL nemo2cice(ztmp,ss_tlty,'F', -1. ) 
    451510 
    452       CALL wrk_dealloc( jpi,jpj, ztmp ) 
     511      CALL wrk_dealloc( jpi,jpj, ztmp, zpice ) 
    453512      CALL wrk_dealloc( jpi,jpj,ncat, ztmpn ) 
    454513      ! 
     
    458517 
    459518 
    460    SUBROUTINE cice_sbc_out (kt,nsbc) 
     519   SUBROUTINE cice_sbc_out (kt,ksbc) 
    461520      !!--------------------------------------------------------------------- 
    462521      !!                    ***  ROUTINE cice_sbc_out  *** 
     
    464523      !!--------------------------------------------------------------------- 
    465524      INTEGER, INTENT( in  ) ::   kt   ! ocean time step 
    466       INTEGER, INTENT( in  ) ::   nsbc ! surface forcing type 
     525      INTEGER, INTENT( in  ) ::   ksbc ! surface forcing type 
    467526       
    468527      INTEGER  ::   ji, jj, jl                 ! dummy loop indices 
     
    504563! Combine wind stress and ocean-ice stress 
    505564! [Note that fr_iu hasn't yet been updated, so still from start of CICE timestep] 
     565! strocnx and strocny already weighted by ice fraction in CICE so not done here  
    506566 
    507567      utau(:,:)=(1.0-fr_iu(:,:))*utau(:,:)-ss_iou(:,:) 
    508568      vtau(:,:)=(1.0-fr_iv(:,:))*vtau(:,:)-ss_iov(:,:)      
     569  
     570! Also need ice/ocean stress on T points so that taum can be updated  
     571! This interpolation is already done in CICE so best to use those values  
     572      CALL cice2nemo(strocnxT,ztmp1,'T',-1.)  
     573      CALL cice2nemo(strocnyT,ztmp2,'T',-1.)  
     574  
     575! Update taum with modulus of ice-ocean stress  
     576! strocnxT and strocnyT are not weighted by ice fraction in CICE so must be done here  
     577taum(:,:)=(1.0-fr_i(:,:))*taum(:,:)+fr_i(:,:)*SQRT(ztmp1**2. + ztmp2**2.)  
    509578 
    510579! Freshwater fluxes  
    511580 
    512       IF (nsbc == 2) THEN 
     581      IF (ksbc == jp_flx) THEN 
    513582! Note that emp from the forcing files is evap*(1-aice)-(tprecip-aice*sprecip) 
    514583! What we want here is evap*(1-aice)-tprecip*(1-aice) hence manipulation below 
     
    516585! Better to use evap and tprecip? (but for now don't read in evap in this case) 
    517586         emp(:,:)  = emp(:,:)+fr_i(:,:)*(tprecip(:,:)-sprecip(:,:)) 
    518       ELSE IF (nsbc == 4) THEN 
     587      ELSE IF (ksbc == jp_core) THEN 
    519588         emp(:,:)  = (1.0-fr_i(:,:))*emp(:,:)         
    520       ELSE IF (nsbc ==5) THEN 
     589      ELSE IF (ksbc == jp_purecpl) THEN 
    521590! emp_tot is set in sbc_cpl_ice_flx (called from cice_sbc_in above)  
    522591! This is currently as required with the coupling fields from the UM atmosphere 
     
    524593      ENDIF 
    525594 
     595#if defined key_cice4 
    526596      CALL cice2nemo(fresh_gbm,ztmp1,'T', 1. ) 
    527597      CALL cice2nemo(fsalt_gbm,ztmp2,'T', 1. ) 
     598#else 
     599      CALL cice2nemo(fresh_ai,ztmp1,'T', 1. ) 
     600      CALL cice2nemo(fsalt_ai,ztmp2,'T', 1. ) 
     601#endif 
    528602 
    529603! Check to avoid unphysical expression when ice is forming (ztmp1 negative) 
     
    535609      sfx(:,:)=ztmp2(:,:)*1000.0 
    536610      emp(:,:)=emp(:,:)-ztmp1(:,:) 
    537   
     611      fmmflx(:,:) = ztmp1(:,:) !!Joakim edit 
     612       
    538613      CALL lbc_lnk( emp , 'T', 1. ) 
    539614      CALL lbc_lnk( sfx , 'T', 1. ) 
     
    543618! Scale qsr and qns according to ice fraction (bulk formulae only) 
    544619 
    545       IF (nsbc == 4) THEN 
     620      IF (ksbc == jp_core) THEN 
    546621         qsr(:,:)=qsr(:,:)*(1.0-fr_i(:,:)) 
    547622         qns(:,:)=qns(:,:)*(1.0-fr_i(:,:)) 
    548623      ENDIF 
    549624! Take into account snow melting except for fully coupled when already in qns_tot 
    550       IF (nsbc == 5) THEN 
     625      IF (ksbc == jp_purecpl) THEN 
    551626         qsr(:,:)= qsr_tot(:,:) 
    552627         qns(:,:)= qns_tot(:,:) 
     
    557632! Now add in ice / snow related terms 
    558633! [fswthru will be zero unless running with calc_Tsfc=T in CICE] 
     634#if defined key_cice4 
    559635      CALL cice2nemo(fswthru_gbm,ztmp1,'T', 1. ) 
     636#else 
     637      CALL cice2nemo(fswthru_ai,ztmp1,'T', 1. ) 
     638#endif 
    560639      qsr(:,:)=qsr(:,:)+ztmp1(:,:) 
    561640      CALL lbc_lnk( qsr , 'T', 1. ) 
     
    567646      ENDDO 
    568647 
     648#if defined key_cice4 
    569649      CALL cice2nemo(fhocn_gbm,ztmp1,'T', 1. ) 
     650#else 
     651      CALL cice2nemo(fhocn_ai,ztmp1,'T', 1. ) 
     652#endif 
    570653      qns(:,:)=qns(:,:)+nfrzmlt(:,:)+ztmp1(:,:) 
    571654 
     
    575658 
    576659      CALL cice2nemo(aice,fr_i,'T', 1. ) 
    577       IF ( (nsbc == 2).OR.(nsbc == 5) ) THEN 
     660      IF ( (ksbc == jp_flx).OR.(ksbc == jp_purecpl) ) THEN 
    578661         DO jl=1,ncat 
    579662            CALL cice2nemo(aicen(:,:,jl,:),a_i(:,:,jl), 'T', 1. ) 
     
    611694 
    612695 
    613 #if defined key_oasis3 || defined key_oasis4 
    614696   SUBROUTINE cice_sbc_hadgam( kt ) 
    615697      !!--------------------------------------------------------------------- 
     
    653735   END SUBROUTINE cice_sbc_hadgam 
    654736 
    655 #else 
    656    SUBROUTINE cice_sbc_hadgam( kt )    ! Dummy routine 
    657       INTEGER, INTENT( in  ) ::   kt   ! ocean time step 
    658       WRITE(*,*) 'cice_sbc_hadgam: You should not have seen this print! error?' 
    659    END SUBROUTINE cice_sbc_hadgam 
    660 #endif 
    661737 
    662738   SUBROUTINE cice_sbc_final 
     
    713789      IF( kt == nit000 ) THEN                   !  First call kt=nit000  ! 
    714790         !                                      ! ====================== ! 
     791         ! namsbc_cice is not yet in the reference namelist 
     792         ! set file information (default values) 
     793         cn_dir = './'       ! directory in which the model is executed 
     794 
     795         ! (NB: frequency positive => hours, negative => months) 
     796         !            !    file          ! frequency !  variable    ! time intep !  clim   ! 'yearly' or ! weights  ! rotation   ! landmask 
     797         !            !    name          !  (hours)  !   name       !   (T/F)    !  (T/F)  !  'monthly'  ! filename ! pairs      ! file 
     798         sn_snow = FLD_N( 'snowfall_1m'  ,    -1.    ,  'snowfall'  ,  .true.    , .true.  ,  ' yearly'  , ''       , ''         ,  ''    )  
     799         sn_rain = FLD_N( 'rainfall_1m'  ,    -1.    ,  'rainfall'  ,  .true.    , .true.  ,  ' yearly'  , ''       , ''         ,  ''    )  
     800         sn_sblm = FLD_N( 'sublim_1m'    ,    -1.    ,  'sublim'    ,  .true.    , .true.  ,  ' yearly'  , ''       , ''         ,  ''    ) 
     801         sn_top1 = FLD_N( 'topmeltn1_1m' ,    -1.    ,  'topmeltn1' ,  .true.    , .true.  ,  ' yearly'  , ''       , ''         ,  ''    ) 
     802         sn_top2 = FLD_N( 'topmeltn2_1m' ,    -1.    ,  'topmeltn2' ,  .true.    , .true.  ,  ' yearly'  , ''       , ''         ,  ''    ) 
     803         sn_top3 = FLD_N( 'topmeltn3_1m' ,    -1.    ,  'topmeltn3' ,  .true.    , .true.  ,  ' yearly'  , ''       , ''         ,  ''    ) 
     804         sn_top4 = FLD_N( 'topmeltn4_1m' ,    -1.    ,  'topmeltn4' ,  .true.    , .true.  ,  ' yearly'  , ''       , ''         ,  ''    ) 
     805         sn_top5 = FLD_N( 'topmeltn5_1m' ,    -1.    ,  'topmeltn5' ,  .true.    , .true.  ,  ' yearly'  , ''       , ''         ,  ''    ) 
     806         sn_bot1 = FLD_N( 'botmeltn1_1m' ,    -1.    ,  'botmeltn1' ,  .true.    , .true.  ,  ' yearly'  , ''       , ''         ,  ''    ) 
     807         sn_bot2 = FLD_N( 'botmeltn2_1m' ,    -1.    ,  'botmeltn2' ,  .true.    , .true.  ,  ' yearly'  , ''       , ''         ,  ''    ) 
     808         sn_bot3 = FLD_N( 'botmeltn3_1m' ,    -1.    ,  'botmeltn3' ,  .true.    , .true.  ,  ' yearly'  , ''       , ''         ,  ''    ) 
     809         sn_bot4 = FLD_N( 'botmeltn4_1m' ,    -1.    ,  'botmeltn4' ,  .true.    , .true.  ,  ' yearly'  , ''       , ''         ,  ''    ) 
     810         sn_bot5 = FLD_N( 'botmeltn5_1m' ,    -1.    ,  'botmeltn5' ,  .true.    , .true.  ,  ' yearly'  , ''       , ''         ,  ''    ) 
     811 
    715812         REWIND( numnam_ref )              ! Namelist namsbc_cice in reference namelist :  
    716813         READ  ( numnam_ref, namsbc_cice, IOSTAT = ios, ERR = 901) 
     
    9991096   !!   Default option           Dummy module         NO CICE sea-ice model 
    10001097   !!---------------------------------------------------------------------- 
     1098   !! $Id$ 
    10011099CONTAINS 
    10021100 
    1003    SUBROUTINE sbc_ice_cice ( kt, nsbc )     ! Dummy routine 
     1101   SUBROUTINE sbc_ice_cice ( kt, ksbc )     ! Dummy routine 
    10041102      WRITE(*,*) 'sbc_ice_cice: You should not have seen this print! error?', kt 
    10051103   END SUBROUTINE sbc_ice_cice 
    10061104 
    1007    SUBROUTINE cice_sbc_init (nsbc)    ! Dummy routine 
     1105   SUBROUTINE cice_sbc_init (ksbc)    ! Dummy routine 
    10081106      WRITE(*,*) 'cice_sbc_init: You should not have seen this print! error?' 
    10091107   END SUBROUTINE cice_sbc_init 
  • branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/sbcice_if.F90

    r4624 r5837  
    1616   USE eosbn2         ! equation of state 
    1717   USE sbc_oce        ! surface boundary condition: ocean fields 
    18    USE sbccpl 
     18#if defined key_lim3 
     19   USE ice    , ONLY :   a_i  
     20#else 
     21   USE sbc_ice, ONLY :   a_i  
     22#endif 
    1923   USE fldread        ! read input field 
    2024   USE iom            ! I/O manager library 
     
    99103                                 ! ( d rho / dt ) / ( d rho / ds )      ( s = 34, t = -1.8 ) 
    100104          
    101          fr_i(:,:) = tfreez( sss_m ) * tmask(:,:,1)      ! sea surface freezing temperature [Celcius] 
     105         fr_i(:,:) = eos_fzp( sss_m ) * tmask(:,:,1)      ! sea surface freezing temperature [Celcius] 
    102106 
    103 ! OM : probleme. a_i pas defini dans les cas lim3 et cice 
    104 #if defined key_coupled && defined key_lim2 
    105          a_i(:,:,1) = fr_i(:,:)          
    106 #endif 
     107         IF( ln_cpl )   a_i(:,:,1) = fr_i(:,:)          
    107108 
    108109         ! Flux and ice fraction computation 
    109 !CDIR COLLAPSE 
    110110         DO jj = 1, jpj 
    111111            DO ji = 1, jpi 
  • branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/sbcice_lim.F90

    r4333 r5837  
    1212   !!            3.4  ! 2011-01  (A Porter)  dynamical allocation 
    1313   !!             -   ! 2012-10  (C. Rousset)  add lim_diahsb 
     14   !!            3.6  ! 2014-07  (M. Vancoppenolle, G. Madec, O. Marti) revise coupled interface 
    1415   !!---------------------------------------------------------------------- 
    1516#if defined key_lim3 
     
    1819   !!---------------------------------------------------------------------- 
    1920   !!   sbc_ice_lim  : sea-ice model time-stepping and update ocean sbc over ice-covered area 
    20    !!   lim_ctl       : alerts in case of ice model crash 
    21    !!   lim_prt_state : ice control print at a given grid point 
    2221   !!---------------------------------------------------------------------- 
    2322   USE oce             ! ocean dynamics and tracers 
    2423   USE dom_oce         ! ocean space and time domain 
    25    USE par_ice         ! sea-ice parameters 
    2624   USE ice             ! LIM-3: ice variables 
    27    USE iceini          ! LIM-3: ice initialisation 
     25   USE thd_ice         ! LIM-3: thermodynamical variables 
    2826   USE dom_ice         ! LIM-3: ice domain 
    2927 
     
    3937   USE limdyn          ! Ice dynamics 
    4038   USE limtrp          ! Ice transport 
     39   USE limhdf          ! Ice horizontal diffusion 
    4140   USE limthd          ! Ice thermodynamics 
    42    USE limitd_th       ! Thermodynamics on ice thickness distribution  
    4341   USE limitd_me       ! Mechanics on ice thickness distribution 
    4442   USE limsbc          ! sea surface boundary condition 
     
    4644   USE limwri          ! Ice outputs 
    4745   USE limrst          ! Ice restarts 
    48    USE limupdate1       ! update of global variables 
    49    USE limupdate2       ! update of global variables 
     46   USE limupdate1      ! update of global variables 
     47   USE limupdate2      ! update of global variables 
    5048   USE limvar          ! Ice variables switch 
     49 
     50   USE limmsh          ! LIM mesh 
     51   USE limistate       ! LIM initial state 
     52   USE limthd_sal      ! LIM ice thermodynamics: salinity 
    5153 
    5254   USE c1d             ! 1D vertical configuration 
     
    5961   USE prtctl          ! Print control 
    6062   USE lib_fortran     !  
     63   USE limctl 
    6164 
    6265#if defined key_bdy  
     
    6871 
    6972   PUBLIC sbc_ice_lim  ! routine called by sbcmod.F90 
     73   PUBLIC sbc_lim_init ! routine called by sbcmod.F90 
    7074    
    7175   !! * Substitutions 
     
    7983CONTAINS 
    8084 
    81    FUNCTION fice_cell_ave ( ptab) 
     85   !!====================================================================== 
     86 
     87   SUBROUTINE sbc_ice_lim( kt, kblk ) 
     88      !!--------------------------------------------------------------------- 
     89      !!                  ***  ROUTINE sbc_ice_lim  *** 
     90      !!                    
     91      !! ** Purpose :   update the ocean surface boundary condition via the  
     92      !!                Louvain la Neuve Sea Ice Model time stepping  
     93      !! 
     94      !! ** Method  :   ice model time stepping 
     95      !!              - call the ice dynamics routine  
     96      !!              - call the ice advection/diffusion routine  
     97      !!              - call the ice thermodynamics routine  
     98      !!              - call the routine that computes mass and  
     99      !!                heat fluxes at the ice/ocean interface 
     100      !!              - save the outputs  
     101      !!              - save the outputs for restart when necessary 
     102      !! 
     103      !! ** Action  : - time evolution of the LIM sea-ice model 
     104      !!              - update all sbc variables below sea-ice: 
     105      !!                utau, vtau, taum, wndm, qns , qsr, emp , sfx  
     106      !!--------------------------------------------------------------------- 
     107      INTEGER, INTENT(in) ::   kt      ! ocean time step 
     108      INTEGER, INTENT(in) ::   kblk    ! type of bulk (=3 CLIO, =4 CORE, =5 COUPLED) 
     109      !! 
     110      INTEGER  ::   jl                 ! dummy loop index 
     111      REAL(wp), POINTER, DIMENSION(:,:,:)   ::   zalb_os, zalb_cs  ! ice albedo under overcast/clear sky 
     112      REAL(wp), POINTER, DIMENSION(:,:,:)   ::   zalb_ice          ! mean ice albedo (for coupled) 
     113      REAL(wp), POINTER, DIMENSION(:,:  )   ::   zutau_ice, zvtau_ice  
     114      !!---------------------------------------------------------------------- 
     115 
     116      IF( nn_timing == 1 )  CALL timing_start('sbc_ice_lim') 
     117 
     118      !-----------------------! 
     119      ! --- Ice time step --- ! 
     120      !-----------------------! 
     121      IF( MOD( kt-1, nn_fsbc ) == 0 ) THEN 
     122 
     123         ! mean surface ocean current at ice velocity point (C-grid dynamics :  U- & V-points as the ocean) 
     124         u_oce(:,:) = ssu_m(:,:) * umask(:,:,1) 
     125         v_oce(:,:) = ssv_m(:,:) * vmask(:,:,1) 
     126          
     127         ! masked sea surface freezing temperature [Kelvin] (set to rt0 over land) 
     128         t_bo(:,:) = ( eos_fzp( sss_m ) + rt0 ) * tmask(:,:,1) + rt0 * ( 1._wp - tmask(:,:,1) )   
     129          
     130         ! Mask sea ice surface temperature (set to rt0 over land) 
     131         DO jl = 1, jpl 
     132            t_su(:,:,jl) = t_su(:,:,jl) * tmask(:,:,1) + rt0 * ( 1._wp - tmask(:,:,1) ) 
     133         END DO      
     134         ! 
     135         !------------------------------------------------!                                            
     136         ! --- Dynamical coupling with the atmosphere --- !                                            
     137         !------------------------------------------------! 
     138         ! It provides the following fields: 
     139         ! utau_ice, vtau_ice : surface ice stress (U- & V-points)   [N/m2] 
     140         !----------------------------------------------------------------- 
     141         SELECT CASE( kblk ) 
     142         CASE( jp_clio    )   ;   CALL blk_ice_clio_tau                         ! CLIO bulk formulation             
     143         CASE( jp_core    )   ;   CALL blk_ice_core_tau                         ! CORE bulk formulation 
     144         CASE( jp_purecpl )   ;   CALL sbc_cpl_ice_tau( utau_ice , vtau_ice )   ! Coupled   formulation 
     145         END SELECT 
     146          
     147         IF( ln_mixcpl) THEN   ! Case of a mixed Bulk/Coupled formulation 
     148            CALL wrk_alloc( jpi,jpj    , zutau_ice, zvtau_ice) 
     149            CALL sbc_cpl_ice_tau( zutau_ice , zvtau_ice ) 
     150            utau_ice(:,:) = utau_ice(:,:) * xcplmask(:,:,0) + zutau_ice(:,:) * ( 1. - xcplmask(:,:,0) ) 
     151            vtau_ice(:,:) = vtau_ice(:,:) * xcplmask(:,:,0) + zvtau_ice(:,:) * ( 1. - xcplmask(:,:,0) ) 
     152            CALL wrk_dealloc( jpi,jpj  , zutau_ice, zvtau_ice) 
     153         ENDIF 
     154 
     155         !-------------------------------------------------------! 
     156         ! --- ice dynamics and transport (except in 1D case) ---! 
     157         !-------------------------------------------------------! 
     158         numit = numit + nn_fsbc                  ! Ice model time step 
     159         !                                                    
     160         CALL sbc_lim_bef                         ! Store previous ice values 
     161         CALL sbc_lim_diag0                       ! set diag of mass, heat and salt fluxes to 0 
     162         CALL lim_rst_opn( kt )                   ! Open Ice restart file 
     163         ! 
     164         IF( .NOT. lk_c1d ) THEN 
     165            ! 
     166            CALL lim_dyn( kt )                    ! Ice dynamics    ( rheology/dynamics )    
     167            ! 
     168            CALL lim_trp( kt )                    ! Ice transport   ( Advection/diffusion ) 
     169            ! 
     170            IF( nn_monocat /= 2 ) CALL lim_itd_me ! Mechanical redistribution ! (ridging/rafting) 
     171            ! 
     172#if defined key_bdy 
     173            CALL bdy_ice_lim( kt )                ! bdy ice thermo  
     174            IF( ln_icectl )       CALL lim_prt( kt, iiceprt, jiceprt, 1, ' - ice thermo bdy - ' ) 
     175#endif 
     176            ! 
     177            CALL lim_update1( kt )                ! Corrections 
     178            ! 
     179         ENDIF 
     180          
     181         ! previous lead fraction and ice volume for flux calculations 
     182         CALL sbc_lim_bef                         
     183         CALL lim_var_glo2eqv                     ! ht_i and ht_s for ice albedo calculation 
     184         CALL lim_var_agg(1)                      ! at_i for coupling (via pfrld)  
     185         pfrld(:,:)   = 1._wp - at_i(:,:) 
     186         phicif(:,:)  = vt_i(:,:) 
     187          
     188         !------------------------------------------------------!                                            
     189         ! --- Thermodynamical coupling with the atmosphere --- !                                            
     190         !------------------------------------------------------! 
     191         ! It provides the following fields: 
     192         ! qsr_ice , qns_ice  : solar & non solar heat flux over ice   (T-point)         [W/m2] 
     193         ! qla_ice            : latent heat flux over ice              (T-point)         [W/m2] 
     194         ! dqns_ice, dqla_ice : non solar & latent heat sensistivity   (T-point)         [W/m2] 
     195         ! tprecip , sprecip  : total & solid precipitation            (T-point)         [Kg/m2/s] 
     196         ! fr1_i0  , fr2_i0   : 1sr & 2nd fraction of qsr penetration in ice             [%] 
     197         !---------------------------------------------------------------------------------------- 
     198         CALL wrk_alloc( jpi,jpj,jpl, zalb_os, zalb_cs, zalb_ice ) 
     199         CALL albedo_ice( t_su, ht_i, ht_s, zalb_cs, zalb_os ) ! cloud-sky and overcast-sky ice albedos 
     200 
     201         SELECT CASE( kblk ) 
     202         CASE( jp_clio )                                       ! CLIO bulk formulation 
     203            ! In CLIO the cloud fraction is read in the climatology and the all-sky albedo  
     204            ! (zalb_ice) is computed within the bulk routine 
     205            CALL blk_ice_clio_flx( t_su, zalb_cs, zalb_os, zalb_ice ) 
     206            IF( ln_mixcpl      ) CALL sbc_cpl_ice_flx( p_frld=pfrld, palbi=zalb_ice, psst=sst_m, pist=t_su ) 
     207            IF( nn_limflx /= 2 ) CALL ice_lim_flx( t_su, zalb_ice, qns_ice, qsr_ice, dqns_ice, evap_ice, devap_ice, nn_limflx ) 
     208         CASE( jp_core )                                       ! CORE bulk formulation 
     209            ! albedo depends on cloud fraction because of non-linear spectral effects 
     210            zalb_ice(:,:,:) = ( 1. - cldf_ice ) * zalb_cs(:,:,:) + cldf_ice * zalb_os(:,:,:) 
     211            CALL blk_ice_core_flx( t_su, zalb_ice ) 
     212            IF( ln_mixcpl      ) CALL sbc_cpl_ice_flx( p_frld=pfrld, palbi=zalb_ice, psst=sst_m, pist=t_su ) 
     213            IF( nn_limflx /= 2 ) CALL ice_lim_flx( t_su, zalb_ice, qns_ice, qsr_ice, dqns_ice, evap_ice, devap_ice, nn_limflx ) 
     214         CASE ( jp_purecpl ) 
     215            ! albedo depends on cloud fraction because of non-linear spectral effects 
     216            zalb_ice(:,:,:) = ( 1. - cldf_ice ) * zalb_cs(:,:,:) + cldf_ice * zalb_os(:,:,:) 
     217                                 CALL sbc_cpl_ice_flx( p_frld=pfrld, palbi=zalb_ice, psst=sst_m, pist=t_su ) 
     218            ! clem: evap_ice is forced to 0 in coupled mode for now  
     219            !       but it needs to be changed (along with modif in limthd_dh) once heat flux from evap will be avail. from atm. models 
     220            evap_ice  (:,:,:) = 0._wp   ;   devap_ice (:,:,:) = 0._wp 
     221            IF( nn_limflx == 2 ) CALL ice_lim_flx( t_su, zalb_ice, qns_ice, qsr_ice, dqns_ice, evap_ice, devap_ice, nn_limflx ) 
     222         END SELECT 
     223         CALL wrk_dealloc( jpi,jpj,jpl, zalb_os, zalb_cs, zalb_ice ) 
     224 
     225         !----------------------------! 
     226         ! --- ice thermodynamics --- ! 
     227         !----------------------------! 
     228         CALL lim_thd( kt )                         ! Ice thermodynamics       
     229         ! 
     230         CALL lim_update2( kt )                     ! Corrections 
     231         ! 
     232         CALL lim_sbc_flx( kt )                     ! Update surface ocean mass, heat and salt fluxes 
     233         ! 
     234         IF(ln_limdiaout) CALL lim_diahsb           ! Diagnostics and outputs  
     235         ! 
     236         CALL lim_wri( 1 )                          ! Ice outputs  
     237         ! 
     238         IF( kt == nit000 .AND. ln_rstart )   & 
     239            &             CALL iom_close( numrir )  ! close input ice restart file 
     240         ! 
     241         IF( lrst_ice )   CALL lim_rst_write( kt )  ! Ice restart file  
     242         ! 
     243         IF( ln_icectl )  CALL lim_ctl( kt )        ! alerts in case of model crash 
     244         ! 
     245      ENDIF   ! End sea-ice time step only 
     246 
     247      !-------------------------! 
     248      ! --- Ocean time step --- ! 
     249      !-------------------------! 
     250      ! Update surface ocean stresses (only in ice-dynamic case) otherwise the atm.-ocean stresses are used everywhere 
     251      IF( ln_limdyn )     CALL lim_sbc_tau( kt, ub(:,:,1), vb(:,:,1) )  ! using before instantaneous surf. currents 
     252!!gm   remark, the ocean-ice stress is not saved in ice diag call above .....  find a solution!!! 
     253      ! 
     254      IF( nn_timing == 1 ) CALL timing_stop('sbc_ice_lim') 
     255      ! 
     256   END SUBROUTINE sbc_ice_lim 
     257    
     258 
     259   SUBROUTINE sbc_lim_init 
     260      !!---------------------------------------------------------------------- 
     261      !!                  ***  ROUTINE sbc_lim_init  *** 
     262      !! 
     263      !! ** purpose :   Allocate all the dynamic arrays of the LIM-3 modules 
     264      !!---------------------------------------------------------------------- 
     265      INTEGER :: ierr 
     266      !!---------------------------------------------------------------------- 
     267      IF(lwp) WRITE(numout,*) 
     268      IF(lwp) WRITE(numout,*) 'sbc_ice_lim : update ocean surface boudary condition'  
     269      IF(lwp) WRITE(numout,*) '~~~~~~~~~~~   via Louvain la Neuve Ice Model (LIM-3) time stepping' 
     270      ! 
     271                                       ! Open the reference and configuration namelist files and namelist output file  
     272      CALL ctl_opn( numnam_ice_ref, 'namelist_ice_ref',    'OLD',     'FORMATTED', 'SEQUENTIAL', -1, numout, lwp )  
     273      CALL ctl_opn( numnam_ice_cfg, 'namelist_ice_cfg',    'OLD',     'FORMATTED', 'SEQUENTIAL', -1, numout, lwp ) 
     274      IF(lwm) CALL ctl_opn( numoni, 'output.namelist.ice', 'UNKNOWN', 'FORMATTED', 'SEQUENTIAL', -1, numout, lwp, 1 ) 
     275 
     276      CALL ice_run                     ! set some ice run parameters 
     277      ! 
     278      !                                ! Allocate the ice arrays 
     279      ierr =        ice_alloc        ()      ! ice variables 
     280      ierr = ierr + dom_ice_alloc    ()      ! domain 
     281      ierr = ierr + sbc_ice_alloc    ()      ! surface forcing 
     282      ierr = ierr + thd_ice_alloc    ()      ! thermodynamics 
     283      ierr = ierr + lim_itd_me_alloc ()      ! ice thickness distribution - mechanics 
     284      ! 
     285      IF( lk_mpp    )   CALL mpp_sum( ierr ) 
     286      IF( ierr /= 0 )   CALL ctl_stop('STOP', 'sbc_lim_init : unable to allocate ice arrays') 
     287      ! 
     288      !                                ! adequation jpk versus ice/snow layers/categories 
     289      IF( jpl > jpk .OR. (nlay_i+1) > jpk .OR. nlay_s > jpk )   & 
     290         &      CALL ctl_stop( 'STOP',                          & 
     291         &     'sbc_lim_init: the 3rd dimension of workspace arrays is too small.',   & 
     292         &     'use more ocean levels or less ice/snow layers/categories.' ) 
     293      ! 
     294      CALL lim_itd_init                ! ice thickness distribution initialization 
     295      ! 
     296      CALL lim_hdf_init                ! set ice horizontal diffusion computation parameters 
     297      ! 
     298      CALL lim_thd_init                ! set ice thermodynics parameters 
     299      ! 
     300      CALL lim_thd_sal_init            ! set ice salinity parameters 
     301      ! 
     302      CALL lim_msh                     ! ice mesh initialization 
     303      ! 
     304      CALL lim_itd_me_init             ! ice thickness distribution initialization for mecanical deformation 
     305      !                                ! Initial sea-ice state 
     306      IF( .NOT. ln_rstart ) THEN              ! start from rest: sea-ice deduced from sst 
     307         numit = 0 
     308         numit = nit000 - 1 
     309         CALL lim_istate 
     310      ELSE                                    ! start from a restart file 
     311         CALL lim_rst_read 
     312         numit = nit000 - 1 
     313      ENDIF 
     314      CALL lim_var_agg(1) 
     315      CALL lim_var_glo2eqv 
     316      ! 
     317      CALL lim_sbc_init                 ! ice surface boundary condition    
     318      ! 
     319      fr_i(:,:)     = at_i(:,:)         ! initialisation of sea-ice fraction 
     320      tn_ice(:,:,:) = t_su(:,:,:)       ! initialisation of surface temp for coupled simu 
     321      ! 
     322      nstart = numit  + nn_fsbc       
     323      nitrun = nitend - nit000 + 1  
     324      nlast  = numit  + nitrun  
     325      ! 
     326      IF( nstock == 0 )   nstock = nlast + 1 
     327      ! 
     328   END SUBROUTINE sbc_lim_init 
     329 
     330 
     331   SUBROUTINE ice_run 
     332      !!------------------------------------------------------------------- 
     333      !!                  ***  ROUTINE ice_run *** 
     334      !!                  
     335      !! ** Purpose :   Definition some run parameter for ice model 
     336      !! 
     337      !! ** Method  :   Read the namicerun namelist and check the parameter  
     338      !!              values called at the first timestep (nit000) 
     339      !! 
     340      !! ** input   :   Namelist namicerun 
     341      !!------------------------------------------------------------------- 
     342      INTEGER  ::   ios                 ! Local integer output status for namelist read 
     343      NAMELIST/namicerun/ jpl, nlay_i, nlay_s, cn_icerst_in, cn_icerst_indir, cn_icerst_out, cn_icerst_outdir,  & 
     344         &                ln_limdyn, rn_amax, ln_limdiahsb, ln_limdiaout, ln_icectl, iiceprt, jiceprt   
     345      !!------------------------------------------------------------------- 
     346      !                     
     347      REWIND( numnam_ice_ref )              ! Namelist namicerun in reference namelist : Parameters for ice 
     348      READ  ( numnam_ice_ref, namicerun, IOSTAT = ios, ERR = 901) 
     349901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namicerun in reference namelist', lwp ) 
     350 
     351      REWIND( numnam_ice_cfg )              ! Namelist namicerun in configuration namelist : Parameters for ice 
     352      READ  ( numnam_ice_cfg, namicerun, IOSTAT = ios, ERR = 902 ) 
     353902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namicerun in configuration namelist', lwp ) 
     354      IF(lwm) WRITE ( numoni, namicerun ) 
     355      ! 
     356      ! 
     357      IF(lwp) THEN                        ! control print 
     358         WRITE(numout,*) 
     359         WRITE(numout,*) 'ice_run : ice share parameters for dynamics/advection/thermo of sea-ice' 
     360         WRITE(numout,*) ' ~~~~~~' 
     361         WRITE(numout,*) '   number of ice  categories                               = ', jpl 
     362         WRITE(numout,*) '   number of ice  layers                                   = ', nlay_i 
     363         WRITE(numout,*) '   number of snow layers                                   = ', nlay_s 
     364         WRITE(numout,*) '   switch for ice dynamics (1) or not (0)      ln_limdyn   = ', ln_limdyn 
     365         WRITE(numout,*) '   maximum ice concentration                               = ', rn_amax  
     366         WRITE(numout,*) '   Diagnose heat/salt budget or not          ln_limdiahsb  = ', ln_limdiahsb 
     367         WRITE(numout,*) '   Output   heat/salt budget or not          ln_limdiaout  = ', ln_limdiaout 
     368         WRITE(numout,*) '   control prints in ocean.out for (i,j)=(iiceprt,jiceprt) = ', ln_icectl 
     369         WRITE(numout,*) '   i-index for control prints (ln_icectl=true)             = ', iiceprt 
     370         WRITE(numout,*) '   j-index for control prints (ln_icectl=true)             = ', jiceprt 
     371      ENDIF 
     372      ! 
     373      ! sea-ice timestep and inverse 
     374      rdt_ice   = nn_fsbc * rdttra(1)   
     375      r1_rdtice = 1._wp / rdt_ice  
     376 
     377      ! inverse of nlay_i and nlay_s 
     378      r1_nlay_i = 1._wp / REAL( nlay_i, wp ) 
     379      r1_nlay_s = 1._wp / REAL( nlay_s, wp ) 
     380      ! 
     381#if defined key_bdy 
     382      IF( lwp .AND. ln_limdiahsb )  CALL ctl_warn('online conservation check activated but it does not work with BDY') 
     383#endif 
     384      ! 
     385   END SUBROUTINE ice_run 
     386 
     387 
     388   SUBROUTINE lim_itd_init 
     389      !!------------------------------------------------------------------ 
     390      !!                ***  ROUTINE lim_itd_init *** 
     391      !! 
     392      !! ** Purpose :   Initializes the ice thickness distribution 
     393      !! ** Method  :   ... 
     394      !! ** input   :   Namelist namiceitd 
     395      !!------------------------------------------------------------------- 
     396      INTEGER  ::   ios                 ! Local integer output status for namelist read 
     397      NAMELIST/namiceitd/ nn_catbnd, rn_himean 
     398      ! 
     399      INTEGER  ::   jl                   ! dummy loop index 
     400      REAL(wp) ::   zc1, zc2, zc3, zx1   ! local scalars 
     401      REAL(wp) ::   zhmax, znum, zden, zalpha ! 
     402      !!------------------------------------------------------------------ 
     403      ! 
     404      REWIND( numnam_ice_ref )              ! Namelist namiceitd in reference namelist : Parameters for ice 
     405      READ  ( numnam_ice_ref, namiceitd, IOSTAT = ios, ERR = 903) 
     406903   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namiceitd in reference namelist', lwp ) 
     407 
     408      REWIND( numnam_ice_cfg )              ! Namelist namiceitd in configuration namelist : Parameters for ice 
     409      READ  ( numnam_ice_cfg, namiceitd, IOSTAT = ios, ERR = 904 ) 
     410904   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namiceitd in configuration namelist', lwp ) 
     411      IF(lwm) WRITE ( numoni, namiceitd ) 
     412      ! 
     413      ! 
     414      IF(lwp) THEN                        ! control print 
     415         WRITE(numout,*) 
     416         WRITE(numout,*) 'ice_itd : ice cat distribution' 
     417         WRITE(numout,*) ' ~~~~~~' 
     418         WRITE(numout,*) '   shape of ice categories distribution                          nn_catbnd = ', nn_catbnd 
     419         WRITE(numout,*) '   mean ice thickness in the domain (only active if nn_catbnd=2) rn_himean = ', rn_himean 
     420      ENDIF 
     421 
     422      !---------------------------------- 
     423      !- Thickness categories boundaries  
     424      !---------------------------------- 
     425      IF(lwp) WRITE(numout,*) 
     426      IF(lwp) WRITE(numout,*) 'lim_itd_init : Initialization of ice cat distribution ' 
     427      IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~' 
     428 
     429      hi_max(:) = 0._wp 
     430 
     431      SELECT CASE ( nn_catbnd  )        
     432                                   !---------------------- 
     433         CASE (1)                  ! tanh function (CICE) 
     434                                   !---------------------- 
     435         zc1 =  3._wp / REAL( jpl, wp ) 
     436         zc2 = 10._wp * zc1 
     437         zc3 =  3._wp 
     438 
     439         DO jl = 1, jpl 
     440            zx1 = REAL( jl-1, wp ) / REAL( jpl, wp ) 
     441            hi_max(jl) = hi_max(jl-1) + zc1 + zc2 * (1._wp + TANH( zc3 * (zx1 - 1._wp ) ) ) 
     442         END DO 
     443 
     444                                   !---------------------- 
     445         CASE (2)                  ! h^(-alpha) function 
     446                                   !---------------------- 
     447         zalpha = 0.05             ! exponent of the transform function 
     448 
     449         zhmax  = 3.*rn_himean 
     450 
     451         DO jl = 1, jpl  
     452            znum = jpl * ( zhmax+1 )**zalpha 
     453            zden = ( jpl - jl ) * ( zhmax+1 )**zalpha + jl 
     454            hi_max(jl) = ( znum / zden )**(1./zalpha) - 1 
     455         END DO 
     456 
     457      END SELECT 
     458 
     459      DO jl = 1, jpl 
     460         hi_mean(jl) = ( hi_max(jl) + hi_max(jl-1) ) * 0.5_wp 
     461      END DO 
     462 
     463      ! Set hi_max(jpl) to a big value to ensure that all ice is thinner than hi_max(jpl) 
     464      hi_max(jpl) = 99._wp 
     465 
     466      IF(lwp) WRITE(numout,*) ' Thickness category boundaries ' 
     467      IF(lwp) WRITE(numout,*) ' hi_max ', hi_max(0:jpl) 
     468      ! 
     469   END SUBROUTINE lim_itd_init 
     470 
     471    
     472   SUBROUTINE ice_lim_flx( ptn_ice, palb_ice, pqns_ice, pqsr_ice, pdqn_ice, pevap_ice, pdevap_ice, k_limflx ) 
     473      !!--------------------------------------------------------------------- 
     474      !!                  ***  ROUTINE ice_lim_flx  *** 
     475      !!                    
     476      !! ** Purpose :   update the ice surface boundary condition by averaging and / or 
     477      !!                redistributing fluxes on ice categories                    
     478      !! 
     479      !! ** Method  :   average then redistribute  
     480      !! 
     481      !! ** Action  :    
     482      !!--------------------------------------------------------------------- 
     483      INTEGER                   , INTENT(in   ) ::   k_limflx   ! =-1 do nothing; =0 average ;  
     484                                                                ! =1 average and redistribute ; =2 redistribute 
     485      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   ptn_ice    ! ice surface temperature  
     486      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   palb_ice   ! ice albedo 
     487      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   pqns_ice   ! non solar flux 
     488      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   pqsr_ice   ! net solar flux 
     489      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   pdqn_ice   ! non solar flux sensitivity 
     490      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   pevap_ice  ! sublimation 
     491      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   pdevap_ice ! sublimation sensitivity 
     492      ! 
     493      INTEGER  ::   jl      ! dummy loop index 
     494      ! 
     495      REAL(wp), POINTER, DIMENSION(:,:) :: zalb_m    ! Mean albedo over all categories 
     496      REAL(wp), POINTER, DIMENSION(:,:) :: ztem_m    ! Mean temperature over all categories 
     497      ! 
     498      REAL(wp), POINTER, DIMENSION(:,:) :: z_qsr_m   ! Mean solar heat flux over all categories 
     499      REAL(wp), POINTER, DIMENSION(:,:) :: z_qns_m   ! Mean non solar heat flux over all categories 
     500      REAL(wp), POINTER, DIMENSION(:,:) :: z_evap_m  ! Mean sublimation over all categories 
     501      REAL(wp), POINTER, DIMENSION(:,:) :: z_dqn_m   ! Mean d(qns)/dT over all categories 
     502      REAL(wp), POINTER, DIMENSION(:,:) :: z_devap_m ! Mean d(evap)/dT over all categories 
     503      !!---------------------------------------------------------------------- 
     504 
     505      IF( nn_timing == 1 )  CALL timing_start('ice_lim_flx') 
     506      ! 
     507      ! 
     508      SELECT CASE( k_limflx )                              !==  averaged on all ice categories  ==! 
     509      CASE( 0 , 1 ) 
     510         CALL wrk_alloc( jpi,jpj, z_qsr_m, z_qns_m, z_evap_m, z_dqn_m, z_devap_m) 
     511         ! 
     512         z_qns_m  (:,:) = fice_ice_ave ( pqns_ice (:,:,:) ) 
     513         z_qsr_m  (:,:) = fice_ice_ave ( pqsr_ice (:,:,:) ) 
     514         z_dqn_m  (:,:) = fice_ice_ave ( pdqn_ice (:,:,:) ) 
     515         z_evap_m (:,:) = fice_ice_ave ( pevap_ice (:,:,:) ) 
     516         z_devap_m(:,:) = fice_ice_ave ( pdevap_ice (:,:,:) ) 
     517         DO jl = 1, jpl 
     518            pdqn_ice  (:,:,jl) = z_dqn_m(:,:) 
     519            pdevap_ice(:,:,jl) = z_devap_m(:,:) 
     520         END DO 
     521         ! 
     522         DO jl = 1, jpl 
     523            pqns_ice (:,:,jl) = z_qns_m(:,:) 
     524            pqsr_ice (:,:,jl) = z_qsr_m(:,:) 
     525            pevap_ice(:,:,jl) = z_evap_m(:,:) 
     526         END DO 
     527         ! 
     528         CALL wrk_dealloc( jpi,jpj, z_qsr_m, z_qns_m, z_evap_m, z_dqn_m, z_devap_m) 
     529      END SELECT 
     530 
     531      SELECT CASE( k_limflx )                              !==  redistribution on all ice categories  ==! 
     532      CASE( 1 , 2 ) 
     533         CALL wrk_alloc( jpi,jpj, zalb_m, ztem_m ) 
     534         ! 
     535         zalb_m(:,:) = fice_ice_ave ( palb_ice (:,:,:) )  
     536         ztem_m(:,:) = fice_ice_ave ( ptn_ice  (:,:,:) )  
     537         DO jl = 1, jpl 
     538            pqns_ice (:,:,jl) = pqns_ice (:,:,jl) + pdqn_ice  (:,:,jl) * ( ptn_ice(:,:,jl) - ztem_m(:,:) ) 
     539            pevap_ice(:,:,jl) = pevap_ice(:,:,jl) + pdevap_ice(:,:,jl) * ( ptn_ice(:,:,jl) - ztem_m(:,:) ) 
     540            pqsr_ice (:,:,jl) = pqsr_ice (:,:,jl) * ( 1._wp - palb_ice(:,:,jl) ) / ( 1._wp - zalb_m(:,:) )  
     541         END DO 
     542         ! 
     543         CALL wrk_dealloc( jpi,jpj, zalb_m, ztem_m ) 
     544      END SELECT 
     545      ! 
     546      IF( nn_timing == 1 )  CALL timing_stop('ice_lim_flx') 
     547      ! 
     548   END SUBROUTINE ice_lim_flx 
     549 
     550   SUBROUTINE sbc_lim_bef 
     551      !!---------------------------------------------------------------------- 
     552      !!                  ***  ROUTINE sbc_lim_bef  *** 
     553      !! 
     554      !! ** purpose :  store ice variables at "before" time step  
     555      !!---------------------------------------------------------------------- 
     556      a_i_b  (:,:,:)   = a_i  (:,:,:)     ! ice area 
     557      e_i_b  (:,:,:,:) = e_i  (:,:,:,:)   ! ice thermal energy 
     558      v_i_b  (:,:,:)   = v_i  (:,:,:)     ! ice volume 
     559      v_s_b  (:,:,:)   = v_s  (:,:,:)     ! snow volume  
     560      e_s_b  (:,:,:,:) = e_s  (:,:,:,:)   ! snow thermal energy 
     561      smv_i_b(:,:,:)   = smv_i(:,:,:)     ! salt content 
     562      oa_i_b (:,:,:)   = oa_i (:,:,:)     ! areal age content 
     563      u_ice_b(:,:)     = u_ice(:,:) 
     564      v_ice_b(:,:)     = v_ice(:,:) 
     565       
     566   END SUBROUTINE sbc_lim_bef 
     567 
     568   SUBROUTINE sbc_lim_diag0 
     569      !!---------------------------------------------------------------------- 
     570      !!                  ***  ROUTINE sbc_lim_diag0  *** 
     571      !! 
     572      !! ** purpose :  set ice-ocean and ice-atm. fluxes to zeros at the beggining 
     573      !!               of the time step 
     574      !!---------------------------------------------------------------------- 
     575      sfx    (:,:) = 0._wp   ; 
     576      sfx_bri(:,:) = 0._wp   ;  
     577      sfx_sni(:,:) = 0._wp   ;   sfx_opw(:,:) = 0._wp 
     578      sfx_bog(:,:) = 0._wp   ;   sfx_dyn(:,:) = 0._wp 
     579      sfx_bom(:,:) = 0._wp   ;   sfx_sum(:,:) = 0._wp 
     580      sfx_res(:,:) = 0._wp 
     581       
     582      wfx_snw(:,:) = 0._wp   ;   wfx_ice(:,:) = 0._wp 
     583      wfx_sni(:,:) = 0._wp   ;   wfx_opw(:,:) = 0._wp 
     584      wfx_bog(:,:) = 0._wp   ;   wfx_dyn(:,:) = 0._wp 
     585      wfx_bom(:,:) = 0._wp   ;   wfx_sum(:,:) = 0._wp 
     586      wfx_res(:,:) = 0._wp   ;   wfx_sub(:,:) = 0._wp 
     587      wfx_spr(:,:) = 0._wp   ;    
     588       
     589      hfx_thd(:,:) = 0._wp   ;    
     590      hfx_snw(:,:) = 0._wp   ;   hfx_opw(:,:) = 0._wp 
     591      hfx_bog(:,:) = 0._wp   ;   hfx_dyn(:,:) = 0._wp 
     592      hfx_bom(:,:) = 0._wp   ;   hfx_sum(:,:) = 0._wp 
     593      hfx_res(:,:) = 0._wp   ;   hfx_sub(:,:) = 0._wp 
     594      hfx_spr(:,:) = 0._wp   ;   hfx_dif(:,:) = 0._wp  
     595      hfx_err(:,:) = 0._wp   ;   hfx_err_rem(:,:) = 0._wp 
     596      hfx_err_dif(:,:) = 0._wp   ; 
     597 
     598      afx_tot(:,:) = 0._wp   ; 
     599      afx_dyn(:,:) = 0._wp   ;   afx_thd(:,:) = 0._wp 
     600 
     601      diag_heat(:,:) = 0._wp ;   diag_smvi(:,:) = 0._wp ; 
     602      diag_vice(:,:) = 0._wp ;   diag_vsnw(:,:) = 0._wp ; 
     603       
     604   END SUBROUTINE sbc_lim_diag0 
     605 
     606      
     607   FUNCTION fice_cell_ave ( ptab ) 
    82608      !!-------------------------------------------------------------------------- 
    83609      !! * Compute average over categories, for grid cell (ice covered and free ocean) 
     
    88614       
    89615      fice_cell_ave (:,:) = 0.0_wp 
    90        
    91616      DO jl = 1, jpl 
    92          fice_cell_ave (:,:) = fice_cell_ave (:,:) & 
    93             &                  + a_i (:,:,jl) * ptab (:,:,jl) 
     617         fice_cell_ave (:,:) = fice_cell_ave (:,:) + a_i (:,:,jl) * ptab (:,:,jl) 
    94618      END DO 
    95619       
    96620   END FUNCTION fice_cell_ave 
    97621    
    98    FUNCTION fice_ice_ave ( ptab) 
     622    
     623   FUNCTION fice_ice_ave ( ptab ) 
    99624      !!-------------------------------------------------------------------------- 
    100625      !! * Compute average over categories, for ice covered part of grid cell 
     
    104629 
    105630      fice_ice_ave (:,:) = 0.0_wp 
    106       WHERE ( at_i (:,:) .GT. 0.0_wp ) fice_ice_ave (:,:) = fice_cell_ave ( ptab (:,:,:)) / at_i (:,:) 
     631      WHERE ( at_i (:,:) > 0.0_wp ) fice_ice_ave (:,:) = fice_cell_ave ( ptab (:,:,:)) / at_i (:,:) 
    107632 
    108633   END FUNCTION fice_ice_ave 
    109634 
    110    !!====================================================================== 
    111  
    112    SUBROUTINE sbc_ice_lim( kt, kblk ) 
    113       !!--------------------------------------------------------------------- 
    114       !!                  ***  ROUTINE sbc_ice_lim  *** 
    115       !!                    
    116       !! ** Purpose :   update the ocean surface boundary condition via the  
    117       !!                Louvain la Neuve Sea Ice Model time stepping  
    118       !! 
    119       !! ** Method  :   ice model time stepping 
    120       !!              - call the ice dynamics routine  
    121       !!              - call the ice advection/diffusion routine  
    122       !!              - call the ice thermodynamics routine  
    123       !!              - call the routine that computes mass and  
    124       !!                heat fluxes at the ice/ocean interface 
    125       !!              - save the outputs  
    126       !!              - save the outputs for restart when necessary 
    127       !! 
    128       !! ** Action  : - time evolution of the LIM sea-ice model 
    129       !!              - update all sbc variables below sea-ice: 
    130       !!                utau, vtau, taum, wndm, qns , qsr, emp , sfx  
    131       !!--------------------------------------------------------------------- 
    132       INTEGER, INTENT(in) ::   kt      ! ocean time step 
    133       INTEGER, INTENT(in) ::   kblk    ! type of bulk (=3 CLIO, =4 CORE) 
    134       !! 
    135       INTEGER  ::   jl      ! dummy loop index 
    136       REAL(wp) ::   zcoef   ! local scalar 
    137       REAL(wp), POINTER, DIMENSION(:,:,:)   ::   zalb_ice_os, zalb_ice_cs  ! albedo of the ice under overcast/clear sky 
    138       REAL(wp), POINTER, DIMENSION(:,:,:)   ::   zalb_ice      ! mean albedo of ice (for coupled) 
    139  
    140       REAL(wp), POINTER, DIMENSION(:,:) :: zalb_ice_all    ! Mean albedo over all categories 
    141       REAL(wp), POINTER, DIMENSION(:,:) :: ztem_ice_all    ! Mean temperature over all categories 
    142        
    143       REAL(wp), POINTER, DIMENSION(:,:) :: z_qsr_ice_all   ! Mean solar heat flux over all categories 
    144       REAL(wp), POINTER, DIMENSION(:,:) :: z_qns_ice_all   ! Mean non solar heat flux over all categories 
    145       REAL(wp), POINTER, DIMENSION(:,:) :: z_qla_ice_all   ! Mean latent heat flux over all categories 
    146       REAL(wp), POINTER, DIMENSION(:,:) :: z_dqns_ice_all  ! Mean d(qns)/dT over all categories 
    147       REAL(wp), POINTER, DIMENSION(:,:) :: z_dqla_ice_all  ! Mean d(qla)/dT over all categories 
    148       !!---------------------------------------------------------------------- 
    149  
    150       !- O.M. : why do we allocate all these arrays even when MOD( kt-1, nn_fsbc ) /= 0 ????? 
    151  
    152       IF( nn_timing == 1 )  CALL timing_start('sbc_ice_lim') 
    153  
    154       CALL wrk_alloc( jpi,jpj,jpl, zalb_ice_os, zalb_ice_cs ) 
    155  
    156 #if defined key_coupled 
    157       IF ( ln_cpl .OR. ln_iceflx_ave .OR. ln_iceflx_linear ) CALL wrk_alloc( jpi,jpj,jpl, zalb_ice) 
    158       IF ( ln_iceflx_ave .OR. ln_iceflx_linear ) & 
    159          &   CALL wrk_alloc( jpi,jpj, ztem_ice_all, zalb_ice_all, z_qsr_ice_all, z_qns_ice_all, z_qla_ice_all, z_dqns_ice_all, z_dqla_ice_all) 
    160 #endif 
    161  
    162       IF( kt == nit000 ) THEN 
    163          IF(lwp) WRITE(numout,*) 
    164          IF(lwp) WRITE(numout,*) 'sbc_ice_lim : update ocean surface boudary condition'  
    165          IF(lwp) WRITE(numout,*) '~~~~~~~~~~~   via Louvain la Neuve Ice Model (LIM-3) time stepping' 
    166          ! 
    167          CALL ice_init 
    168          ! 
    169          IF( ln_nicep ) THEN      ! control print at a given point 
    170             jiindx = 177   ;   jjindx = 112 
    171             IF(lwp) WRITE(numout,*) ' The debugging point is : jiindx : ',jiindx, ' jjindx : ',jjindx 
    172          ENDIF 
    173       ENDIF 
    174  
    175       !                                        !----------------------! 
    176       IF( MOD( kt-1, nn_fsbc ) == 0 ) THEN     !  Ice time-step only  ! 
    177          !                                     !----------------------! 
    178          !                                           !  Bulk Formulea ! 
    179          !                                           !----------------! 
    180          ! 
    181          u_oce(:,:) = ssu_m(:,:)                     ! mean surface ocean current at ice velocity point 
    182          v_oce(:,:) = ssv_m(:,:)                     ! (C-grid dynamics :  U- & V-points as the ocean) 
    183          ! 
    184          t_bo(:,:) = tfreez( sss_m ) +  rt0          ! masked sea surface freezing temperature [Kelvin] 
    185          !                                           ! (set to rt0 over land) 
    186          CALL albedo_ice( t_su, ht_i, ht_s, zalb_ice_cs, zalb_ice_os )  ! ... ice albedo 
    187  
    188          DO jl = 1, jpl 
    189             t_su(:,:,jl) = t_su(:,:,jl) +  rt0 * ( 1. - tmask(:,:,1) ) 
    190          END DO 
    191  
    192          IF ( ln_cpl ) zalb_ice (:,:,:) = 0.5 * ( zalb_ice_cs (:,:,:) +  zalb_ice_os (:,:,:) ) 
    193           
    194 #if defined key_coupled 
    195          IF ( ln_iceflx_ave .OR. ln_iceflx_linear ) THEN 
    196             ! 
    197             ! Compute mean albedo and temperature 
    198             zalb_ice_all (:,:) = fice_ice_ave ( zalb_ice (:,:,:) )  
    199             ztem_ice_all (:,:) = fice_ice_ave ( tn_ice   (:,:,:) )  
    200             ! 
    201          ENDIF 
    202 #endif 
    203                                                ! Bulk formulea - provides the following fields: 
    204          ! utau_ice, vtau_ice : surface ice stress                     (U- & V-points)   [N/m2] 
    205          ! qsr_ice , qns_ice  : solar & non solar heat flux over ice   (T-point)         [W/m2] 
    206          ! qla_ice            : latent heat flux over ice              (T-point)         [W/m2] 
    207          ! dqns_ice, dqla_ice : non solar & latent heat sensistivity   (T-point)         [W/m2] 
    208          ! tprecip , sprecip  : total & solid precipitation            (T-point)         [Kg/m2/s] 
    209          ! fr1_i0  , fr2_i0   : 1sr & 2nd fraction of qsr penetration in ice             [%] 
    210          ! 
    211          SELECT CASE( kblk ) 
    212          CASE( 3 )                                       ! CLIO bulk formulation 
    213             CALL blk_ice_clio( t_su , zalb_ice_cs, zalb_ice_os,                           & 
    214                &                      utau_ice   , vtau_ice   , qns_ice   , qsr_ice   ,   & 
    215                &                      qla_ice    , dqns_ice   , dqla_ice  ,               & 
    216                &                      tprecip    , sprecip    ,                           & 
    217                &                      fr1_i0     , fr2_i0     , cp_ice_msh, jpl  ) 
    218             !          
    219          CASE( 4 )                                       ! CORE bulk formulation 
    220             CALL blk_ice_core( t_su , u_ice     , v_ice     , zalb_ice_cs,               & 
    221                &                      utau_ice  , vtau_ice  , qns_ice    , qsr_ice   ,   & 
    222                &                      qla_ice   , dqns_ice  , dqla_ice   ,               & 
    223                &                      tprecip   , sprecip   ,                            & 
    224                &                      fr1_i0    , fr2_i0    , cp_ice_msh, jpl  ) 
    225             ! 
    226          CASE ( 5 ) 
    227             zalb_ice (:,:,:) = 0.5 * ( zalb_ice_cs (:,:,:) +  zalb_ice_os (:,:,:) ) 
    228              
    229             CALL sbc_cpl_ice_tau( utau_ice , vtau_ice ) 
    230  
    231             CALL sbc_cpl_ice_flx( p_frld=ato_i, palbi=zalb_ice, psst=sst_m, pist=tn_ice    ) 
    232  
    233             ! Latent heat flux is forced to 0 in coupled : 
    234             !  it is included in qns (non-solar heat flux) 
    235             qla_ice  (:,:,:) = 0.0e0_wp 
    236             dqla_ice (:,:,:) = 0.0e0_wp 
    237             ! 
    238          END SELECT 
    239  
    240          ! Average over all categories 
    241 #if defined key_coupled 
    242          IF ( ln_iceflx_ave .OR. ln_iceflx_linear ) THEN 
    243  
    244             z_qns_ice_all  (:,:) = fice_ice_ave ( qns_ice  (:,:,:) ) 
    245             z_qsr_ice_all  (:,:) = fice_ice_ave ( qsr_ice  (:,:,:) ) 
    246             z_dqns_ice_all (:,:) = fice_ice_ave ( dqns_ice (:,:,:) ) 
    247             z_qla_ice_all  (:,:) = fice_ice_ave ( qla_ice  (:,:,:) ) 
    248             z_dqla_ice_all (:,:) = fice_ice_ave ( dqla_ice (:,:,:) ) 
    249  
    250             DO jl = 1, jpl 
    251                dqns_ice (:,:,jl) = z_dqns_ice_all (:,:) 
    252                dqla_ice (:,:,jl) = z_dqla_ice_all (:,:) 
    253             END DO 
    254             ! 
    255             IF ( ln_iceflx_ave ) THEN 
    256                DO jl = 1, jpl 
    257                   qns_ice  (:,:,jl) = z_qns_ice_all  (:,:) 
    258                   qsr_ice  (:,:,jl) = z_qsr_ice_all  (:,:) 
    259                   qla_ice  (:,:,jl) = z_qla_ice_all  (:,:) 
    260                END DO 
    261             END IF 
    262             ! 
    263             IF ( ln_iceflx_linear ) THEN 
    264                DO jl = 1, jpl 
    265                   qns_ice  (:,:,jl) = z_qns_ice_all(:,:) + z_dqns_ice_all(:,:) * (tn_ice(:,:,jl) - ztem_ice_all(:,:)) 
    266                   qla_ice  (:,:,jl) = z_qla_ice_all(:,:) + z_dqla_ice_all(:,:) * (tn_ice(:,:,jl) - ztem_ice_all(:,:)) 
    267                   qsr_ice  (:,:,jl) = (1.0e0_wp-zalb_ice(:,:,jl)) / (1.0e0_wp-zalb_ice_all(:,:)) * z_qsr_ice_all(:,:) 
    268                END DO 
    269             END IF 
    270          END IF 
    271 #endif 
    272          !                                           !----------------------! 
    273          !                                           ! LIM-3  time-stepping ! 
    274          !                                           !----------------------! 
    275          !  
    276          numit = numit + nn_fsbc                     ! Ice model time step 
    277          ! 
    278          !                                           ! Store previous ice values 
    279 !!gm : remark   old_...   should becomes ...b  as tn versus tb   
    280          old_a_i  (:,:,:)   = a_i  (:,:,:)     ! ice area 
    281          old_e_i  (:,:,:,:) = e_i  (:,:,:,:)   ! ice thermal energy 
    282          old_v_i  (:,:,:)   = v_i  (:,:,:)     ! ice volume 
    283          old_v_s  (:,:,:)   = v_s  (:,:,:)     ! snow volume  
    284          old_e_s  (:,:,:,:) = e_s  (:,:,:,:)   ! snow thermal energy 
    285          old_smv_i(:,:,:)   = smv_i(:,:,:)     ! salt content 
    286          old_oa_i (:,:,:)   = oa_i (:,:,:)     ! areal age content 
    287          ! 
    288          old_u_ice(:,:) = u_ice(:,:) 
    289          old_v_ice(:,:) = v_ice(:,:) 
    290          !                                           ! intialisation to zero    !!gm is it truly necessary ??? 
    291          d_a_i_thd  (:,:,:)   = 0._wp   ;   d_a_i_trp  (:,:,:)   = 0._wp 
    292          d_v_i_thd  (:,:,:)   = 0._wp   ;   d_v_i_trp  (:,:,:)   = 0._wp 
    293          d_e_i_thd  (:,:,:,:) = 0._wp   ;   d_e_i_trp  (:,:,:,:) = 0._wp 
    294          d_v_s_thd  (:,:,:)   = 0._wp   ;   d_v_s_trp  (:,:,:)   = 0._wp 
    295          d_e_s_thd  (:,:,:,:) = 0._wp   ;   d_e_s_trp  (:,:,:,:) = 0._wp 
    296          d_smv_i_thd(:,:,:)   = 0._wp   ;   d_smv_i_trp(:,:,:)   = 0._wp 
    297          d_oa_i_thd (:,:,:)   = 0._wp   ;   d_oa_i_trp (:,:,:)   = 0._wp 
    298          ! 
    299          d_u_ice_dyn(:,:) = 0._wp 
    300          d_v_ice_dyn(:,:) = 0._wp 
    301          ! 
    302          sfx    (:,:) = 0._wp   ;   sfx_thd  (:,:) = 0._wp 
    303          sfx_bri(:,:) = 0._wp   ;   sfx_mec  (:,:) = 0._wp   ;   sfx_res  (:,:) = 0._wp 
    304          fhbri  (:,:) = 0._wp   ;   fheat_mec(:,:) = 0._wp   ;   fheat_res(:,:) = 0._wp 
    305          fhmec  (:,:) = 0._wp   ;    
    306          fmmec  (:,:) = 0._wp 
    307          fmmflx (:,:) = 0._wp      
    308          focea2D(:,:) = 0._wp 
    309          fsup2D (:,:) = 0._wp 
    310  
    311          ! used in limthd.F90 
    312          rdvosif(:,:) = 0._wp   ! variation of ice volume at surface 
    313          rdvobif(:,:) = 0._wp   ! variation of ice volume at bottom 
    314          fdvolif(:,:) = 0._wp   ! total variation of ice volume 
    315          rdvonif(:,:) = 0._wp   ! lateral variation of ice volume 
    316          fstric (:,:) = 0._wp   ! part of solar radiation transmitted through the ice 
    317          ffltbif(:,:) = 0._wp   ! linked with fstric 
    318          qfvbq  (:,:) = 0._wp   ! linked with fstric 
    319          rdm_snw(:,:) = 0._wp   ! variation of snow mass per unit area 
    320          rdm_ice(:,:) = 0._wp   ! variation of ice mass per unit area 
    321          hicifp (:,:) = 0._wp   ! daily thermodynamic ice production.  
    322          ! 
    323          diag_sni_gr(:,:) = 0._wp   ;   diag_lat_gr(:,:) = 0._wp 
    324          diag_bot_gr(:,:) = 0._wp   ;   diag_dyn_gr(:,:) = 0._wp 
    325          diag_bot_me(:,:) = 0._wp   ;   diag_sur_me(:,:) = 0._wp 
    326          diag_res_pr(:,:) = 0._wp   ;   diag_trp_vi(:,:) = 0._wp 
    327          ! dynamical invariants 
    328          delta_i(:,:) = 0._wp       ;   divu_i(:,:) = 0._wp       ;   shear_i(:,:) = 0._wp 
    329  
    330                           CALL lim_rst_opn( kt )     ! Open Ice restart file 
    331          ! 
    332          IF( ln_nicep )   CALL lim_prt_state( kt, jiindx, jjindx, 1, ' - Beginning the time step - ' )   ! control print 
    333          ! ---------------------------------------------- 
    334          ! ice dynamics and transport (except in 1D case) 
    335          ! ---------------------------------------------- 
    336          IF( .NOT. lk_c1d ) THEN 
    337                           CALL lim_dyn( kt )              ! Ice dynamics    ( rheology/dynamics ) 
    338                           CALL lim_trp( kt )              ! Ice transport   ( Advection/diffusion ) 
    339                           CALL lim_var_glo2eqv            ! equivalent variables, requested for rafting 
    340          IF( ln_nicep )   CALL lim_prt_state( kt, jiindx, jjindx,-1, ' - ice dyn & trp - ' )   ! control print 
    341                           CALL lim_itd_me                 ! Mechanical redistribution ! (ridging/rafting) 
    342                           CALL lim_var_agg( 1 )  
    343 #if defined key_bdy 
    344                           ! bdy ice thermo  
    345                           CALL lim_var_glo2eqv            ! equivalent variables 
    346                           CALL bdy_ice_lim( kt ) 
    347                           CALL lim_itd_me_zapsmall 
    348                           CALL lim_var_agg(1) 
    349          IF( ln_nicep )   CALL lim_prt_state( kt, jiindx, jjindx, 1, ' - ice thermo bdy - ' )   ! control print 
    350 #endif 
    351                           CALL lim_update1 
    352          ENDIF 
    353 !                         !- Change old values for new values 
    354                           old_u_ice(:,:)   = u_ice (:,:) 
    355                           old_v_ice(:,:)   = v_ice (:,:) 
    356                           old_a_i(:,:,:)   = a_i (:,:,:) 
    357                           old_v_s(:,:,:)   = v_s (:,:,:) 
    358                           old_v_i(:,:,:)   = v_i (:,:,:) 
    359                           old_e_s(:,:,:,:) = e_s (:,:,:,:) 
    360                           old_e_i(:,:,:,:) = e_i (:,:,:,:) 
    361                           old_oa_i(:,:,:)  = oa_i(:,:,:) 
    362                           old_smv_i(:,:,:) = smv_i (:,:,:) 
    363   
    364          ! ---------------------------------------------- 
    365          ! ice thermodynamic 
    366          ! ---------------------------------------------- 
    367                           CALL lim_var_glo2eqv            ! equivalent variables 
    368                           CALL lim_var_agg(1)             ! aggregate ice categories 
    369                           ! previous lead fraction and ice volume for flux calculations 
    370                           pfrld(:,:)   = 1._wp - at_i(:,:) 
    371                           phicif(:,:)  = vt_i(:,:) 
    372                           ! 
    373                           CALL lim_var_bv                 ! bulk brine volume (diag) 
    374                           CALL lim_thd( kt )              ! Ice thermodynamics  
    375                           zcoef = rdt_ice /rday           !  Ice natural aging 
    376                           oa_i(:,:,:) = oa_i(:,:,:) + a_i(:,:,:) * zcoef 
    377                           CALL lim_var_glo2eqv            ! this CALL is maybe not necessary (Martin) 
    378          IF( ln_nicep )   CALL lim_prt_state( kt, jiindx, jjindx, 1, ' - ice thermodyn. - ' )   ! control print 
    379                           CALL lim_itd_th( kt )           !  Remap ice categories, lateral accretion  ! 
    380                           CALL lim_var_agg( 1 )           ! requested by limupdate 
    381                           CALL lim_update2                ! Global variables update 
    382  
    383                           CALL lim_var_glo2eqv            ! equivalent variables (outputs) 
    384                           CALL lim_var_agg(2)             ! aggregate ice thickness categories 
    385          IF( ln_nicep )   CALL lim_prt_state( kt, jiindx, jjindx, 2, ' - Final state - ' )   ! control print 
    386          ! 
    387                           CALL lim_sbc_flx( kt )     ! Update surface ocean mass, heat and salt fluxes 
    388          ! 
    389          IF( ln_nicep )   CALL lim_prt_state( kt, jiindx, jjindx, 3, ' - Final state lim_sbc - ' )   ! control print 
    390          ! 
    391          !                                           ! Diagnostics and outputs  
    392          IF (ln_limdiaout) CALL lim_diahsb 
    393 !clem # if ! defined key_iomput 
    394                           CALL lim_wri( 1  )              ! Ice outputs  
    395 !clem # endif 
    396          IF( kt == nit000 .AND. ln_rstart )   & 
    397             &             CALL iom_close( numrir )        ! clem: close input ice restart file 
    398          ! 
    399          IF( lrst_ice )   CALL lim_rst_write( kt )        ! Ice restart file  
    400                           CALL lim_var_glo2eqv            ! ??? 
    401          ! 
    402          IF( ln_nicep )   CALL lim_ctl( kt )              ! alerts in case of model crash 
    403          ! 
    404       ENDIF                                    ! End sea-ice time step only 
    405  
    406       !                                        !--------------------------! 
    407       !                                        !  at all ocean time step  ! 
    408       !                                        !--------------------------! 
    409       !                                                
    410       !                                              ! Update surface ocean stresses (only in ice-dynamic case) 
    411       !                                                   ! otherwise the atm.-ocean stresses are used everywhere 
    412       IF( ln_limdyn )     CALL lim_sbc_tau( kt, ub(:,:,1), vb(:,:,1) )  ! using before instantaneous surf. currents 
    413        
    414 !!gm   remark, the ocean-ice stress is not saved in ice diag call above .....  find a solution!!! 
    415       ! 
    416       CALL wrk_dealloc( jpi,jpj,jpl, zalb_ice_os, zalb_ice_cs ) 
    417  
    418 #if defined key_coupled 
    419       IF ( ln_cpl .OR. ln_iceflx_ave .OR. ln_iceflx_linear ) CALL wrk_dealloc( jpi,jpj,jpl, zalb_ice) 
    420       IF ( ln_iceflx_ave .OR. ln_iceflx_linear ) & 
    421          &    CALL wrk_dealloc( jpi,jpj, ztem_ice_all, zalb_ice_all, z_qsr_ice_all, z_qns_ice_all, z_qla_ice_all, z_dqns_ice_all, z_dqla_ice_all) 
    422 #endif 
    423       ! 
    424       IF( nn_timing == 1 )  CALL timing_stop('sbc_ice_lim') 
    425       ! 
    426    END SUBROUTINE sbc_ice_lim 
    427  
    428  
    429    SUBROUTINE lim_ctl( kt ) 
    430       !!----------------------------------------------------------------------- 
    431       !!                   ***  ROUTINE lim_ctl ***  
    432       !!                  
    433       !! ** Purpose :   Alerts in case of model crash 
    434       !!------------------------------------------------------------------- 
    435       INTEGER, INTENT(in) ::   kt      ! ocean time step 
    436       INTEGER  ::   ji, jj, jk,  jl   ! dummy loop indices 
    437       INTEGER  ::   inb_altests       ! number of alert tests (max 20) 
    438       INTEGER  ::   ialert_id         ! number of the current alert 
    439       REAL(wp) ::   ztmelts           ! ice layer melting point 
    440       CHARACTER (len=30), DIMENSION(20)      ::   cl_alname   ! name of alert 
    441       INTEGER           , DIMENSION(20)      ::   inb_alp     ! number of alerts positive 
    442       !!------------------------------------------------------------------- 
    443  
    444       inb_altests = 10 
    445       inb_alp(:)  =  0 
    446  
    447       ! Alert if incompatible volume and concentration 
    448       ialert_id = 2 ! reference number of this alert 
    449       cl_alname(ialert_id) = ' Incompat vol and con         '    ! name of the alert 
    450  
    451       DO jl = 1, jpl 
    452          DO jj = 1, jpj 
    453             DO ji = 1, jpi 
    454                IF(  v_i(ji,jj,jl) /= 0._wp   .AND.   a_i(ji,jj,jl) == 0._wp   ) THEN 
    455                   !WRITE(numout,*) ' ALERTE 2 :   Incompatible volume and concentration ' 
    456                   !WRITE(numout,*) ' at_i     ', at_i(ji,jj) 
    457                   !WRITE(numout,*) ' Point - category', ji, jj, jl 
    458                   !WRITE(numout,*) ' a_i *** a_i_old ', a_i      (ji,jj,jl), old_a_i  (ji,jj,jl) 
    459                   !WRITE(numout,*) ' v_i *** v_i_old ', v_i      (ji,jj,jl), old_v_i  (ji,jj,jl) 
    460                   !WRITE(numout,*) ' d_a_i_thd/trp   ', d_a_i_thd(ji,jj,jl), d_a_i_trp(ji,jj,jl) 
    461                   !WRITE(numout,*) ' d_v_i_thd/trp   ', d_v_i_thd(ji,jj,jl), d_v_i_trp(ji,jj,jl) 
    462                   inb_alp(ialert_id) = inb_alp(ialert_id) + 1 
    463                ENDIF 
    464             END DO 
    465          END DO 
    466       END DO 
    467  
    468       ! Alerte if very thick ice 
    469       ialert_id = 3 ! reference number of this alert 
    470       cl_alname(ialert_id) = ' Very thick ice               ' ! name of the alert 
    471       jl = jpl  
    472       DO jj = 1, jpj 
    473          DO ji = 1, jpi 
    474             IF(   ht_i(ji,jj,jl)  >  50._wp   ) THEN 
    475                !CALL lim_prt_state( kt, ji, jj, 2, ' ALERTE 3 :   Very thick ice ' ) 
    476                inb_alp(ialert_id) = inb_alp(ialert_id) + 1 
    477             ENDIF 
    478          END DO 
    479       END DO 
    480  
    481       ! Alert if very fast ice 
    482       ialert_id = 4 ! reference number of this alert 
    483       cl_alname(ialert_id) = ' Very fast ice               ' ! name of the alert 
    484       DO jj = 1, jpj 
    485          DO ji = 1, jpi 
    486             IF(   MAX( ABS( u_ice(ji,jj) ), ABS( v_ice(ji,jj) ) ) > 1.5  .AND.  & 
    487                &  at_i(ji,jj) > 0._wp   ) THEN 
    488                !CALL lim_prt_state( kt, ji, jj, 1, ' ALERTE 4 :   Very fast ice ' ) 
    489                !WRITE(numout,*) ' ice strength             : ', strength(ji,jj) 
    490                !WRITE(numout,*) ' oceanic stress utau      : ', utau(ji,jj)  
    491                !WRITE(numout,*) ' oceanic stress vtau      : ', vtau(ji,jj) 
    492                !WRITE(numout,*) ' sea-ice stress utau_ice  : ', utau_ice(ji,jj)  
    493                !WRITE(numout,*) ' sea-ice stress vtau_ice  : ', vtau_ice(ji,jj) 
    494                !WRITE(numout,*) ' oceanic speed u          : ', u_oce(ji,jj) 
    495                !WRITE(numout,*) ' oceanic speed v          : ', v_oce(ji,jj) 
    496                !WRITE(numout,*) ' sst                      : ', sst_m(ji,jj) 
    497                !WRITE(numout,*) ' sss                      : ', sss_m(ji,jj) 
    498                !WRITE(numout,*)  
    499                inb_alp(ialert_id) = inb_alp(ialert_id) + 1 
    500             ENDIF 
    501          END DO 
    502       END DO 
    503  
    504       ! Alert if there is ice on continents 
    505       ialert_id = 6 ! reference number of this alert 
    506       cl_alname(ialert_id) = ' Ice on continents           ' ! name of the alert 
    507       DO jj = 1, jpj 
    508          DO ji = 1, jpi 
    509             IF(   tms(ji,jj) <= 0._wp   .AND.   at_i(ji,jj) > 0._wp   ) THEN  
    510                !CALL lim_prt_state( kt, ji, jj, 1, ' ALERTE 6 :   Ice on continents ' ) 
    511                !WRITE(numout,*) ' masks s, u, v        : ', tms(ji,jj), tmu(ji,jj), tmv(ji,jj)  
    512                !WRITE(numout,*) ' sst                  : ', sst_m(ji,jj) 
    513                !WRITE(numout,*) ' sss                  : ', sss_m(ji,jj) 
    514                !WRITE(numout,*) ' at_i(ji,jj)          : ', at_i(ji,jj) 
    515                !WRITE(numout,*) ' v_ice(ji,jj)         : ', v_ice(ji,jj) 
    516                !WRITE(numout,*) ' v_ice(ji,jj-1)       : ', v_ice(ji,jj-1) 
    517                !WRITE(numout,*) ' u_ice(ji-1,jj)       : ', u_ice(ji-1,jj) 
    518                !WRITE(numout,*) ' u_ice(ji,jj)         : ', v_ice(ji,jj) 
    519                ! 
    520                inb_alp(ialert_id) = inb_alp(ialert_id) + 1 
    521             ENDIF 
    522          END DO 
    523       END DO 
    524  
    525 ! 
    526 !     ! Alert if very fresh ice 
    527       ialert_id = 7 ! reference number of this alert 
    528       cl_alname(ialert_id) = ' Very fresh ice               ' ! name of the alert 
    529       DO jl = 1, jpl 
    530          DO jj = 1, jpj 
    531             DO ji = 1, jpi 
    532                IF( sm_i(ji,jj,jl) < 0.1 .AND. a_i(ji,jj,jl) > 0._wp ) THEN 
    533 !                 CALL lim_prt_state(kt,ji,jj,1, ' ALERTE 7 :   Very fresh ice ' ) 
    534 !                 WRITE(numout,*) ' sst                  : ', sst_m(ji,jj) 
    535 !                 WRITE(numout,*) ' sss                  : ', sss_m(ji,jj) 
    536 !                 WRITE(numout,*) ' s_i_newice           : ', s_i_newice(ji,jj,1:jpl) 
    537 !                 WRITE(numout,*)  
    538                   inb_alp(ialert_id) = inb_alp(ialert_id) + 1 
    539                ENDIF 
    540             END DO 
    541          END DO 
    542       END DO 
    543 ! 
    544  
    545 !     ! Alert if too old ice 
    546       ialert_id = 9 ! reference number of this alert 
    547       cl_alname(ialert_id) = ' Very old   ice               ' ! name of the alert 
    548       DO jl = 1, jpl 
    549          DO jj = 1, jpj 
    550             DO ji = 1, jpi 
    551                IF ( ( ( ABS( o_i(ji,jj,jl) ) > rdt_ice ) .OR. & 
    552                       ( ABS( o_i(ji,jj,jl) ) < 0._wp) ) .AND. & 
    553                              ( a_i(ji,jj,jl) > 0._wp ) ) THEN 
    554                   !CALL lim_prt_state( kt, ji, jj, 1, ' ALERTE 9 :   Wrong ice age ') 
    555                   inb_alp(ialert_id) = inb_alp(ialert_id) + 1 
    556                ENDIF 
    557             END DO 
    558          END DO 
    559       END DO 
    560   
    561       ! Alert on salt flux 
    562       ialert_id = 5 ! reference number of this alert 
    563       cl_alname(ialert_id) = ' High salt flux               ' ! name of the alert 
    564       DO jj = 1, jpj 
    565          DO ji = 1, jpi 
    566             IF( ABS( sfx (ji,jj) ) .GT. 1.0e-2 ) THEN  ! = 1 psu/day for 1m ocean depth 
    567                !CALL lim_prt_state( kt, ji, jj, 3, ' ALERTE 5 :   High salt flux ' ) 
    568                !DO jl = 1, jpl 
    569                   !WRITE(numout,*) ' Category no: ', jl 
    570                   !WRITE(numout,*) ' a_i        : ', a_i      (ji,jj,jl) , ' old_a_i    : ', old_a_i  (ji,jj,jl)    
    571                   !WRITE(numout,*) ' d_a_i_trp  : ', d_a_i_trp(ji,jj,jl) , ' d_a_i_thd  : ', d_a_i_thd(ji,jj,jl)  
    572                   !WRITE(numout,*) ' v_i        : ', v_i      (ji,jj,jl) , ' old_v_i    : ', old_v_i  (ji,jj,jl)    
    573                   !WRITE(numout,*) ' d_v_i_trp  : ', d_v_i_trp(ji,jj,jl) , ' d_v_i_thd  : ', d_v_i_thd(ji,jj,jl)  
    574                   !WRITE(numout,*) ' ' 
    575                !END DO 
    576                inb_alp(ialert_id) = inb_alp(ialert_id) + 1 
    577             ENDIF 
    578          END DO 
    579       END DO 
    580  
    581       ! Alert if qns very big 
    582       ialert_id = 8 ! reference number of this alert 
    583       cl_alname(ialert_id) = ' fnsolar very big             ' ! name of the alert 
    584       DO jj = 1, jpj 
    585          DO ji = 1, jpi 
    586             IF( ABS( qns(ji,jj) ) > 1500._wp .AND. at_i(ji,jj) > 0._wp ) THEN 
    587                ! 
    588                !WRITE(numout,*) ' ALERTE 8 :   Very high non-solar heat flux' 
    589                !WRITE(numout,*) ' ji, jj    : ', ji, jj 
    590                !WRITE(numout,*) ' qns       : ', qns(ji,jj) 
    591                !WRITE(numout,*) ' sst       : ', sst_m(ji,jj) 
    592                !WRITE(numout,*) ' sss       : ', sss_m(ji,jj) 
    593                !WRITE(numout,*) ' qcmif     : ', qcmif(ji,jj) 
    594                !WRITE(numout,*) ' qldif     : ', qldif(ji,jj) 
    595                !WRITE(numout,*) ' qcmif     : ', qcmif(ji,jj) / rdt_ice 
    596                !WRITE(numout,*) ' qldif     : ', qldif(ji,jj) / rdt_ice 
    597                !WRITE(numout,*) ' qfvbq     : ', qfvbq(ji,jj) 
    598                !WRITE(numout,*) ' qdtcn     : ', qdtcn(ji,jj) 
    599                !WRITE(numout,*) ' qfvbq / dt: ', qfvbq(ji,jj) / rdt_ice 
    600                !WRITE(numout,*) ' qdtcn / dt: ', qdtcn(ji,jj) / rdt_ice 
    601                !WRITE(numout,*) ' fdtcn     : ', fdtcn(ji,jj)  
    602                !WRITE(numout,*) ' fhmec     : ', fhmec(ji,jj)  
    603                !WRITE(numout,*) ' fheat_mec : ', fheat_mec(ji,jj)  
    604                !WRITE(numout,*) ' fheat_res : ', fheat_res(ji,jj)  
    605                !WRITE(numout,*) ' fhbri     : ', fhbri(ji,jj)  
    606                ! 
    607                !CALL lim_prt_state( kt, ji, jj, 2, '   ') 
    608                inb_alp(ialert_id) = inb_alp(ialert_id) + 1 
    609                ! 
    610             ENDIF 
    611          END DO 
    612       END DO 
    613       !+++++ 
    614   
    615       ! Alert if very warm ice 
    616       ialert_id = 10 ! reference number of this alert 
    617       cl_alname(ialert_id) = ' Very warm ice                ' ! name of the alert 
    618       inb_alp(ialert_id) = 0 
    619       DO jl = 1, jpl 
    620          DO jk = 1, nlay_i 
    621             DO jj = 1, jpj 
    622                DO ji = 1, jpi 
    623                   ztmelts    =  -tmut * s_i(ji,jj,jk,jl) + rtt 
    624                   IF( t_i(ji,jj,jk,jl) >= ztmelts  .AND.  v_i(ji,jj,jl) > 1.e-10   & 
    625                      &                             .AND.  a_i(ji,jj,jl) > 0._wp   ) THEN 
    626                      !WRITE(numout,*) ' ALERTE 10 :   Very warm ice' 
    627                      !WRITE(numout,*) ' ji, jj, jk, jl : ', ji, jj, jk, jl 
    628                      !WRITE(numout,*) ' t_i : ', t_i(ji,jj,jk,jl) 
    629                      !WRITE(numout,*) ' e_i : ', e_i(ji,jj,jk,jl) 
    630                      !WRITE(numout,*) ' s_i : ', s_i(ji,jj,jk,jl) 
    631                      !WRITE(numout,*) ' ztmelts : ', ztmelts 
    632                      inb_alp(ialert_id) = inb_alp(ialert_id) + 1 
    633                   ENDIF 
    634                END DO 
    635             END DO 
    636          END DO 
    637       END DO 
    638  
    639       ! sum of the alerts on all processors 
    640       IF( lk_mpp ) THEN 
    641          DO ialert_id = 1, inb_altests 
    642             CALL mpp_sum(inb_alp(ialert_id)) 
    643          END DO 
    644       ENDIF 
    645  
    646       ! print alerts 
    647       IF( lwp ) THEN 
    648          ialert_id = 1                                 ! reference number of this alert 
    649          cl_alname(ialert_id) = ' NO alerte 1      '   ! name of the alert 
    650          WRITE(numout,*) ' time step ',kt 
    651          WRITE(numout,*) ' All alerts at the end of ice model ' 
    652          DO ialert_id = 1, inb_altests 
    653             WRITE(numout,*) ialert_id, cl_alname(ialert_id)//' : ', inb_alp(ialert_id), ' times ! ' 
    654          END DO 
    655       ENDIF 
    656      ! 
    657    END SUBROUTINE lim_ctl 
    658   
    659     
    660    SUBROUTINE lim_prt_state( kt, ki, kj, kn, cd1 ) 
    661       !!----------------------------------------------------------------------- 
    662       !!                   ***  ROUTINE lim_prt_state ***  
    663       !!                  
    664       !! ** Purpose :   Writes global ice state on the (i,j) point  
    665       !!                in ocean.ouput  
    666       !!                3 possibilities exist  
    667       !!                n = 1/-1 -> simple ice state (plus Mechanical Check if -1) 
    668       !!                n = 2    -> exhaustive state 
    669       !!                n = 3    -> ice/ocean salt fluxes 
    670       !! 
    671       !! ** input   :   point coordinates (i,j)  
    672       !!                n : number of the option 
    673       !!------------------------------------------------------------------- 
    674       INTEGER         , INTENT(in) ::   kt      ! ocean time step 
    675       INTEGER         , INTENT(in) ::   ki, kj, kn    ! ocean gridpoint indices 
    676       CHARACTER(len=*), INTENT(in) ::   cd1           ! 
    677       !! 
    678       INTEGER :: jl, ji, jj 
    679       !!------------------------------------------------------------------- 
    680  
    681       DO ji = mi0(ki), mi1(ki) 
    682          DO jj = mj0(kj), mj1(kj) 
    683  
    684             WRITE(numout,*) ' time step ',kt,' ',cd1             ! print title 
    685  
    686             !---------------- 
    687             !  Simple state 
    688             !---------------- 
    689              
    690             IF ( kn == 1 .OR. kn == -1 ) THEN 
    691                WRITE(numout,*) ' lim_prt_state - Point : ',ji,jj 
    692                WRITE(numout,*) ' ~~~~~~~~~~~~~~ ' 
    693                WRITE(numout,*) ' Simple state ' 
    694                WRITE(numout,*) ' masks s,u,v   : ', tms(ji,jj), tmu(ji,jj), tmv(ji,jj) 
    695                WRITE(numout,*) ' lat - long    : ', gphit(ji,jj), glamt(ji,jj) 
    696                WRITE(numout,*) ' Time step     : ', numit 
    697                WRITE(numout,*) ' - Ice drift   ' 
    698                WRITE(numout,*) '   ~~~~~~~~~~~ ' 
    699                WRITE(numout,*) ' u_ice(i-1,j)  : ', u_ice(ji-1,jj) 
    700                WRITE(numout,*) ' u_ice(i  ,j)  : ', u_ice(ji,jj) 
    701                WRITE(numout,*) ' v_ice(i  ,j-1): ', v_ice(ji,jj-1) 
    702                WRITE(numout,*) ' v_ice(i  ,j)  : ', v_ice(ji,jj) 
    703                WRITE(numout,*) ' strength      : ', strength(ji,jj) 
    704                WRITE(numout,*) 
    705                WRITE(numout,*) ' - Cell values ' 
    706                WRITE(numout,*) '   ~~~~~~~~~~~ ' 
    707                WRITE(numout,*) ' cell area     : ', area(ji,jj) 
    708                WRITE(numout,*) ' at_i          : ', at_i(ji,jj)        
    709                WRITE(numout,*) ' vt_i          : ', vt_i(ji,jj)        
    710                WRITE(numout,*) ' vt_s          : ', vt_s(ji,jj)        
    711                DO jl = 1, jpl 
    712                   WRITE(numout,*) ' - Category (', jl,')' 
    713                   WRITE(numout,*) ' a_i           : ', a_i(ji,jj,jl) 
    714                   WRITE(numout,*) ' ht_i          : ', ht_i(ji,jj,jl) 
    715                   WRITE(numout,*) ' ht_s          : ', ht_s(ji,jj,jl) 
    716                   WRITE(numout,*) ' v_i           : ', v_i(ji,jj,jl) 
    717                   WRITE(numout,*) ' v_s           : ', v_s(ji,jj,jl) 
    718                   WRITE(numout,*) ' e_s           : ', e_s(ji,jj,1,jl)/1.0e9 
    719                   WRITE(numout,*) ' e_i           : ', e_i(ji,jj,1:nlay_i,jl)/1.0e9 
    720                   WRITE(numout,*) ' t_su          : ', t_su(ji,jj,jl) 
    721                   WRITE(numout,*) ' t_snow        : ', t_s(ji,jj,1,jl) 
    722                   WRITE(numout,*) ' t_i           : ', t_i(ji,jj,1:nlay_i,jl) 
    723                   WRITE(numout,*) ' sm_i          : ', sm_i(ji,jj,jl) 
    724                   WRITE(numout,*) ' smv_i         : ', smv_i(ji,jj,jl) 
    725                   WRITE(numout,*) 
    726                END DO 
    727             ENDIF 
    728             IF( kn == -1 ) THEN 
    729                WRITE(numout,*) ' Mechanical Check ************** ' 
    730                WRITE(numout,*) ' Check what means ice divergence ' 
    731                WRITE(numout,*) ' Total ice concentration ', at_i (ji,jj) 
    732                WRITE(numout,*) ' Total lead fraction     ', ato_i(ji,jj) 
    733                WRITE(numout,*) ' Sum of both             ', ato_i(ji,jj) + at_i(ji,jj) 
    734                WRITE(numout,*) ' Sum of both minus 1     ', ato_i(ji,jj) + at_i(ji,jj) - 1.00 
    735             ENDIF 
    736              
    737  
    738             !-------------------- 
    739             !  Exhaustive state 
    740             !-------------------- 
    741              
    742             IF ( kn .EQ. 2 ) THEN 
    743                WRITE(numout,*) ' lim_prt_state - Point : ',ji,jj 
    744                WRITE(numout,*) ' ~~~~~~~~~~~~~~ ' 
    745                WRITE(numout,*) ' Exhaustive state ' 
    746                WRITE(numout,*) ' lat - long ', gphit(ji,jj), glamt(ji,jj) 
    747                WRITE(numout,*) ' Time step ', numit 
    748                WRITE(numout,*)  
    749                WRITE(numout,*) ' - Cell values ' 
    750                WRITE(numout,*) '   ~~~~~~~~~~~ ' 
    751                WRITE(numout,*) ' cell area     : ', area(ji,jj) 
    752                WRITE(numout,*) ' at_i          : ', at_i(ji,jj)        
    753                WRITE(numout,*) ' vt_i          : ', vt_i(ji,jj)        
    754                WRITE(numout,*) ' vt_s          : ', vt_s(ji,jj)        
    755                WRITE(numout,*) ' u_ice(i-1,j)  : ', u_ice(ji-1,jj) 
    756                WRITE(numout,*) ' u_ice(i  ,j)  : ', u_ice(ji,jj) 
    757                WRITE(numout,*) ' v_ice(i  ,j-1): ', v_ice(ji,jj-1) 
    758                WRITE(numout,*) ' v_ice(i  ,j)  : ', v_ice(ji,jj) 
    759                WRITE(numout,*) ' strength      : ', strength(ji,jj) 
    760                WRITE(numout,*) ' d_u_ice_dyn   : ', d_u_ice_dyn(ji,jj), ' d_v_ice_dyn   : ', d_v_ice_dyn(ji,jj) 
    761                WRITE(numout,*) ' old_u_ice     : ', old_u_ice(ji,jj)  , ' old_v_ice     : ', old_v_ice(ji,jj)   
    762                WRITE(numout,*) 
    763                 
    764                DO jl = 1, jpl 
    765                   WRITE(numout,*) ' - Category (',jl,')' 
    766                   WRITE(numout,*) '   ~~~~~~~~         '  
    767                   WRITE(numout,*) ' ht_i       : ', ht_i(ji,jj,jl)             , ' ht_s       : ', ht_s(ji,jj,jl) 
    768                   WRITE(numout,*) ' t_i        : ', t_i(ji,jj,1:nlay_i,jl) 
    769                   WRITE(numout,*) ' t_su       : ', t_su(ji,jj,jl)             , ' t_s        : ', t_s(ji,jj,1,jl) 
    770                   WRITE(numout,*) ' sm_i       : ', sm_i(ji,jj,jl)             , ' o_i        : ', o_i(ji,jj,jl) 
    771                   WRITE(numout,*) ' a_i        : ', a_i(ji,jj,jl)              , ' old_a_i    : ', old_a_i(ji,jj,jl)    
    772                   WRITE(numout,*) ' d_a_i_trp  : ', d_a_i_trp(ji,jj,jl)        , ' d_a_i_thd  : ', d_a_i_thd(ji,jj,jl)  
    773                   WRITE(numout,*) ' v_i        : ', v_i(ji,jj,jl)              , ' old_v_i    : ', old_v_i(ji,jj,jl)    
    774                   WRITE(numout,*) ' d_v_i_trp  : ', d_v_i_trp(ji,jj,jl)        , ' d_v_i_thd  : ', d_v_i_thd(ji,jj,jl)  
    775                   WRITE(numout,*) ' v_s        : ', v_s(ji,jj,jl)              , ' old_v_s    : ', old_v_s(ji,jj,jl)   
    776                   WRITE(numout,*) ' d_v_s_trp  : ', d_v_s_trp(ji,jj,jl)        , ' d_v_s_thd  : ', d_v_s_thd(ji,jj,jl) 
    777                   WRITE(numout,*) ' e_i1       : ', e_i(ji,jj,1,jl)/1.0e9      , ' old_ei1    : ', old_e_i(ji,jj,1,jl)/1.0e9  
    778                   WRITE(numout,*) ' de_i1_trp  : ', d_e_i_trp(ji,jj,1,jl)/1.0e9, ' de_i1_thd  : ', d_e_i_thd(ji,jj,1,jl)/1.0e9 
    779                   WRITE(numout,*) ' e_i2       : ', e_i(ji,jj,2,jl)/1.0e9      , ' old_ei2    : ', old_e_i(ji,jj,2,jl)/1.0e9   
    780                   WRITE(numout,*) ' de_i2_trp  : ', d_e_i_trp(ji,jj,2,jl)/1.0e9, ' de_i2_thd  : ', d_e_i_thd(ji,jj,2,jl)/1.0e9 
    781                   WRITE(numout,*) ' e_snow     : ', e_s(ji,jj,1,jl)            , ' old_e_snow : ', old_e_s(ji,jj,1,jl)  
    782                   WRITE(numout,*) ' d_e_s_trp  : ', d_e_s_trp(ji,jj,1,jl)      , ' d_e_s_thd  : ', d_e_s_thd(ji,jj,1,jl) 
    783                   WRITE(numout,*) ' smv_i      : ', smv_i(ji,jj,jl)            , ' old_smv_i  : ', old_smv_i(ji,jj,jl)    
    784                   WRITE(numout,*) ' d_smv_i_trp: ', d_smv_i_trp(ji,jj,jl)      , ' d_smv_i_thd: ', d_smv_i_thd(ji,jj,jl)  
    785                   WRITE(numout,*) ' oa_i       : ', oa_i(ji,jj,jl)             , ' old_oa_i   : ', old_oa_i(ji,jj,jl) 
    786                   WRITE(numout,*) ' d_oa_i_trp : ', d_oa_i_trp(ji,jj,jl)       , ' d_oa_i_thd : ', d_oa_i_thd(ji,jj,jl) 
    787                END DO !jl 
    788                 
    789                WRITE(numout,*) 
    790                WRITE(numout,*) ' - Heat / FW fluxes ' 
    791                WRITE(numout,*) '   ~~~~~~~~~~~~~~~~ ' 
    792                WRITE(numout,*) ' emp        : ', emp      (ji,jj) 
    793                WRITE(numout,*) ' sfx        : ', sfx      (ji,jj) 
    794                WRITE(numout,*) ' sfx_thd    : ', sfx_thd(ji,jj) 
    795                WRITE(numout,*) ' sfx_bri    : ', sfx_bri  (ji,jj) 
    796                WRITE(numout,*) ' sfx_mec    : ', sfx_mec  (ji,jj) 
    797                WRITE(numout,*) ' sfx_res    : ', sfx_res(ji,jj) 
    798                WRITE(numout,*) ' fmmec      : ', fmmec    (ji,jj) 
    799                WRITE(numout,*) ' fhmec      : ', fhmec    (ji,jj) 
    800                WRITE(numout,*) ' fhbri      : ', fhbri    (ji,jj) 
    801                WRITE(numout,*) ' fheat_mec  : ', fheat_mec(ji,jj) 
    802                WRITE(numout,*)  
    803                WRITE(numout,*) ' sst        : ', sst_m(ji,jj)   
    804                WRITE(numout,*) ' sss        : ', sss_m(ji,jj)   
    805                WRITE(numout,*)  
    806                WRITE(numout,*) ' - Stresses ' 
    807                WRITE(numout,*) '   ~~~~~~~~ ' 
    808                WRITE(numout,*) ' utau_ice   : ', utau_ice(ji,jj)  
    809                WRITE(numout,*) ' vtau_ice   : ', vtau_ice(ji,jj) 
    810                WRITE(numout,*) ' utau       : ', utau    (ji,jj)  
    811                WRITE(numout,*) ' vtau       : ', vtau    (ji,jj) 
    812                WRITE(numout,*) ' oc. vel. u : ', u_oce   (ji,jj) 
    813                WRITE(numout,*) ' oc. vel. v : ', v_oce   (ji,jj) 
    814             ENDIF 
    815              
    816             !--------------------- 
    817             ! Salt / heat fluxes 
    818             !--------------------- 
    819              
    820             IF ( kn .EQ. 3 ) THEN 
    821                WRITE(numout,*) ' lim_prt_state - Point : ',ji,jj 
    822                WRITE(numout,*) ' ~~~~~~~~~~~~~~ ' 
    823                WRITE(numout,*) ' - Salt / Heat Fluxes ' 
    824                WRITE(numout,*) '   ~~~~~~~~~~~~~~~~ ' 
    825                WRITE(numout,*) ' lat - long ', gphit(ji,jj), glamt(ji,jj) 
    826                WRITE(numout,*) ' Time step ', numit 
    827                WRITE(numout,*) 
    828                WRITE(numout,*) ' - Heat fluxes at bottom interface ***' 
    829                WRITE(numout,*) ' qsr       : ', qsr(ji,jj) 
    830                WRITE(numout,*) ' qns       : ', qns(ji,jj) 
    831                WRITE(numout,*) ' fdtcn     : ', fdtcn(ji,jj) 
    832                WRITE(numout,*) ' qcmif     : ', qcmif(ji,jj) * r1_rdtice 
    833                WRITE(numout,*) ' qldif     : ', qldif(ji,jj) * r1_rdtice 
    834                WRITE(numout,*) 
    835                WRITE(numout,*) ' - Salt fluxes at bottom interface ***' 
    836                WRITE(numout,*) ' emp       : ', emp    (ji,jj) 
    837                WRITE(numout,*) ' sfx_bri   : ', sfx_bri(ji,jj) 
    838                WRITE(numout,*) ' sfx       : ', sfx    (ji,jj) 
    839                WRITE(numout,*) ' sfx_res   : ', sfx_res(ji,jj) 
    840                WRITE(numout,*) ' sfx_mec   : ', sfx_mec(ji,jj) 
    841                WRITE(numout,*) ' - Heat fluxes at bottom interface ***' 
    842                WRITE(numout,*) ' fheat_res : ', fheat_res(ji,jj) 
    843                WRITE(numout,*) 
    844                WRITE(numout,*) ' - Momentum fluxes ' 
    845                WRITE(numout,*) ' utau      : ', utau(ji,jj)  
    846                WRITE(numout,*) ' vtau      : ', vtau(ji,jj) 
    847             ENDIF 
    848             WRITE(numout,*) ' ' 
    849             ! 
    850          END DO 
    851       END DO 
    852  
    853    END SUBROUTINE lim_prt_state 
    854635 
    855636#else 
     
    861642      WRITE(*,*) 'sbc_ice_lim: You should not have seen this print! error?', kt, kblk 
    862643   END SUBROUTINE sbc_ice_lim 
     644   SUBROUTINE sbc_lim_init                 ! Dummy routine 
     645   END SUBROUTINE sbc_lim_init 
    863646#endif 
    864647 
  • branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/sbcice_lim_2.F90

    r4621 r5837  
    5353   USE agrif_lim2_update 
    5454# endif 
     55 
     56#if defined key_bdy  
     57   USE bdyice_lim       ! unstructured open boundary data  (bdy_ice_lim routine) 
     58#endif 
    5559 
    5660   IMPLICIT NONE 
     
    9397      !! 
    9498      INTEGER  ::   ji, jj   ! dummy loop indices 
    95       REAL(wp), DIMENSION(:,:,:), POINTER :: zalb_ice_os   ! albedo of the ice under overcast sky 
    96       REAL(wp), DIMENSION(:,:,:), POINTER :: zalb_ice_cs   ! albedo of ice under clear sky 
    97       REAL(wp), DIMENSION(:,:,:), POINTER :: zsist         ! surface ice temperature (K) 
     99      REAL(wp), DIMENSION(:,:,:), POINTER :: zalb_os   ! ice albedo under overcast sky 
     100      REAL(wp), DIMENSION(:,:,:), POINTER :: zalb_cs   ! ice albedo under clear sky 
     101      REAL(wp), DIMENSION(:,:,:), POINTER :: zalb_ice  ! mean ice albedo 
     102      REAL(wp), DIMENSION(:,:,:), POINTER :: zsist     ! ice surface temperature (K) 
     103      REAL(wp), DIMENSION(:,:  ), POINTER :: zutau_ice, zvtau_ice  
    98104      !!---------------------------------------------------------------------- 
    99  
    100       CALL wrk_alloc( jpi,jpj,1, zalb_ice_os, zalb_ice_cs, zsist ) 
    101105 
    102106      IF( kt == nit000 ) THEN 
     
    119123         &*Agrif_PArent(nn_fsbc)/REAL(nn_fsbc)) + 1 
    120124# endif 
     125 
     126         CALL wrk_alloc( jpi,jpj  , zutau_ice, zvtau_ice) 
     127         CALL wrk_alloc( jpi,jpj,1, zalb_os, zalb_cs, zalb_ice, zsist ) 
     128 
    121129         !  Bulk Formulea ! 
    122130         !----------------! 
     
    126134            DO jj = 2, jpj 
    127135               DO ji = 2, jpi   ! NO vector opt. possible 
    128                   u_oce(ji,jj) = 0.5_wp * ( ssu_m(ji-1,jj  ) + ssu_m(ji-1,jj-1) ) * tmu(ji,jj) 
    129                   v_oce(ji,jj) = 0.5_wp * ( ssv_m(ji  ,jj-1) + ssv_m(ji-1,jj-1) ) * tmu(ji,jj) 
     136                  u_oce(ji,jj) = 0.5_wp * ( ssu_m(ji-1,jj  ) * umask(ji-1,jj  ,1) & 
     137                     &                    + ssu_m(ji-1,jj-1) * umask(ji-1,jj-1,1) ) * tmu(ji,jj) 
     138                  v_oce(ji,jj) = 0.5_wp * ( ssv_m(ji  ,jj-1) * vmask(ji  ,jj-1,1) & 
     139                     &                    + ssv_m(ji-1,jj-1) * vmask(ji-1,jj-1,1) ) * tmu(ji,jj) 
    130140               END DO 
    131141            END DO 
     
    134144            ! 
    135145         CASE( 'C' )                  !== C-grid ice dynamics :   U & V-points (same as ocean) 
    136             u_oce(:,:) = ssu_m(:,:)                     ! mean surface ocean current at ice velocity point 
    137             v_oce(:,:) = ssv_m(:,:) 
     146            u_oce(:,:) = ssu_m(:,:) * umask(:,:,1)                     ! mean surface ocean current at ice velocity point 
     147            v_oce(:,:) = ssv_m(:,:) * vmask(:,:,1) 
    138148            ! 
    139149         END SELECT 
    140150 
    141151         ! ... masked sea surface freezing temperature [Kelvin] (set to rt0 over land) 
    142          tfu(:,:) = tfreez( sss_m ) +  rt0  
     152         tfu(:,:) = eos_fzp( sss_m ) +  rt0  
    143153 
    144154         zsist (:,:,1) = sist (:,:) + rt0 * ( 1. - tmask(:,:,1) ) 
    145155 
    146          ! ... ice albedo (clear sky and overcast sky) 
     156         ! Ice albedo 
     157 
    147158         CALL albedo_ice( zsist, reshape( hicif, (/jpi,jpj,1/) ), & 
    148159                                 reshape( hsnif, (/jpi,jpj,1/) ), & 
    149                           zalb_ice_cs, zalb_ice_os ) 
     160                          zalb_cs, zalb_os ) 
     161 
     162         SELECT CASE( ksbc ) 
     163         CASE( jp_core , jp_purecpl )   ! CORE and COUPLED bulk formulations 
     164 
     165            ! albedo depends on cloud fraction because of non-linear spectral effects 
     166            zalb_ice(:,:,:) = ( 1. - cldf_ice ) * zalb_cs(:,:,:) + cldf_ice * zalb_os(:,:,:) 
     167            ! In CLIO the cloud fraction is read in the climatology and the all-sky albedo  
     168            ! (zalb_ice) is computed within the bulk routine 
     169 
     170         END SELECT 
    150171 
    151172         ! ... Sea-ice surface boundary conditions output from bulk formulae : 
     
    163184         ! 
    164185         SELECT CASE( ksbc ) 
    165          CASE( 3 )           ! CLIO bulk formulation 
    166             CALL blk_ice_clio( zsist, zalb_ice_cs, zalb_ice_os,                         & 
    167                &                      utau_ice   , vtau_ice   , qns_ice    , qsr_ice,   & 
    168                &                      qla_ice    , dqns_ice   , dqla_ice   ,            & 
    169                &                      tprecip    , sprecip    ,                         & 
    170                &                      fr1_i0     , fr2_i0     , cp_ice_msh , jpl  ) 
    171  
    172          CASE( 4 )           ! CORE bulk formulation 
    173             CALL blk_ice_core( zsist, u_ice      , v_ice      , zalb_ice_cs,            & 
    174                &                      utau_ice   , vtau_ice   , qns_ice    , qsr_ice,   & 
    175                &                      qla_ice    , dqns_ice   , dqla_ice   ,            & 
    176                &                      tprecip    , sprecip    ,                         & 
    177                &                      fr1_i0     , fr2_i0     , cp_ice_msh , jpl  ) 
    178             IF( ltrcdm2dc_ice )   CALL blk_ice_meanqsr( zalb_ice_cs, qsr_ice_mean, jpl ) 
    179  
    180          CASE( 5 )           ! Coupled formulation : atmosphere-ice stress only (fluxes provided after ice dynamics) 
     186         CASE( jp_clio )           ! CLIO bulk formulation 
     187!           CALL blk_ice_clio( zsist, zalb_cs    , zalb_os    , zalb_ice   ,            & 
     188!              &                      utau_ice   , vtau_ice   , qns_ice    , qsr_ice,   & 
     189!              &                      qla_ice    , dqns_ice   , dqla_ice   ,            & 
     190!              &                      tprecip    , sprecip    ,                         & 
     191!              &                      fr1_i0     , fr2_i0     , cp_ice_msh , jpl  ) 
     192            CALL blk_ice_clio_tau 
     193            CALL blk_ice_clio_flx( zsist, zalb_cs, zalb_os, zalb_ice ) 
     194 
     195         CASE( jp_core )           ! CORE bulk formulation 
     196            CALL blk_ice_core_tau 
     197            CALL blk_ice_core_flx( zsist, zalb_ice ) 
     198 
     199         CASE( jp_purecpl )            ! Coupled formulation : atmosphere-ice stress only (fluxes provided after ice dynamics) 
    181200            CALL sbc_cpl_ice_tau( utau_ice , vtau_ice ) 
    182201         END SELECT 
     202          
     203         IF( ln_mixcpl) THEN 
     204            CALL sbc_cpl_ice_tau( zutau_ice , zvtau_ice ) 
     205            utau_ice(:,:) = utau_ice(:,:) * xcplmask(:,:,0) + zutau_ice(:,:) * ( 1. - xcplmask(:,:,0) ) 
     206            vtau_ice(:,:) = vtau_ice(:,:) * xcplmask(:,:,0) + zvtau_ice(:,:) * ( 1. - xcplmask(:,:,0) ) 
     207         ENDIF 
    183208 
    184209         CALL iom_put( 'utau_ice', utau_ice )     ! Wind stress over ice along i-axis at I-point 
     
    205230                           CALL lim_trp_2      ( kt )      ! Ice transport   ( Advection/diffusion ) 
    206231           IF( ln_limdmp ) CALL lim_dmp_2      ( kt )      ! Ice damping  
     232#if defined key_bdy 
     233                           CALL bdy_ice_lim( kt ) ! bdy ice thermo 
     234#endif 
    207235         END IF 
    208 #if defined key_coupled 
    209236         !                                             ! Ice surface fluxes in coupled mode  
    210          IF( ksbc == 5 )   THEN 
     237         IF( ln_cpl ) THEN   ! pure coupled and mixed forced-coupled configurations 
    211238            a_i(:,:,1)=fr_i 
    212239            CALL sbc_cpl_ice_flx( frld,                                              & 
    213240            !                                optional arguments, used only in 'mixed oce-ice' case 
    214             &                                             palbi = zalb_ice_cs, psst = sst_m, pist = zsist ) 
     241            &                                             palbi=zalb_ice, psst=sst_m, pist=zsist ) 
    215242            sprecip(:,:) = - emp_ice(:,:)   ! Ugly patch, WARNING, in coupled mode, sublimation included in snow (parsub = 0.) 
    216243         ENDIF 
    217 #endif 
    218244                           CALL lim_thd_2      ( kt )      ! Ice thermodynamics  
    219245                           CALL lim_sbc_flx_2  ( kt )      ! update surface ocean mass, heat & salt fluxes  
    220 #if defined key_top 
    221         IF( ltrcdm2dc_ice )CALL lim_bio_meanqsr_2 
    222 #endif 
    223246 
    224247         IF(  .NOT. lk_mpp )THEN 
     
    234257         IF( .NOT. Agrif_Root() )   CALL agrif_update_lim2( kt ) 
    235258# endif 
     259         ! 
     260         CALL wrk_dealloc( jpi,jpj  , zutau_ice, zvtau_ice) 
     261         CALL wrk_dealloc( jpi,jpj,1, zalb_os, zalb_cs, zalb_ice, zsist ) 
    236262         ! 
    237263      ENDIF                                    ! End sea-ice time step only 
     
    245271      IF( ln_limdyn    )   CALL lim_sbc_tau_2( kt, ub(:,:,1), vb(:,:,1) )  ! using before instantaneous surf. currents 
    246272      ! 
    247       CALL wrk_dealloc( jpi,jpj,1, zalb_ice_os, zalb_ice_cs, zsist ) 
    248       ! 
    249273   END SUBROUTINE sbc_ice_lim_2 
    250274 
  • branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/sbcmod.F90

    r4624 r5837  
    1313   !!            3.4  ! 2011-11  (C. Harris) CICE added as an option 
    1414   !!            3.5  ! 2012-11  (A. Coward, G. Madec) Rethink of heat, mass and salt surface fluxes 
     15   !!            3.6  ! 2014-11  (P. Mathiot, C. Harris) add ice shelves melting                     
    1516   !!---------------------------------------------------------------------- 
    1617 
     
    2324   USE phycst           ! physical constants 
    2425   USE sbc_oce          ! Surface boundary condition: ocean fields 
     26   USE trc_oce          ! shared ocean-passive tracers variables 
    2527   USE sbc_ice          ! Surface boundary condition: ice fields 
    2628   USE sbcdcy           ! surface boundary condition: diurnal cycle 
     
    3739   USE sbcice_cice      ! surface boundary condition: CICE    sea-ice model 
    3840   USE sbccpl           ! surface boundary condition: coupled florulation 
    39    USE cpl_oasis3, ONLY:lk_cpl      ! are we in coupled mode? 
     41   USE cpl_oasis3       ! OASIS routines for coupling 
    4042   USE sbcssr           ! surface boundary condition: sea surface restoring 
    4143   USE sbcrnf           ! surface boundary condition: runoffs 
     44   USE sbcisf           ! surface boundary condition: ice shelf 
    4245   USE sbcfwb           ! surface boundary condition: freshwater budget 
    4346   USE closea           ! closed sea 
     
    5053   USE timing           ! Timing 
    5154   USE sbcwave          ! Wave module 
     55   USE bdy_par          ! Require lk_bdy 
    5256 
    5357   IMPLICIT NONE 
     
    8286      INTEGER ::   icpt   ! local integer 
    8387      !! 
    84       NAMELIST/namsbc/ nn_fsbc   , ln_ana    , ln_flx,  ln_blk_clio, ln_blk_core, ln_cpl,   & 
    85          &             ln_blk_mfs, ln_apr_dyn, nn_ice,  nn_ice_embd, ln_dm2dc   , ln_rnf,   & 
    86          &             ln_ssr    , nn_fwb    , ln_cdgw , ln_wave , ln_sdw, nn_lsm, cn_iceflx 
     88      NAMELIST/namsbc/ nn_fsbc   , ln_ana    , ln_flx, ln_blk_clio, ln_blk_core, ln_mixcpl,   & 
     89         &             ln_blk_mfs, ln_apr_dyn, nn_ice, nn_ice_embd, ln_dm2dc   , ln_rnf   ,   & 
     90         &             ln_ssr    , nn_isf    , nn_fwb, ln_cdgw    , ln_wave    , ln_sdw   ,   & 
     91         &             nn_lsm    , nn_limflx , nn_components, ln_cpl 
    8792      INTEGER  ::   ios 
     93      INTEGER  ::   ierr, ierr0, ierr1, ierr2, ierr3, jpm 
     94      LOGICAL  ::   ll_purecpl 
    8895      !!---------------------------------------------------------------------- 
    8996 
     
    113120          nn_ice      =   0 
    114121      ENDIF 
    115       
     122 
    116123      IF(lwp) THEN               ! Control print 
    117124         WRITE(numout,*) '        Namelist namsbc (partly overwritten with CPP key setting)' 
     
    123130         WRITE(numout,*) '              CORE bulk  formulation                     ln_blk_core = ', ln_blk_core 
    124131         WRITE(numout,*) '              MFS  bulk  formulation                     ln_blk_mfs  = ', ln_blk_mfs 
    125          WRITE(numout,*) '              coupled    formulation (T if key_sbc_cpl)  ln_cpl      = ', ln_cpl 
    126          WRITE(numout,*) '              Flux handling over ice categories          cn_iceflx   = ', TRIM (cn_iceflx) 
     132         WRITE(numout,*) '              ocean-atmosphere coupled formulation       ln_cpl      = ', ln_cpl 
     133         WRITE(numout,*) '              forced-coupled mixed formulation           ln_mixcpl   = ', ln_mixcpl 
     134         WRITE(numout,*) '              OASIS coupling (with atm or sas)           lk_oasis    = ', lk_oasis 
     135         WRITE(numout,*) '              components of your executable              nn_components = ', nn_components 
     136         WRITE(numout,*) '              Multicategory heat flux formulation (LIM3) nn_limflx   = ', nn_limflx 
    127137         WRITE(numout,*) '           Misc. options of sbc : ' 
    128138         WRITE(numout,*) '              Patm gradient added in ocean & ice Eqs.    ln_apr_dyn  = ', ln_apr_dyn 
     
    131141         WRITE(numout,*) '              daily mean to diurnal cycle qsr            ln_dm2dc    = ', ln_dm2dc  
    132142         WRITE(numout,*) '              runoff / runoff mouths                     ln_rnf      = ', ln_rnf 
     143         WRITE(numout,*) '              iceshelf formulation                       nn_isf      = ', nn_isf 
    133144         WRITE(numout,*) '              Sea Surface Restoring on SST and/or SSS    ln_ssr      = ', ln_ssr 
    134145         WRITE(numout,*) '              FreshWater Budget control  (=0/1/2)        nn_fwb      = ', nn_fwb 
     
    137148      ENDIF 
    138149 
    139       !   Flux handling over ice categories 
    140 #if defined key_coupled  
    141       SELECT CASE ( TRIM (cn_iceflx)) 
    142       CASE ('ave') 
    143          ln_iceflx_ave    = .TRUE. 
    144          ln_iceflx_linear = .FALSE. 
    145       CASE ('linear') 
    146          ln_iceflx_ave    = .FALSE. 
    147          ln_iceflx_linear = .TRUE. 
    148       CASE default 
    149          ln_iceflx_ave    = .FALSE. 
    150          ln_iceflx_linear = .FALSE. 
     150      ! LIM3 Multi-category heat flux formulation 
     151      SELECT CASE ( nn_limflx) 
     152      CASE ( -1 ) 
     153         IF(lwp) WRITE(numout,*) '              Use of per-category fluxes (nn_limflx = -1) ' 
     154      CASE ( 0  ) 
     155         IF(lwp) WRITE(numout,*) '              Average per-category fluxes (nn_limflx = 0) '  
     156      CASE ( 1  ) 
     157         IF(lwp) WRITE(numout,*) '              Average then redistribute per-category fluxes (nn_limflx = 1) ' 
     158      CASE ( 2  ) 
     159         IF(lwp) WRITE(numout,*) '              Redistribute a single flux over categories (nn_limflx = 2) ' 
    151160      END SELECT 
    152       IF(lwp) WRITE(numout,*) '              Fluxes averaged over all ice categories         ln_iceflx_ave    = ', ln_iceflx_ave 
    153       IF(lwp) WRITE(numout,*) '              Fluxes distributed linearly over ice categories ln_iceflx_linear = ', ln_iceflx_linear 
    154 #endif 
    155       ! 
    156 #if defined key_top && ! defined key_offline 
    157       ltrcdm2dc = (ln_dm2dc .AND. ln_blk_core .AND. nn_ice==2) 
    158       IF( ltrcdm2dc )THEN 
    159          IF(lwp)THEN 
    160             WRITE(numout,*)"analytical diurnal cycle, core bulk formulation and LIM2 use: " 
    161             WRITE(numout,*)"Diurnal cycle on physics but not in passive tracers" 
    162          ENDIF 
    163       ENDIF 
    164 #else  
    165       ltrcdm2dc =  .FALSE. 
    166 #endif 
    167  
    168       ! 
     161      ! 
     162      IF ( nn_components /= jp_iam_nemo .AND. .NOT. lk_oasis )   & 
     163         &      CALL ctl_stop( 'STOP', 'sbc_init : OPA-SAS coupled via OASIS, but key_oasis3 disabled' ) 
     164      IF ( nn_components == jp_iam_opa .AND. ln_cpl )   & 
     165         &      CALL ctl_stop( 'STOP', 'sbc_init : OPA-SAS coupled via OASIS, but ln_cpl = T in OPA' ) 
     166      IF ( nn_components == jp_iam_opa .AND. ln_mixcpl )   & 
     167         &      CALL ctl_stop( 'STOP', 'sbc_init : OPA-SAS coupled via OASIS, but ln_mixcpl = T in OPA' ) 
     168      IF ( ln_cpl .AND. .NOT. lk_oasis )    & 
     169         &      CALL ctl_stop( 'STOP', 'sbc_init : OASIS-coupled atmosphere model, but key_oasis3 disabled' ) 
     170      IF( ln_mixcpl .AND. .NOT. lk_oasis )    & 
     171         &      CALL ctl_stop( 'the forced-coupled mixed mode (ln_mixcpl) requires the cpp key key_oasis3' ) 
     172      IF( ln_mixcpl .AND. .NOT. ln_cpl )    & 
     173         &      CALL ctl_stop( 'the forced-coupled mixed mode (ln_mixcpl) requires ln_cpl = T' ) 
     174      IF( ln_mixcpl .AND. nn_components /= jp_iam_nemo )    & 
     175         &      CALL ctl_stop( 'the forced-coupled mixed mode (ln_mixcpl) is not yet working with sas-opa coupling via oasis' ) 
     176 
    169177      !                              ! allocate sbc arrays 
    170178      IF( sbc_oce_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'sbc_init : unable to allocate sbc_oce arrays' ) 
    171179 
    172180      !                          ! Checks: 
    173       IF( .NOT. ln_rnf ) THEN                      ! no specific treatment in vicinity of river mouths  
    174          ln_rnf_mouth  = .false.                       
    175          IF( sbc_rnf_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'sbc_init : unable to allocate sbc_rnf arrays' ) 
    176          nkrnf         = 0 
    177          rnf     (:,:) = 0.0_wp 
    178          rnf_b   (:,:) = 0.0_wp 
    179          rnfmsk  (:,:) = 0.0_wp 
    180          rnfmsk_z(:)   = 0.0_wp 
    181       ENDIF 
    182       IF( nn_ice == 0  )   fr_i(:,:) = 0.e0        ! no ice in the domain, ice fraction is always zero 
     181      IF( nn_isf .EQ. 0 ) THEN                      ! no specific treatment in vicinity of ice shelf  
     182         IF( sbc_isf_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'sbc_init : unable to allocate sbc_isf arrays' ) 
     183         fwfisf  (:,:) = 0.0_wp 
     184         fwfisf_b(:,:) = 0.0_wp 
     185      END IF 
     186      IF( nn_ice == 0 .AND. nn_components /= jp_iam_opa )   fr_i(:,:) = 0.e0 ! no ice in the domain, ice fraction is always zero 
    183187 
    184188      sfx(:,:) = 0.0_wp                            ! the salt flux due to freezing/melting will be computed (i.e. will be non-zero)  
     
    186190  
    187191      fmmflx(:,:) = 0.0_wp                        ! freezing-melting array initialisation 
     192       
     193      taum(:,:) = 0.0_wp                           ! Initialise taum for use in gls in case of reduced restart 
    188194 
    189195      !                                            ! restartability    
    190       IF( MOD( nitend - nit000 + 1, nn_fsbc) /= 0 .OR.   & 
    191           MOD( nstock             , nn_fsbc) /= 0 ) THEN  
    192          WRITE(ctmp1,*) 'experiment length (', nitend - nit000 + 1, ') or nstock (', nstock,   & 
    193             &           ' is NOT a multiple of nn_fsbc (', nn_fsbc, ')' 
    194          CALL ctl_stop( ctmp1, 'Impossible to properly do model restart' ) 
    195       ENDIF 
    196       ! 
    197       IF( MOD( rday, REAL(nn_fsbc, wp) * rdt ) /= 0 )   & 
    198          &  CALL ctl_warn( 'nn_fsbc is NOT a multiple of the number of time steps in a day' ) 
    199       ! 
    200       IF( ( nn_ice == 2 .OR. nn_ice ==3 ) .AND. .NOT.( ln_blk_clio .OR. ln_blk_core .OR. lk_cpl ) )   & 
     196      IF( ( nn_ice == 2 .OR. nn_ice ==3 ) .AND. .NOT.( ln_blk_clio .OR. ln_blk_core .OR. ln_cpl ) )   & 
    201197         &   CALL ctl_stop( 'LIM sea-ice model requires a bulk formulation or coupled configuration' ) 
    202       IF( nn_ice == 4 .AND. .NOT.( ln_blk_core .OR. lk_cpl ) )   & 
    203          &   CALL ctl_stop( 'CICE sea-ice model requires ln_blk_core or lk_cpl' ) 
     198      IF( nn_ice == 4 .AND. .NOT.( ln_blk_core .OR. ln_cpl ) )   & 
     199         &   CALL ctl_stop( 'CICE sea-ice model requires ln_blk_core or ln_cpl' ) 
    204200      IF( nn_ice == 4 .AND. lk_agrif )   & 
    205201         &   CALL ctl_stop( 'CICE sea-ice model not currently available with AGRIF' ) 
    206202      IF( ( nn_ice == 3 .OR. nn_ice == 4 ) .AND. nn_ice_embd == 0 )   & 
    207203         &   CALL ctl_stop( 'LIM3 and CICE sea-ice models require nn_ice_embd = 1 or 2' ) 
    208 #if defined key_coupled 
    209       IF( ln_iceflx_ave .AND. ln_iceflx_linear ) & 
    210          &   CALL ctl_stop( ' ln_iceflx_ave and ln_iceflx_linear options are not compatible' ) 
    211       IF( ( nn_ice ==3 .AND. lk_cpl) .AND. .NOT. ( ln_iceflx_ave .OR. ln_iceflx_linear ) ) & 
    212          &   CALL ctl_stop( ' With lim3 coupled, either ln_iceflx_ave or ln_iceflx_linear must be set to .TRUE.' ) 
    213 #endif       
     204      IF( ( nn_ice /= 3 ) .AND. ( nn_limflx >= 0 ) )   & 
     205         &   WRITE(numout,*) 'The nn_limflx>=0 option has no effect if sea ice model is not LIM3' 
     206      IF( ( nn_ice == 3 ) .AND. ( ln_cpl ) .AND. ( ( nn_limflx == -1 ) .OR. ( nn_limflx == 1 ) ) )   & 
     207         &   CALL ctl_stop( 'The chosen nn_limflx for LIM3 in coupled mode must be 0 or 2' ) 
     208      IF( ( nn_ice == 3 ) .AND. ( .NOT. ln_cpl ) .AND. ( nn_limflx == 2 ) )   & 
     209         &   CALL ctl_stop( 'The chosen nn_limflx for LIM3 in forced mode cannot be 2' ) 
     210 
    214211      IF( ln_dm2dc )   nday_qsr = -1   ! initialisation flag 
    215212 
    216       IF( ln_dm2dc .AND. .NOT.( ln_flx .OR. ln_blk_core ) )   & 
     213      IF( ln_dm2dc .AND. .NOT.( ln_flx .OR. ln_blk_core ) .AND. nn_components /= jp_iam_opa )   & 
    217214         &   CALL ctl_stop( 'diurnal cycle into qsr field from daily values requires a flux or core-bulk formulation' ) 
    218215       
    219       IF( ln_dm2dc .AND. ( ( NINT(rday) / ( nn_fsbc * NINT(rdt) ) )  < 8 ) )   & 
    220          &   CALL ctl_warn( 'diurnal cycle for qsr: the sampling of the diurnal cycle is too small...' ) 
    221  
    222216      IF ( ln_wave ) THEN 
    223217      !Activated wave module but neither drag nor stokes drift activated 
     
    233227         & asked coupling with drag coefficient (ln_cdgw =T) or Stokes drift (ln_sdw=T) ') 
    234228      ENDIF  
    235        
    236229      !                          ! Choice of the Surface Boudary Condition (set nsbc) 
     230      ll_purecpl = ln_cpl .AND. .NOT. ln_mixcpl 
     231      ! 
    237232      icpt = 0 
    238       IF( ln_ana          ) THEN   ;   nsbc =  1   ; icpt = icpt + 1   ;   ENDIF       ! analytical      formulation 
    239       IF( ln_flx          ) THEN   ;   nsbc =  2   ; icpt = icpt + 1   ;   ENDIF       ! flux            formulation 
    240       IF( ln_blk_clio     ) THEN   ;   nsbc =  3   ; icpt = icpt + 1   ;   ENDIF       ! CLIO bulk       formulation 
    241       IF( ln_blk_core     ) THEN   ;   nsbc =  4   ; icpt = icpt + 1   ;   ENDIF       ! CORE bulk       formulation 
    242       IF( ln_blk_mfs      ) THEN   ;   nsbc =  6   ; icpt = icpt + 1   ;   ENDIF       ! MFS  bulk       formulation 
    243       IF( ln_cpl          ) THEN   ;   nsbc =  5   ; icpt = icpt + 1   ;   ENDIF       ! Coupled         formulation 
    244       IF( cp_cfg == 'gyre') THEN   ;   nsbc =  0                       ;   ENDIF       ! GYRE analytical formulation 
    245       IF( lk_esopa        )            nsbc = -1                                       ! esopa test, ALL formulations 
     233      IF( ln_ana          ) THEN   ;   nsbc = jp_ana     ; icpt = icpt + 1   ;   ENDIF       ! analytical           formulation 
     234      IF( ln_flx          ) THEN   ;   nsbc = jp_flx     ; icpt = icpt + 1   ;   ENDIF       ! flux                 formulation 
     235      IF( ln_blk_clio     ) THEN   ;   nsbc = jp_clio    ; icpt = icpt + 1   ;   ENDIF       ! CLIO bulk            formulation 
     236      IF( ln_blk_core     ) THEN   ;   nsbc = jp_core    ; icpt = icpt + 1   ;   ENDIF       ! CORE bulk            formulation 
     237      IF( ln_blk_mfs      ) THEN   ;   nsbc = jp_mfs     ; icpt = icpt + 1   ;   ENDIF       ! MFS  bulk            formulation 
     238      IF( ll_purecpl      ) THEN   ;   nsbc = jp_purecpl ; icpt = icpt + 1   ;   ENDIF       ! Pure Coupled         formulation 
     239      IF( cp_cfg == 'gyre') THEN   ;   nsbc = jp_gyre                        ;   ENDIF       ! GYRE analytical      formulation 
     240      IF( nn_components == jp_iam_opa )   & 
     241         &                  THEN   ;   nsbc = jp_none    ; icpt = icpt + 1   ;   ENDIF       ! opa coupling via SAS module 
     242      IF( lk_esopa        )            nsbc = jp_esopa                                       ! esopa test, ALL formulations 
    246243      ! 
    247244      IF( icpt /= 1 .AND. .NOT.lk_esopa ) THEN 
     
    254251      IF(lwp) THEN 
    255252         WRITE(numout,*) 
    256          IF( nsbc == -1 )   WRITE(numout,*) '              ESOPA test All surface boundary conditions' 
    257          IF( nsbc ==  0 )   WRITE(numout,*) '              GYRE analytical formulation' 
    258          IF( nsbc ==  1 )   WRITE(numout,*) '              analytical formulation' 
    259          IF( nsbc ==  2 )   WRITE(numout,*) '              flux formulation' 
    260          IF( nsbc ==  3 )   WRITE(numout,*) '              CLIO bulk formulation' 
    261          IF( nsbc ==  4 )   WRITE(numout,*) '              CORE bulk formulation' 
    262          IF( nsbc ==  5 )   WRITE(numout,*) '              coupled formulation' 
    263          IF( nsbc ==  6 )   WRITE(numout,*) '              MFS Bulk formulation' 
    264       ENDIF 
    265       ! 
    266                           CALL sbc_ssm_init               ! Sea-surface mean fields initialisation 
    267       ! 
    268       IF( ln_ssr      )   CALL sbc_ssr_init               ! Sea-Surface Restoring initialisation 
    269       ! 
    270       IF( nn_ice == 4 )   CALL cice_sbc_init( nsbc )      ! CICE initialisation 
    271       ! 
     253         IF( nsbc == jp_esopa   )   WRITE(numout,*) '              ESOPA test All surface boundary conditions' 
     254         IF( nsbc == jp_gyre    )   WRITE(numout,*) '              GYRE analytical formulation' 
     255         IF( nsbc == jp_ana     )   WRITE(numout,*) '              analytical formulation' 
     256         IF( nsbc == jp_flx     )   WRITE(numout,*) '              flux formulation' 
     257         IF( nsbc == jp_clio    )   WRITE(numout,*) '              CLIO bulk formulation' 
     258         IF( nsbc == jp_core    )   WRITE(numout,*) '              CORE bulk formulation' 
     259         IF( nsbc == jp_purecpl )   WRITE(numout,*) '              pure coupled formulation' 
     260         IF( nsbc == jp_mfs     )   WRITE(numout,*) '              MFS Bulk formulation' 
     261         IF( nsbc == jp_none    )   WRITE(numout,*) '              OPA coupled to SAS via oasis' 
     262         IF( ln_mixcpl          )   WRITE(numout,*) '              + forced-coupled mixed formulation' 
     263         IF( nn_components/= jp_iam_nemo )  & 
     264            &                       WRITE(numout,*) '              + OASIS coupled SAS' 
     265      ENDIF 
     266      ! 
     267      IF( lk_oasis )   CALL sbc_cpl_init (nn_ice)   ! OASIS initialisation. must be done before: (1) first time step 
     268      !                                                     !                                            (2) the use of nn_fsbc 
     269 
     270!     nn_fsbc initialization if OPA-SAS coupling via OASIS 
     271!     sas model time step has to be declared in OASIS (mandatory) -> nn_fsbc has to be modified accordingly 
     272      IF ( nn_components /= jp_iam_nemo ) THEN 
     273 
     274         IF ( nn_components == jp_iam_opa ) nn_fsbc = cpl_freq('O_SFLX') / NINT(rdt) 
     275         IF ( nn_components == jp_iam_sas ) nn_fsbc = cpl_freq('I_SFLX') / NINT(rdt) 
     276         ! 
     277         IF(lwp)THEN 
     278            WRITE(numout,*) 
     279            WRITE(numout,*)"   OPA-SAS coupled via OASIS : nn_fsbc re-defined from OASIS namcouple ", nn_fsbc 
     280            WRITE(numout,*) 
     281         ENDIF 
     282      ENDIF 
     283 
     284      IF( MOD( nitend - nit000 + 1, nn_fsbc) /= 0 .OR.   & 
     285          MOD( nstock             , nn_fsbc) /= 0 ) THEN  
     286         WRITE(ctmp1,*) 'experiment length (', nitend - nit000 + 1, ') or nstock (', nstock,   & 
     287            &           ' is NOT a multiple of nn_fsbc (', nn_fsbc, ')' 
     288         CALL ctl_stop( ctmp1, 'Impossible to properly do model restart' ) 
     289      ENDIF 
     290      ! 
     291      IF( MOD( rday, REAL(nn_fsbc, wp) * rdt ) /= 0 )   & 
     292         &  CALL ctl_warn( 'nn_fsbc is NOT a multiple of the number of time steps in a day' ) 
     293      ! 
     294      IF( ln_dm2dc .AND. ( ( NINT(rday) / ( nn_fsbc * NINT(rdt) ) )  < 8 ) )   & 
     295         &   CALL ctl_warn( 'diurnal cycle for qsr: the sampling of the diurnal cycle is too small...' ) 
     296 
     297                               CALL sbc_ssm_init               ! Sea-surface mean fields initialisation 
     298      ! 
     299      IF( ln_ssr           )   CALL sbc_ssr_init               ! Sea-Surface Restoring initialisation 
     300      ! 
     301                               CALL sbc_rnf_init               ! Runof initialisation 
     302      ! 
     303      IF( nn_ice == 3      )   CALL sbc_lim_init               ! LIM3 initialisation 
     304 
     305      IF( nn_ice == 4      )   CALL cice_sbc_init( nsbc )      ! CICE initialisation 
     306       
    272307   END SUBROUTINE sbc_init 
    273308 
     
    309344      !                                            ! ---------------------------------------- ! 
    310345      ! 
    311       IF( ln_apr_dyn ) CALL sbc_apr( kt )                ! atmospheric pressure provided at kt+0.5*nn_fsbc 
     346      IF ( .NOT. lk_bdy ) then 
     347         IF( ln_apr_dyn ) CALL sbc_apr( kt )                ! atmospheric pressure provided at kt+0.5*nn_fsbc 
     348      ENDIF 
    312349                                                         ! (caution called before sbc_ssm) 
    313350      ! 
    314       CALL sbc_ssm( kt )                                 ! ocean sea surface variables (sst_m, sss_m, ssu_m, ssv_m) 
    315       !                                                  ! averaged over nf_sbc time-step 
     351      IF( nn_components /= jp_iam_sas )   CALL sbc_ssm( kt )   ! ocean sea surface variables (sst_m, sss_m, ssu_m, ssv_m) 
     352      !                                                        ! averaged over nf_sbc time-step 
    316353 
    317354      IF (ln_wave) CALL sbc_wave( kt ) 
     
    320357      SELECT CASE( nsbc )                                ! Compute ocean surface boundary condition 
    321358      !                                                  ! (i.e. utau,vtau, qns, qsr, emp, sfx) 
    322       CASE(  0 )   ;   CALL sbc_gyre    ( kt )                    ! analytical formulation : GYRE configuration 
    323       CASE(  1 )   ;   CALL sbc_ana     ( kt )                    ! analytical formulation : uniform sbc 
    324       CASE(  2 )   ;   CALL sbc_flx     ( kt )                    ! flux formulation 
    325       CASE(  3 )   ;   CALL sbc_blk_clio( kt )                    ! bulk formulation : CLIO for the ocean 
    326       CASE(  4 )   ;   CALL sbc_blk_core( kt )                    ! bulk formulation : CORE for the ocean 
    327       CASE(  5 )   ;   CALL sbc_cpl_rcv ( kt, nn_fsbc, nn_ice )   ! coupled formulation 
    328       CASE(  6 )   ;   CALL sbc_blk_mfs ( kt )                    ! bulk formulation : MFS for the ocean 
    329       CASE( -1 )                                 
    330                        CALL sbc_ana     ( kt )                    ! ESOPA, test ALL the formulations 
    331                        CALL sbc_gyre    ( kt )                    ! 
    332                        CALL sbc_flx     ( kt )                    ! 
    333                        CALL sbc_blk_clio( kt )                    ! 
    334                        CALL sbc_blk_core( kt )                    ! 
    335                        CALL sbc_cpl_rcv ( kt, nn_fsbc, nn_ice )   ! 
     359      CASE( jp_gyre  )   ;   CALL sbc_gyre    ( kt )                    ! analytical formulation : GYRE configuration 
     360      CASE( jp_ana   )   ;   CALL sbc_ana     ( kt )                    ! analytical formulation : uniform sbc 
     361      CASE( jp_flx   )   ;   CALL sbc_flx     ( kt )                    ! flux formulation 
     362      CASE( jp_clio  )   ;   CALL sbc_blk_clio( kt )                    ! bulk formulation : CLIO for the ocean 
     363      CASE( jp_core  )    
     364         IF( nn_components == jp_iam_sas ) & 
     365            &                CALL sbc_cpl_rcv ( kt, nn_fsbc, nn_ice )   ! OPA-SAS coupling: SAS receiving fields from OPA  
     366                             CALL sbc_blk_core( kt )                    ! bulk formulation : CORE for the ocean 
     367                                                                        ! from oce: sea surface variables (sst_m, sss_m,  ssu_m,  ssv_m) 
     368      CASE( jp_purecpl )  ;  CALL sbc_cpl_rcv ( kt, nn_fsbc, nn_ice )   ! pure coupled formulation 
     369                                                                        ! 
     370      CASE( jp_mfs   )   ;   CALL sbc_blk_mfs ( kt )                    ! bulk formulation : MFS for the ocean 
     371      CASE( jp_none  )  
     372         IF( nn_components == jp_iam_opa ) & 
     373                             CALL sbc_cpl_rcv ( kt, nn_fsbc, nn_ice )   ! OPA-SAS coupling: OPA receiving fields from SAS 
     374      CASE( jp_esopa )                                 
     375                             CALL sbc_ana     ( kt )                    ! ESOPA, test ALL the formulations 
     376                             CALL sbc_gyre    ( kt )                    ! 
     377                             CALL sbc_flx     ( kt )                    ! 
     378                             CALL sbc_blk_clio( kt )                    ! 
     379                             CALL sbc_blk_core( kt )                    ! 
     380                             CALL sbc_cpl_rcv ( kt, nn_fsbc, nn_ice )   ! 
    336381      END SELECT 
     382 
     383      IF( ln_mixcpl )        CALL sbc_cpl_rcv ( kt, nn_fsbc, nn_ice )   ! forced-coupled mixed formulation after forcing 
     384 
    337385 
    338386      !                                            !==  Misc. Options  ==! 
     
    342390      CASE(  2 )   ;         CALL sbc_ice_lim_2( kt, nsbc )          ! LIM-2 ice model 
    343391      CASE(  3 )   ;         CALL sbc_ice_lim  ( kt, nsbc )          ! LIM-3 ice model 
    344       !is it useful? 
    345392      CASE(  4 )   ;         CALL sbc_ice_cice ( kt, nsbc )          ! CICE ice model 
    346393      END SELECT                                               
    347394 
    348395      IF( ln_icebergs    )   CALL icb_stp( kt )                   ! compute icebergs 
     396 
     397      IF( nn_isf   /= 0  )   CALL sbc_isf( kt )                    ! compute iceshelves 
    349398 
    350399      IF( ln_rnf         )   CALL sbc_rnf( kt )                   ! add runoffs to fresh water fluxes 
     
    357406      !                                                           ! (update freshwater fluxes) 
    358407!RBbug do not understand why see ticket 667 
    359       !clem-bugsal CALL lbc_lnk( emp, 'T', 1. ) 
     408!clem: it looks like it is necessary for the north fold (in certain circumstances). Don't know why. 
     409      CALL lbc_lnk( emp, 'T', 1. ) 
    360410      ! 
    361411      IF( kt == nit000 ) THEN                          !   set the forcing field at nit000 - 1    ! 
     
    398448         ! CALL iom_rstput( kt, nitrst, numrow, 'qsr_b'  , qsr  ) 
    399449         CALL iom_rstput( kt, nitrst, numrow, 'emp_b'  , emp  ) 
    400          CALL iom_rstput( kt, nitrst, numrow, 'sfx_b' , sfx ) 
     450         CALL iom_rstput( kt, nitrst, numrow, 'sfx_b'  , sfx ) 
    401451      ENDIF 
    402452 
     
    413463         CALL iom_put( "qns"   , qns        )                   ! solar heat flux 
    414464         CALL iom_put( "qsr"   ,       qsr  )                   ! solar heat flux 
    415          IF( nn_ice > 0 )   CALL iom_put( "ice_cover", fr_i )   ! ice fraction  
     465         IF( nn_ice > 0 .OR. nn_components == jp_iam_opa )   CALL iom_put( "ice_cover", fr_i )   ! ice fraction  
     466         CALL iom_put( "taum"  , taum       )                   ! wind stress module  
     467         CALL iom_put( "wspd"  , wndm       )                   ! wind speed  module over free ocean or leads in presence of sea-ice 
    416468      ENDIF 
    417469      ! 
    418470      CALL iom_put( "utau", utau )   ! i-wind stress   (stress can be updated at  
    419471      CALL iom_put( "vtau", vtau )   ! j-wind stress    each time step in sea-ice) 
    420       CALL iom_put( "taum", taum )   ! wind stress module  
    421       CALL iom_put( "wspd", wndm )   ! wind speed  module  
    422472      ! 
    423473      IF(ln_ctl) THEN         ! print mean trends (used for debugging) 
    424          CALL prt_ctl(tab2d_1=fr_i             , clinfo1=' fr_i     - : ', mask1=tmask, ovlap=1 ) 
    425          CALL prt_ctl(tab2d_1=(emp-rnf)        , clinfo1=' emp-rnf  - : ', mask1=tmask, ovlap=1 ) 
    426          CALL prt_ctl(tab2d_1=(sfx-rnf)        , clinfo1=' sfx-rnf  - : ', mask1=tmask, ovlap=1 ) 
     474         CALL prt_ctl(tab2d_1=fr_i              , clinfo1=' fr_i     - : ', mask1=tmask, ovlap=1 ) 
     475         CALL prt_ctl(tab2d_1=(emp-rnf + fwfisf), clinfo1=' emp-rnf  - : ', mask1=tmask, ovlap=1 ) 
     476         CALL prt_ctl(tab2d_1=(sfx-rnf + fwfisf), clinfo1=' sfx-rnf  - : ', mask1=tmask, ovlap=1 ) 
    427477         CALL prt_ctl(tab2d_1=qns              , clinfo1=' qns      - : ', mask1=tmask, ovlap=1 ) 
    428478         CALL prt_ctl(tab2d_1=qsr              , clinfo1=' qsr      - : ', mask1=tmask, ovlap=1 ) 
  • branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/sbcrnf.F90

    r4624 r5837  
    1919   USE phycst          ! physical constants 
    2020   USE sbc_oce         ! surface boundary condition variables 
     21   USE sbcisf          ! PM we could remove it I think 
    2122   USE closea          ! closed seas 
    2223   USE fldread         ! read input field at current time step 
     
    2425   USE iom             ! I/O module 
    2526   USE lib_mpp         ! MPP library 
     27   USE eosbn2 
     28   USE wrk_nemo        ! Memory allocation 
    2629 
    2730   IMPLICIT NONE 
     
    2932 
    3033   PUBLIC   sbc_rnf       ! routine call in sbcmod module 
    31    PUBLIC   sbc_rnf_div   ! routine called in sshwzv module 
     34   PUBLIC   sbc_rnf_div   ! routine called in divcurl module 
    3235   PUBLIC   sbc_rnf_alloc ! routine call in sbcmod module 
    3336   PUBLIC   sbc_rnf_init  ! (PUBLIC for TAM) 
    3437   !                                                     !!* namsbc_rnf namelist * 
    35    CHARACTER(len=100), PUBLIC ::   cn_dir          !: Root directory for location of ssr files 
    36    LOGICAL           , PUBLIC ::   ln_rnf_depth    !: depth       river runoffs attribute specified in a file 
    37    LOGICAL           , PUBLIC ::   ln_rnf_tem      !: temperature river runoffs attribute specified in a file 
     38   CHARACTER(len=100)         ::   cn_dir          !: Root directory for location of rnf files 
     39   LOGICAL                    ::   ln_rnf_depth      !: depth       river runoffs attribute specified in a file 
     40   LOGICAL                    ::   ln_rnf_depth_ini  !: depth       river runoffs  computed at the initialisation 
     41   REAL(wp)                   ::   rn_rnf_max        !: maximum value of the runoff climatologie ( ln_rnf_depth_ini = .true ) 
     42   REAL(wp)                   ::   rn_dep_max        !: depth over which runoffs is spread ( ln_rnf_depth_ini = .true ) 
     43   INTEGER                    ::   nn_rnf_depth_file !: create (=1) a runoff depth file or not (=0) 
     44   LOGICAL                    ::   ln_rnf_tem      !: temperature river runoffs attribute specified in a file 
    3845   LOGICAL           , PUBLIC ::   ln_rnf_sal      !: salinity    river runoffs attribute specified in a file 
    39    LOGICAL           , PUBLIC ::   ln_rnf_emp      !: runoffs into a file to be read or already into precipitation 
    4046   TYPE(FLD_N)       , PUBLIC ::   sn_rnf          !: information about the runoff file to be read 
    41    TYPE(FLD_N)       , PUBLIC ::   sn_cnf          !: information about the runoff mouth file to be read 
     47   TYPE(FLD_N)               ::   sn_cnf          !: information about the runoff mouth file to be read 
    4248   TYPE(FLD_N)                ::   sn_s_rnf        !: information about the salinities of runoff file to be read 
    4349   TYPE(FLD_N)                ::   sn_t_rnf        !: information about the temperatures of runoff file to be read 
    4450   TYPE(FLD_N)                ::   sn_dep_rnf      !: information about the depth which river inflow affects 
    4551   LOGICAL           , PUBLIC ::   ln_rnf_mouth    !: specific treatment in mouths vicinity 
    46    REAL(wp)          , PUBLIC ::   rn_hrnf         !: runoffs, depth over which enhanced vertical mixing is used 
     52   REAL(wp)                  ::   rn_hrnf         !: runoffs, depth over which enhanced vertical mixing is used 
    4753   REAL(wp)          , PUBLIC ::   rn_avt_rnf      !: runoffs, value of the additional vertical mixing coef. [m2/s] 
    48    REAL(wp)          , PUBLIC ::   rn_rfact        !: multiplicative factor for runoff 
     54   REAL(wp)                   ::   rn_rfact        !: multiplicative factor for runoff 
     55 
     56   LOGICAL           , PUBLIC ::   l_rnfcpl = .false.       ! runoffs recieved from oasis 
    4957 
    5058   INTEGER , PUBLIC  ::   nkrnf = 0         !: nb of levels over which Kz is increased at river mouths 
     
    5563   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   rnf_tsc_b, rnf_tsc  !: before and now T & S runoff contents   [K.m/s & PSU.m/s]    
    5664 
    57    TYPE(FLD), PUBLIC, ALLOCATABLE, DIMENSION(:) ::   sf_rnf       ! structure: river runoff (file information, fields read) 
    58    TYPE(FLD), PUBLIC, ALLOCATABLE, DIMENSION(:) ::   sf_s_rnf     ! structure: river runoff salinity (file information, fields read)   
    59    TYPE(FLD), PUBLIC, ALLOCATABLE, DIMENSION(:) ::   sf_t_rnf     ! structure: river runoff temperature (file information, fields read)   
     65   TYPE(FLD),       ALLOCATABLE, DIMENSION(:) ::   sf_rnf       ! structure: river runoff (file information, fields read) 
     66   TYPE(FLD),       ALLOCATABLE, DIMENSION(:) ::   sf_s_rnf     ! structure: river runoff salinity (file information, fields read)   
     67   TYPE(FLD),       ALLOCATABLE, DIMENSION(:) ::   sf_t_rnf     ! structure: river runoff temperature (file information, fields read)   
    6068  
    6169   !! * Substitutions   
     
    98106      INTEGER  ::   z_err = 0 ! dummy integer for error handling 
    99107      !!---------------------------------------------------------------------- 
    100       ! 
    101       IF( kt == nit000 )   CALL sbc_rnf_init                           ! Read namelist and allocate structures 
     108      REAL(wp), DIMENSION(:,:), POINTER       ::   ztfrz   ! freezing point used for temperature correction 
     109      ! 
     110      CALL wrk_alloc( jpi,jpj, ztfrz) 
    102111 
    103112      !                                            ! ---------------------------------------- ! 
     
    109118      ENDIF 
    110119 
    111       !                                                   !-------------------! 
    112       IF( .NOT. ln_rnf_emp ) THEN                         !   Update runoff   ! 
    113          !                                                !-------------------! 
    114          ! 
    115                              CALL fld_read ( kt, nn_fsbc, sf_rnf   )    ! Read Runoffs data and provide it at kt 
    116          IF( ln_rnf_tem  )   CALL fld_read ( kt, nn_fsbc, sf_t_rnf )    ! idem for runoffs temperature if required 
    117          IF( ln_rnf_sal  )   CALL fld_read ( kt, nn_fsbc, sf_s_rnf )    ! idem for runoffs salinity    if required 
    118          ! 
    119          ! Runoff reduction only associated to the ORCA2_LIM configuration 
    120          ! when reading the NetCDF file runoff_1m_nomask.nc 
    121          IF( cp_cfg == 'orca' .AND. jp_cfg == 2 )   THEN 
    122             WHERE( 40._wp < gphit(:,:) .AND. gphit(:,:) < 65._wp ) 
    123                sf_rnf(1)%fnow(:,:,1) = 0.85 * sf_rnf(1)%fnow(:,:,1) 
     120      !                                            !-------------------! 
     121      !                                            !   Update runoff   ! 
     122      !                                            !-------------------! 
     123      ! 
     124      IF( .NOT. l_rnfcpl )   CALL fld_read ( kt, nn_fsbc, sf_rnf   )    ! Read Runoffs data and provide it at kt 
     125      IF(   ln_rnf_tem   )   CALL fld_read ( kt, nn_fsbc, sf_t_rnf )    ! idem for runoffs temperature if required 
     126      IF(   ln_rnf_sal   )   CALL fld_read ( kt, nn_fsbc, sf_s_rnf )    ! idem for runoffs salinity    if required 
     127      ! 
     128      ! Runoff reduction only associated to the ORCA2_LIM configuration 
     129      ! when reading the NetCDF file runoff_1m_nomask.nc 
     130      IF( cp_cfg == 'orca' .AND. jp_cfg == 2 .AND. .NOT. l_rnfcpl )   THEN 
     131         WHERE( 40._wp < gphit(:,:) .AND. gphit(:,:) < 65._wp ) 
     132            sf_rnf(1)%fnow(:,:,1) = 0.85 * sf_rnf(1)%fnow(:,:,1) 
     133         END WHERE 
     134      ENDIF 
     135      ! 
     136      IF( MOD( kt - 1, nn_fsbc ) == 0 ) THEN 
     137         ! 
     138         IF( .NOT. l_rnfcpl )   rnf(:,:) = rn_rfact * ( sf_rnf(1)%fnow(:,:,1) )       ! updated runoff value at time step kt 
     139         ! 
     140         !                                                     ! set temperature & salinity content of runoffs 
     141         IF( ln_rnf_tem ) THEN                                       ! use runoffs temperature data 
     142            rnf_tsc(:,:,jp_tem) = ( sf_t_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * r1_rau0 
     143            WHERE( sf_t_rnf(1)%fnow(:,:,1) == -999._wp )             ! if missing data value use SST as runoffs temperature 
     144               rnf_tsc(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * r1_rau0 
    124145            END WHERE 
    125          ENDIF 
    126          ! 
    127          IF( MOD( kt - 1, nn_fsbc ) == 0 ) THEN 
    128             ! 
    129             rnf(:,:) = rn_rfact * ( sf_rnf(1)%fnow(:,:,1) )       ! updated runoff value at time step kt 
    130             ! 
    131             !                                                     ! set temperature & salinity content of runoffs 
    132             IF( ln_rnf_tem ) THEN                                       ! use runoffs temperature data 
    133                rnf_tsc(:,:,jp_tem) = ( sf_t_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * r1_rau0 
    134                WHERE( sf_t_rnf(1)%fnow(:,:,1) == -999._wp )             ! if missing data value use SST as runoffs temperature 
    135                    rnf_tsc(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * r1_rau0 
    136                END WHERE 
    137             ELSE                                                        ! use SST as runoffs temperature 
    138                rnf_tsc(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * r1_rau0 
    139             ENDIF 
    140             !                                                           ! use runoffs salinity data 
    141             IF( ln_rnf_sal )   rnf_tsc(:,:,jp_sal) = ( sf_s_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * r1_rau0 
    142             !                                                           ! else use S=0 for runoffs (done one for all in the init) 
    143             IF ( ANY( rnf(:,:) < 0._wp ) ) z_err=1 
    144             IF(lk_mpp) CALL mpp_sum(z_err) 
    145             IF( z_err > 0 ) CALL ctl_stop( 'sbc_rnf : negative runnoff values exist' ) 
    146             ! 
    147             CALL iom_put( "runoffs", rnf )         ! output runoffs arrays 
    148          ENDIF 
    149          ! 
    150       ENDIF 
    151       ! 
     146            WHERE( sf_t_rnf(1)%fnow(:,:,1) == -222._wp )             ! where fwf comes from melting of ice shelves or iceberg 
     147               ztfrz(:,:) = -1.9 !tfreez( sss_m(:,:) ) !PM to be discuss (trouble if sensitivity study) 
     148               rnf_tsc(:,:,jp_tem) = ztfrz(:,:) * rnf(:,:) * r1_rau0 - rnf(:,:) * lfusisf * r1_rau0_rcp 
     149            END WHERE 
     150         ELSE                                                        ! use SST as runoffs temperature 
     151            rnf_tsc(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * r1_rau0 
     152         ENDIF 
     153         !                                                           ! use runoffs salinity data 
     154         IF( ln_rnf_sal )   rnf_tsc(:,:,jp_sal) = ( sf_s_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * r1_rau0 
     155         !                                                           ! else use S=0 for runoffs (done one for all in the init) 
     156         CALL iom_put( "runoffs", rnf )         ! output runoffs arrays 
     157      ENDIF 
     158      ! 
     159      !                                                ! ---------------------------------------- ! 
    152160      IF( kt == nit000 ) THEN                          !   set the forcing field at nit000 - 1    ! 
    153161         !                                             ! ---------------------------------------- ! 
     
    160168         ELSE                                                   !* no restart: set from nit000 values 
    161169            IF(lwp) WRITE(numout,*) '          nit000-1 runoff forcing fields set to nit000' 
    162              rnf_b    (:,:  ) = rnf    (:,:  ) 
    163              rnf_tsc_b(:,:,:) = rnf_tsc(:,:,:) 
     170            rnf_b    (:,:  ) = rnf    (:,:  ) 
     171            rnf_tsc_b(:,:,:) = rnf_tsc(:,:,:) 
    164172         ENDIF 
    165173      ENDIF 
     
    176184      ENDIF 
    177185      ! 
     186      CALL wrk_dealloc( jpi,jpj, ztfrz) 
     187      ! 
    178188   END SUBROUTINE sbc_rnf 
    179189 
     
    199209      zfact = 0.5_wp 
    200210      ! 
    201       IF( ln_rnf_depth ) THEN      !==   runoff distributed over several levels   ==! 
     211      IF( ln_rnf_depth .OR. ln_rnf_depth_ini ) THEN      !==   runoff distributed over several levels   ==! 
    202212         IF( lk_vvl ) THEN             ! variable volume case 
    203213            DO jj = 1, jpj                   ! update the depth over which runoffs are distributed 
     
    243253      !!---------------------------------------------------------------------- 
    244254      CHARACTER(len=32) ::   rn_dep_file   ! runoff file name 
    245       INTEGER           ::   ji, jj, jk    ! dummy loop indices 
     255      INTEGER           ::   ji, jj, jk, jm    ! dummy loop indices 
    246256      INTEGER           ::   ierror, inum  ! temporary integer 
    247257      INTEGER           ::   ios           ! Local integer output status for namelist read 
    248       ! 
    249       NAMELIST/namsbc_rnf/ cn_dir, ln_rnf_emp, ln_rnf_depth, ln_rnf_tem, ln_rnf_sal,   & 
     258      INTEGER           ::   nbrec         ! temporary integer 
     259      REAL(wp)          ::   zacoef   
     260      REAL(wp), DIMENSION(12)                 :: zrec             ! times records 
     261      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: zrnfcl     
     262      REAL(wp), DIMENSION(:,:  ), ALLOCATABLE :: zrnf 
     263      ! 
     264      NAMELIST/namsbc_rnf/ cn_dir            , ln_rnf_depth, ln_rnf_tem, ln_rnf_sal,   & 
    250265         &                 sn_rnf, sn_cnf    , sn_s_rnf    , sn_t_rnf  , sn_dep_rnf,   & 
    251          &                 ln_rnf_mouth      , rn_hrnf     , rn_avt_rnf, rn_rfact 
    252       !!---------------------------------------------------------------------- 
     266         &                 ln_rnf_mouth      , rn_hrnf     , rn_avt_rnf, rn_rfact,     & 
     267         &                 ln_rnf_depth_ini  , rn_dep_max  , rn_rnf_max, nn_rnf_depth_file 
     268      !!---------------------------------------------------------------------- 
     269      ! 
     270      !                                         !==  allocate runoff arrays 
     271      IF( sbc_rnf_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'sbc_rnf_alloc : unable to allocate arrays' ) 
     272      ! 
     273      IF( .NOT. ln_rnf ) THEN                      ! no specific treatment in vicinity of river mouths  
     274         ln_rnf_mouth  = .FALSE.                   ! default definition needed for example by sbc_ssr or by tra_adv_muscl 
     275         nkrnf         = 0 
     276         rnf     (:,:) = 0.0_wp 
     277         rnf_b   (:,:) = 0.0_wp 
     278         rnfmsk  (:,:) = 0.0_wp 
     279         rnfmsk_z(:)   = 0.0_wp 
     280         RETURN 
     281      ENDIF 
    253282      ! 
    254283      !                                   ! ============ 
     
    271300         WRITE(numout,*) '~~~~~~~ ' 
    272301         WRITE(numout,*) '   Namelist namsbc_rnf' 
    273          WRITE(numout,*) '      runoff in a file to be read                ln_rnf_emp   = ', ln_rnf_emp 
    274302         WRITE(numout,*) '      specific river mouths treatment            ln_rnf_mouth = ', ln_rnf_mouth 
    275303         WRITE(numout,*) '      river mouth additional Kz                  rn_avt_rnf   = ', rn_avt_rnf 
     
    277305         WRITE(numout,*) '      multiplicative factor for runoff           rn_rfact     = ', rn_rfact 
    278306      ENDIF 
    279       ! 
    280307      !                                   ! ================== 
    281308      !                                   !   Type of runoff 
    282309      !                                   ! ================== 
    283       !                                         !==  allocate runoff arrays 
    284       IF( sbc_rnf_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'sbc_rnf_alloc : unable to allocate arrays' ) 
    285       ! 
    286       IF( ln_rnf_emp ) THEN                     !==  runoffs directly provided in the precipitations  ==! 
    287          IF(lwp) WRITE(numout,*) 
    288          IF(lwp) WRITE(numout,*) '          runoffs directly provided in the precipitations' 
    289          IF( ln_rnf_depth .OR. ln_rnf_tem .OR. ln_rnf_sal ) THEN 
    290            CALL ctl_warn( 'runoffs already included in precipitations, so runoff (T,S, depth) attributes will not be used' ) 
    291            ln_rnf_depth = .FALSE.   ;   ln_rnf_tem = .FALSE.   ;   ln_rnf_sal = .FALSE. 
    292          ENDIF 
    293          ! 
    294       ELSE                                      !==  runoffs read in a file : set sf_rnf structure  ==! 
    295          ! 
     310      ! 
     311      IF( .NOT. l_rnfcpl ) THEN                     
    296312         ALLOCATE( sf_rnf(1), STAT=ierror )         ! Create sf_rnf structure (runoff inflow) 
    297313         IF(lwp) WRITE(numout,*) 
     
    302318         ALLOCATE( sf_rnf(1)%fnow(jpi,jpj,1)   ) 
    303319         IF( sn_rnf%ln_tint ) ALLOCATE( sf_rnf(1)%fdta(jpi,jpj,1,2) ) 
    304          !                                          ! fill sf_rnf with the namelist (sn_rnf) and control print 
    305320         CALL fld_fill( sf_rnf, (/ sn_rnf /), cn_dir, 'sbc_rnf_init', 'read runoffs data', 'namsbc_rnf' ) 
    306          ! 
    307          IF( ln_rnf_tem ) THEN                      ! Create (if required) sf_t_rnf structure 
    308             IF(lwp) WRITE(numout,*) 
    309             IF(lwp) WRITE(numout,*) '          runoffs temperatures read in a file' 
    310             ALLOCATE( sf_t_rnf(1), STAT=ierror  ) 
    311             IF( ierror > 0 ) THEN 
    312                CALL ctl_stop( 'sbc_rnf_init: unable to allocate sf_t_rnf structure' )   ;   RETURN 
    313             ENDIF 
    314             ALLOCATE( sf_t_rnf(1)%fnow(jpi,jpj,1)   ) 
    315             IF( sn_t_rnf%ln_tint ) ALLOCATE( sf_t_rnf(1)%fdta(jpi,jpj,1,2) ) 
    316             CALL fld_fill (sf_t_rnf, (/ sn_t_rnf /), cn_dir, 'sbc_rnf_init', 'read runoff temperature data', 'namsbc_rnf' ) 
    317          ENDIF 
    318          ! 
    319          IF( ln_rnf_sal  ) THEN                     ! Create (if required) sf_s_rnf and sf_t_rnf structures 
    320             IF(lwp) WRITE(numout,*) 
    321             IF(lwp) WRITE(numout,*) '          runoffs salinities read in a file' 
    322             ALLOCATE( sf_s_rnf(1), STAT=ierror  ) 
    323             IF( ierror > 0 ) THEN 
    324                CALL ctl_stop( 'sbc_rnf_init: unable to allocate sf_s_rnf structure' )   ;   RETURN 
    325             ENDIF 
    326             ALLOCATE( sf_s_rnf(1)%fnow(jpi,jpj,1)   ) 
    327             IF( sn_s_rnf%ln_tint ) ALLOCATE( sf_s_rnf(1)%fdta(jpi,jpj,1,2) ) 
    328             CALL fld_fill (sf_s_rnf, (/ sn_s_rnf /), cn_dir, 'sbc_rnf_init', 'read runoff salinity data', 'namsbc_rnf' ) 
    329          ENDIF 
    330          ! 
    331          IF( ln_rnf_depth ) THEN                    ! depth of runoffs set from a file 
    332             IF(lwp) WRITE(numout,*) 
    333             IF(lwp) WRITE(numout,*) '          runoffs depth read in a file' 
    334             rn_dep_file = TRIM( cn_dir )//TRIM( sn_dep_rnf%clname ) 
    335             IF( .NOT. sn_dep_rnf%ln_clim ) THEN   ;   WRITE(rn_dep_file, '(a,"_y",i4)' ) TRIM( rn_dep_file ), nyear    ! add year  
    336                IF( sn_dep_rnf%cltype == 'monthly' )   WRITE(rn_dep_file, '(a,"m",i2)'  ) TRIM( rn_dep_file ), nmonth   ! add month  
    337             ENDIF  
    338             CALL iom_open ( rn_dep_file, inum )                           ! open file 
    339             CALL iom_get  ( inum, jpdom_data, sn_dep_rnf%clvar, h_rnf )   ! read the river mouth array 
    340             CALL iom_close( inum )                                        ! close file 
    341             ! 
    342             nk_rnf(:,:) = 0                               ! set the number of level over which river runoffs are applied 
    343             DO jj = 1, jpj 
    344                DO ji = 1, jpi 
    345                   IF( h_rnf(ji,jj) > 0._wp ) THEN 
    346                      jk = 2 
    347                      DO WHILE ( jk /= mbkt(ji,jj) .AND. gdept_0(ji,jj,jk) < h_rnf(ji,jj) ) ;  jk = jk + 1 ;  END DO 
    348                      nk_rnf(ji,jj) = jk 
    349                   ELSEIF( h_rnf(ji,jj) == -1._wp   ) THEN   ;  nk_rnf(ji,jj) = 1 
    350                   ELSEIF( h_rnf(ji,jj) == -999._wp ) THEN   ;  nk_rnf(ji,jj) = mbkt(ji,jj) 
    351                   ELSE 
    352                      CALL ctl_stop( 'sbc_rnf_init: runoff depth not positive, and not -999 or -1, rnf value in file fort.999'  ) 
    353                      WRITE(999,*) 'ji, jj, h_rnf(ji,jj) :', ji, jj, h_rnf(ji,jj) 
    354                   ENDIF 
     321      ENDIF 
     322      ! 
     323      IF( ln_rnf_tem ) THEN                      ! Create (if required) sf_t_rnf structure 
     324         IF(lwp) WRITE(numout,*) 
     325         IF(lwp) WRITE(numout,*) '          runoffs temperatures read in a file' 
     326         ALLOCATE( sf_t_rnf(1), STAT=ierror  ) 
     327         IF( ierror > 0 ) THEN 
     328            CALL ctl_stop( 'sbc_rnf_init: unable to allocate sf_t_rnf structure' )   ;   RETURN 
     329         ENDIF 
     330         ALLOCATE( sf_t_rnf(1)%fnow(jpi,jpj,1)   ) 
     331         IF( sn_t_rnf%ln_tint ) ALLOCATE( sf_t_rnf(1)%fdta(jpi,jpj,1,2) ) 
     332         CALL fld_fill (sf_t_rnf, (/ sn_t_rnf /), cn_dir, 'sbc_rnf_init', 'read runoff temperature data', 'namsbc_rnf' ) 
     333      ENDIF 
     334      ! 
     335      IF( ln_rnf_sal  ) THEN                     ! Create (if required) sf_s_rnf and sf_t_rnf structures 
     336         IF(lwp) WRITE(numout,*) 
     337         IF(lwp) WRITE(numout,*) '          runoffs salinities read in a file' 
     338         ALLOCATE( sf_s_rnf(1), STAT=ierror  ) 
     339         IF( ierror > 0 ) THEN 
     340            CALL ctl_stop( 'sbc_rnf_init: unable to allocate sf_s_rnf structure' )   ;   RETURN 
     341         ENDIF 
     342         ALLOCATE( sf_s_rnf(1)%fnow(jpi,jpj,1)   ) 
     343         IF( sn_s_rnf%ln_tint ) ALLOCATE( sf_s_rnf(1)%fdta(jpi,jpj,1,2) ) 
     344         CALL fld_fill (sf_s_rnf, (/ sn_s_rnf /), cn_dir, 'sbc_rnf_init', 'read runoff salinity data', 'namsbc_rnf' ) 
     345      ENDIF 
     346      ! 
     347      IF( ln_rnf_depth ) THEN                    ! depth of runoffs set from a file 
     348         IF(lwp) WRITE(numout,*) 
     349         IF(lwp) WRITE(numout,*) '          runoffs depth read in a file' 
     350         rn_dep_file = TRIM( cn_dir )//TRIM( sn_dep_rnf%clname ) 
     351         IF( .NOT. sn_dep_rnf%ln_clim ) THEN   ;   WRITE(rn_dep_file, '(a,"_y",i4)' ) TRIM( rn_dep_file ), nyear    ! add year  
     352            IF( sn_dep_rnf%cltype == 'monthly' )   WRITE(rn_dep_file, '(a,"m",i2)'  ) TRIM( rn_dep_file ), nmonth   ! add month  
     353         ENDIF 
     354         CALL iom_open ( rn_dep_file, inum )                           ! open file 
     355         CALL iom_get  ( inum, jpdom_data, sn_dep_rnf%clvar, h_rnf )   ! read the river mouth array 
     356         CALL iom_close( inum )                                        ! close file 
     357         ! 
     358         nk_rnf(:,:) = 0                               ! set the number of level over which river runoffs are applied 
     359         DO jj = 1, jpj 
     360            DO ji = 1, jpi 
     361               IF( h_rnf(ji,jj) > 0._wp ) THEN 
     362                  jk = 2 
     363                  DO WHILE ( jk /= mbkt(ji,jj) .AND. gdept_0(ji,jj,jk) < h_rnf(ji,jj) ) ;  jk = jk + 1 
     364                  END DO 
     365                  nk_rnf(ji,jj) = jk 
     366               ELSEIF( h_rnf(ji,jj) == -1._wp   ) THEN   ;  nk_rnf(ji,jj) = 1 
     367               ELSEIF( h_rnf(ji,jj) == -999._wp ) THEN   ;  nk_rnf(ji,jj) = mbkt(ji,jj) 
     368               ELSE 
     369                  CALL ctl_stop( 'sbc_rnf_init: runoff depth not positive, and not -999 or -1, rnf value in file fort.999'  ) 
     370                  WRITE(999,*) 'ji, jj, h_rnf(ji,jj) :', ji, jj, h_rnf(ji,jj) 
     371               ENDIF 
     372            END DO 
     373         END DO 
     374         DO jj = 1, jpj                                ! set the associated depth 
     375            DO ji = 1, jpi 
     376               h_rnf(ji,jj) = 0._wp 
     377               DO jk = 1, nk_rnf(ji,jj) 
     378                  h_rnf(ji,jj) = h_rnf(ji,jj) + fse3t(ji,jj,jk) 
    355379               END DO 
    356380            END DO 
    357             DO jj = 1, jpj                                ! set the associated depth 
    358                DO ji = 1, jpi 
    359                   h_rnf(ji,jj) = 0._wp 
    360                   DO jk = 1, nk_rnf(ji,jj) 
    361                      h_rnf(ji,jj) = h_rnf(ji,jj) + fse3t(ji,jj,jk) 
     381         END DO 
     382         ! 
     383      ELSE IF( ln_rnf_depth_ini ) THEN           ! runoffs applied at the surface 
     384         ! 
     385         IF(lwp) WRITE(numout,*) 
     386         IF(lwp) WRITE(numout,*) '    depth of runoff computed once from max value of runoff' 
     387         IF(lwp) WRITE(numout,*) '    max value of the runoff climatologie (over global domain) rn_rnf_max = ', rn_rnf_max 
     388         IF(lwp) WRITE(numout,*) '    depth over which runoffs is spread                        rn_dep_max = ', rn_dep_max 
     389         IF(lwp) WRITE(numout,*) '     create (=1) a runoff depth file or not (=0)      nn_rnf_depth_file  = ', nn_rnf_depth_file 
     390 
     391         CALL iom_open( TRIM( sn_rnf%clname ), inum )    !  open runoff file 
     392         CALL iom_gettime( inum, zrec, kntime=nbrec) 
     393         ALLOCATE( zrnfcl(jpi,jpj,nbrec) )     ;      ALLOCATE( zrnf(jpi,jpj) ) 
     394         DO jm = 1, nbrec 
     395            CALL iom_get( inum, jpdom_data, TRIM( sn_rnf%clvar ), zrnfcl(:,:,jm), jm ) 
     396         END DO 
     397         CALL iom_close( inum ) 
     398         zrnf(:,:) = MAXVAL( zrnfcl(:,:,:), DIM=3 )   !  maximum value in time 
     399         DEALLOCATE( zrnfcl ) 
     400         ! 
     401         h_rnf(:,:) = 1. 
     402         ! 
     403         zacoef = rn_dep_max / rn_rnf_max            ! coef of linear relation between runoff and its depth (150m for max of runoff) 
     404         ! 
     405         WHERE( zrnf(:,:) > 0._wp )  h_rnf(:,:) = zacoef * zrnf(:,:)   ! compute depth for all runoffs 
     406         ! 
     407         DO jj = 1, jpj                     ! take in account min depth of ocean rn_hmin 
     408            DO ji = 1, jpi 
     409               IF( zrnf(ji,jj) > 0._wp ) THEN 
     410                  jk = mbkt(ji,jj) 
     411                  h_rnf(ji,jj) = MIN( h_rnf(ji,jj), gdept_0(ji,jj,jk ) ) 
     412               ENDIF 
     413            END DO 
     414         END DO 
     415         ! 
     416         nk_rnf(:,:) = 0                       ! number of levels on which runoffs are distributed 
     417         DO jj = 1, jpj 
     418            DO ji = 1, jpi 
     419               IF( zrnf(ji,jj) > 0._wp ) THEN 
     420                  jk = 2 
     421                  DO WHILE ( jk /= mbkt(ji,jj) .AND. gdept_0(ji,jj,jk) < h_rnf(ji,jj) ) ;  jk = jk + 1 
    362422                  END DO 
     423                  nk_rnf(ji,jj) = jk 
     424               ELSE 
     425                  nk_rnf(ji,jj) = 1 
     426               ENDIF 
     427            END DO 
     428         END DO 
     429         ! 
     430         DEALLOCATE( zrnf ) 
     431         ! 
     432         DO jj = 1, jpj                                ! set the associated depth 
     433            DO ji = 1, jpi 
     434               h_rnf(ji,jj) = 0._wp 
     435               DO jk = 1, nk_rnf(ji,jj) 
     436                  h_rnf(ji,jj) = h_rnf(ji,jj) + fse3t(ji,jj,jk) 
    363437               END DO 
    364438            END DO 
    365          ELSE                                       ! runoffs applied at the surface 
    366             nk_rnf(:,:) = 1 
    367             h_rnf (:,:) = fse3t(:,:,1) 
    368          ENDIF 
    369          ! 
     439         END DO 
     440         ! 
     441         IF( nn_rnf_depth_file == 1 ) THEN      !  save  output nb levels for runoff 
     442            IF(lwp) WRITE(numout,*) '              create runoff depht file' 
     443            CALL iom_open  ( TRIM( sn_dep_rnf%clname ), inum, ldwrt = .TRUE., kiolib = jprstlib ) 
     444            CALL iom_rstput( 0, 0, inum, 'rodepth', h_rnf ) 
     445            CALL iom_close ( inum ) 
     446         ENDIF 
     447      ELSE                                       ! runoffs applied at the surface 
     448         nk_rnf(:,:) = 1 
     449         h_rnf (:,:) = fse3t(:,:,1) 
    370450      ENDIF 
    371451      ! 
     
    388468         IF( rn_hrnf > 0._wp ) THEN 
    389469            nkrnf = 2 
    390             DO WHILE( nkrnf /= jpkm1 .AND. gdepw_1d(nkrnf+1) < rn_hrnf )   ;   nkrnf = nkrnf + 1   ;   END DO 
     470            DO WHILE( nkrnf /= jpkm1 .AND. gdepw_1d(nkrnf+1) < rn_hrnf )   ;   nkrnf = nkrnf + 1 
     471            END DO 
    391472            IF( ln_sco )   CALL ctl_warn( 'sbc_rnf: number of levels over which Kz is increased is computed for zco...' ) 
    392473         ENDIF 
  • branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/sbcssm.F90

    r4292 r5837  
    1414   USE oce             ! ocean dynamics and tracers 
    1515   USE dom_oce         ! ocean space and time domain 
    16    USE sbc_oce         ! Surface boundary condition: ocean fields 
    1716   USE sbc_oce         ! surface boundary condition: ocean fields 
    1817   USE sbcapr          ! surface boundary condition: atmospheric pressure 
    19    USE prtctl          ! Print control                    (prt_ctl routine) 
    20    USE iom 
     18   USE eosbn2          ! equation of state and related derivatives 
     19   ! 
    2120   USE in_out_manager  ! I/O manager 
     21   USE prtctl          ! Print control 
     22   USE iom             ! IOM library 
    2223 
    2324   IMPLICIT NONE 
     
    5455      INTEGER, INTENT(in) ::   kt   ! ocean time step 
    5556      ! 
     57      INTEGER  ::   ji, jj               ! loop index 
    5658      REAL(wp) ::   zcoef, zf_sbc       ! local scalar 
     59      REAL(wp), DIMENSION(jpi,jpj,jpts) :: zts 
    5760      !!--------------------------------------------------------------------- 
    58       !                                                   ! ---------------------------------------- ! 
     61 
     62      !                                        !* surface T-, U-, V- ocean level variables (T, S, depth, velocity) 
     63      DO jj = 1, jpj 
     64         DO ji = 1, jpi 
     65            zts(ji,jj,jp_tem) = tsn(ji,jj,mikt(ji,jj),jp_tem) 
     66            zts(ji,jj,jp_sal) = tsn(ji,jj,mikt(ji,jj),jp_sal) 
     67         END DO 
     68      END DO 
     69      ! 
    5970      IF( nn_fsbc == 1 ) THEN                             !   Instantaneous surface fields        ! 
    6071         !                                                ! ---------------------------------------- ! 
    6172         ssu_m(:,:) = ub(:,:,1) 
    6273         ssv_m(:,:) = vb(:,:,1) 
    63          sst_m(:,:) = tsn(:,:,1,jp_tem) 
    64          sss_m(:,:) = tsn(:,:,1,jp_sal) 
     74         IF( ln_useCT )  THEN    ;   sst_m(:,:) = eos_pt_from_ct( zts(:,:,jp_tem), zts(:,:,jp_sal) ) 
     75         ELSE                    ;   sst_m(:,:) = zts(:,:,jp_tem) 
     76         ENDIF 
     77         sss_m(:,:) = zts(:,:,jp_sal) 
    6578         !                          ! removed inverse barometer ssh when Patm forcing is used (for sea-ice dynamics) 
    6679         IF( ln_apr_dyn ) THEN   ;   ssh_m(:,:) = sshn(:,:) - 0.5 * ( ssh_ib(:,:) + ssh_ibb(:,:) ) 
     
    6881         ENDIF 
    6982         ! 
    70          IF( lk_vvl )   fse3t_m(:,:) = fse3t_n(:,:,1) 
     83         IF( lk_vvl )   e3t_m(:,:) = fse3t_n(:,:,1) 
     84         ! 
     85         frq_m(:,:) = fraqsr_1lev(:,:) 
    7186         ! 
    7287      ELSE 
     
    7994            ssu_m(:,:) = zcoef * ub(:,:,1) 
    8095            ssv_m(:,:) = zcoef * vb(:,:,1) 
    81             sst_m(:,:) = zcoef * tsn(:,:,1,jp_tem) 
    82             sss_m(:,:) = zcoef * tsn(:,:,1,jp_sal) 
    83             !                          ! removed inverse barometer ssh when Patm forcing is used  
     96            IF( ln_useCT )  THEN    ;   sst_m(:,:) = zcoef * eos_pt_from_ct( zts(:,:,jp_tem), zts(:,:,jp_sal) ) 
     97            ELSE                    ;   sst_m(:,:) = zcoef * zts(:,:,jp_tem) 
     98            ENDIF 
     99            sss_m(:,:) = zcoef * zts(:,:,jp_sal) 
     100            !                          ! removed inverse barometer ssh when Patm forcing is used (for sea-ice dynamics) 
    84101            IF( ln_apr_dyn ) THEN   ;   ssh_m(:,:) = zcoef * ( sshn(:,:) - 0.5 * ( ssh_ib(:,:) + ssh_ibb(:,:) ) ) 
    85             ELSE                    ;   ssh_m(:,:) = zcoef *   sshn(:,:) 
    86             ENDIF 
    87             IF( lk_vvl )   fse3t_m(:,:) = zcoef * fse3t_n(:,:,1) 
     102            ELSE                    ;   ssh_m(:,:) = zcoef * sshn(:,:) 
     103            ENDIF 
     104            ! 
     105            IF( lk_vvl )   e3t_m(:,:) = zcoef * fse3t_n(:,:,1) 
     106            ! 
     107            frq_m(:,:) = zcoef * fraqsr_1lev(:,:) 
    88108            !                                             ! ---------------------------------------- ! 
    89109         ELSEIF( MOD( kt - 2 , nn_fsbc ) == 0 ) THEN      !   Initialisation: New mean computation   ! 
     
    94114            sss_m(:,:) = 0.e0 
    95115            ssh_m(:,:) = 0.e0 
    96             IF( lk_vvl )   fse3t_m(:,:) = 0.e0 
     116            IF( lk_vvl )   e3t_m(:,:) = 0.e0 
     117            frq_m(:,:) = 0.e0 
    97118         ENDIF 
    98119         !                                                ! ---------------------------------------- ! 
     
    101122         ssu_m(:,:) = ssu_m(:,:) + ub(:,:,1) 
    102123         ssv_m(:,:) = ssv_m(:,:) + vb(:,:,1) 
    103          sst_m(:,:) = sst_m(:,:) + tsn(:,:,1,jp_tem) 
    104          sss_m(:,:) = sss_m(:,:) + tsn(:,:,1,jp_sal) 
     124         IF( ln_useCT )  THEN    ;   sst_m(:,:) = sst_m(:,:) + eos_pt_from_ct( zts(:,:,jp_tem), zts(:,:,jp_sal) ) 
     125         ELSE                    ;   sst_m(:,:) = sst_m(:,:) + zts(:,:,jp_tem) 
     126         ENDIF 
     127         sss_m(:,:) = sss_m(:,:) + zts(:,:,jp_sal) 
    105128         !                          ! removed inverse barometer ssh when Patm forcing is used (for sea-ice dynamics) 
    106          IF( ln_apr_dyn ) THEN   ;   ssh_m(:,:) = ssh_m(:,:) + sshn(:,:) - 0.5 *  ( ssh_ib(:,:) + ssh_ibb(:,:) ) 
     129         IF( ln_apr_dyn ) THEN   ;   ssh_m(:,:) = ssh_m(:,:) + sshn(:,:) - 0.5 * ( ssh_ib(:,:) + ssh_ibb(:,:) ) 
    107130         ELSE                    ;   ssh_m(:,:) = ssh_m(:,:) + sshn(:,:) 
    108131         ENDIF 
    109          IF( lk_vvl )   fse3t_m(:,:) = fse3t_m(:,:) + fse3t_n(:,:,1) 
     132         ! 
     133         IF( lk_vvl )   e3t_m(:,:) = fse3t_m(:,:) + fse3t_n(:,:,1) 
     134         ! 
     135         frq_m(:,:) =   frq_m(:,:) + fraqsr_1lev(:,:) 
    110136 
    111137         !                                                ! ---------------------------------------- ! 
     
    118144            ssv_m(:,:) = ssv_m(:,:) * zcoef           ! 
    119145            ssh_m(:,:) = ssh_m(:,:) * zcoef           ! mean SSH             [m] 
    120             IF( lk_vvl )   fse3t_m(:,:) = fse3t_m(:,:) * zcoef   ! mean vertical scale factor [m] 
     146            IF( lk_vvl )   e3t_m(:,:) = fse3t_m(:,:) * zcoef   ! mean vertical scale factor [m] 
     147            frq_m(:,:) = frq_m(:,:) * zcoef   ! mean fraction of solar net radiation absorbed in the 1st T level [-] 
    121148            ! 
    122149         ENDIF 
     
    135162            CALL iom_rstput( kt, nitrst, numrow, 'sss_m'  , sss_m  ) 
    136163            CALL iom_rstput( kt, nitrst, numrow, 'ssh_m'  , ssh_m  ) 
    137             IF( lk_vvl ) THEN 
    138                CALL iom_rstput( kt, nitrst, numrow, 'fse3t_m'  , fse3t_m(:,:)  ) 
    139             END IF 
    140             ! 
    141          ENDIF 
    142          ! 
     164            IF( lk_vvl )   CALL iom_rstput( kt, nitrst, numrow, 'e3t_m'  , e3t_m  ) 
     165            CALL iom_rstput( kt, nitrst, numrow, 'frq_m'  , frq_m  ) 
     166            ! 
     167         ENDIF 
     168         ! 
     169      ENDIF 
     170      ! 
     171      IF( MOD( kt - 1 , nn_fsbc ) == 0 ) THEN          !   Mean value at each nn_fsbc time-step   ! 
     172         CALL iom_put( 'ssu_m', ssu_m ) 
     173         CALL iom_put( 'ssv_m', ssv_m ) 
     174         CALL iom_put( 'sst_m', sst_m ) 
     175         CALL iom_put( 'sss_m', sss_m ) 
     176         CALL iom_put( 'ssh_m', ssh_m ) 
     177         IF( lk_vvl )   CALL iom_put( 'e3t_m', e3t_m ) 
     178         CALL iom_put( 'frq_m', frq_m ) 
    143179      ENDIF 
    144180      ! 
     
    176212            CALL iom_get( numror, jpdom_autoglo, 'sss_m'  , sss_m  )   !   "         "    salinity    (T-point) 
    177213            CALL iom_get( numror, jpdom_autoglo, 'ssh_m'  , ssh_m  )   !   "         "    height      (T-point) 
    178             IF( lk_vvl ) CALL iom_get( numror, jpdom_autoglo, 'fse3t_m', fse3t_m(:,:) ) 
     214            IF( lk_vvl ) CALL iom_get( numror, jpdom_autoglo, 'e3t_m', e3t_m ) 
     215            ! fraction of solar net radiation absorbed in 1st T level 
     216            IF( iom_varid( numror, 'frq_m', ldstop = .FALSE. ) > 0 ) THEN 
     217               CALL iom_get( numror, jpdom_autoglo, 'frq_m'  , frq_m  ) 
     218            ELSE 
     219               frq_m(:,:) = 1._wp   ! default definition 
     220            ENDIF 
    179221            ! 
    180222            IF( zf_sbc /= REAL( nn_fsbc, wp ) ) THEN      ! nn_fsbc has changed between 2 runs 
     
    187229               sss_m(:,:) = zcoef * sss_m(:,:) 
    188230               ssh_m(:,:) = zcoef * ssh_m(:,:) 
    189                IF( lk_vvl ) fse3t_m(:,:) = zcoef * fse3t_m(:,:) 
     231               IF( lk_vvl )   e3t_m(:,:) = zcoef * fse3t_m(:,:) 
     232               frq_m(:,:) = zcoef * frq_m(:,:) 
    190233            ELSE 
    191234               IF(lwp) WRITE(numout,*) '~~~~~~~   mean fields read in the ocean restart file' 
     
    194237      ENDIF 
    195238      ! 
     239      IF( .NOT. l_ssm_mean ) THEN   ! default initialisation. needed by lim_istate 
     240         ! 
     241         IF(lwp) WRITE(numout,*) '          default initialisation of ss?_m arrays' 
     242         ssu_m(:,:) = ub(:,:,1) 
     243         ssv_m(:,:) = vb(:,:,1) 
     244         IF( ln_useCT )  THEN    ;   sst_m(:,:) = eos_pt_from_ct( tsn(:,:,1,jp_tem), tsn(:,:,1,jp_sal) ) 
     245         ELSE                    ;   sst_m(:,:) = tsn(:,:,1,jp_tem) 
     246         ENDIF 
     247         sss_m(:,:) = tsn(:,:,1,jp_sal) 
     248         ssh_m(:,:) = sshn(:,:) 
     249         IF( lk_vvl )   e3t_m(:,:) = fse3t_n(:,:,1) 
     250         frq_m(:,:) = 1._wp 
     251         ! 
     252      ENDIF 
     253      ! 
    196254   END SUBROUTINE sbc_ssm_init 
    197255 
  • branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/sbcssr.F90

    r4624 r5837  
    1010   !!---------------------------------------------------------------------- 
    1111   !!   sbc_ssr       : add to sbc a restoring term toward SST/SSS climatology 
     12   !!   sbc_ssr_init  : initialisation of surface restoring 
    1213   !!---------------------------------------------------------------------- 
    1314   USE oce            ! ocean dynamics and tracers 
     
    1617   USE phycst         ! physical constants 
    1718   USE sbcrnf         ! surface boundary condition : runoffs 
     19   ! 
    1820   USE fldread        ! read input fields 
    1921   USE iom            ! I/O manager 
     
    9395            ! 
    9496            IF( nn_sstr == 1 ) THEN                                   !* Temperature restoring term 
    95 !CDIR COLLAPSE 
    9697               DO jj = 1, jpj 
    9798                  DO ji = 1, jpi 
  • branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/sbctide.F90

    • Property svn:keywords set to Id
    r4292 r5837  
    3636   !!---------------------------------------------------------------------- 
    3737   !! NEMO/OPA 3.5 , NEMO Consortium (2013) 
    38    !! $Id: $ 
     38   !! $Id$ 
    3939   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
    4040   !!---------------------------------------------------------------------- 
  • branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/sbcwave.F90

    • Property svn:keywords set to Id
    r4624 r5837  
    3939   !!---------------------------------------------------------------------- 
    4040   !! NEMO/OPA 4.0 , NEMO Consortium (2011)  
    41    !! $Id: $ 
     41   !! $Id$ 
    4242   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
    4343   !!---------------------------------------------------------------------- 
  • branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/tide_mod.F90

    • Property svn:keywords set to Id
    r4292 r5837  
    3535   !!---------------------------------------------------------------------- 
    3636   !! NEMO/OPA 3.3 , LOCEAN-IPSL (2010)  
    37    !! $Id:$  
     37   !! $Id$  
    3838   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 
    3939   !!---------------------------------------------------------------------- 
  • branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/tideini.F90

    • Property svn:keywords set to Id
    r4624 r5837  
    3636   !!---------------------------------------------------------------------- 
    3737   !! NEMO/OPA 3.5 , NEMO Consortium (2013) 
    38    !! $Id: $ 
     38   !! $Id$ 
    3939   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
    4040   !!---------------------------------------------------------------------- 
     
    8080          END DO 
    8181       END DO 
     82       !        
     83       ! Ensure that tidal components have been set in namelist_cfg 
     84       IF( nb_harmo .EQ. 0 ) CALL ctl_stop( 'tide_init : No tidal components set in nam_tide' ) 
    8285       ! 
    8386       IF(lwp) THEN 
  • branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/SBC/updtide.F90

    • Property svn:keywords set to Id
    r4292 r5837  
    2626   !!---------------------------------------------------------------------- 
    2727   !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
    28    !! $Id: sbcfwb.F90 3625 2012-11-21 13:19:18Z acc $ 
     28   !! $Id$ 
    2929   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
    3030   !!---------------------------------------------------------------------- 
Note: See TracChangeset for help on using the changeset viewer.