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 4790 for branches/2014/dev_r4765_CNRS_agrif/NEMOGCM/NEMO/NST_SRC/agrif_lim2_interp.F90 – NEMO

Ignore:
Timestamp:
2014-09-25T21:14:43+02:00 (10 years ago)
Author:
rblod
Message:

dev_r4765_CNRS_agrif : update AGRIF for LIM2

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2014/dev_r4765_CNRS_agrif/NEMOGCM/NEMO/NST_SRC/agrif_lim2_interp.F90

    r4785 r4790  
    99   !!            3.4   !  09-2012  (R. Benshila, C. Herbaut) update and EVP 
    1010   !!---------------------------------------------------------------------- 
    11 #undef toto 
    1211#if defined key_agrif && defined key_lim2  
    1312   !!---------------------------------------------------------------------- 
     
    4241   PUBLIC interp_adv_ice 
    4342 
     43   REAL(wp), DIMENSION(:,:)  , ALLOCATABLE, PRIVATE :: uice_agr, vice_agr 
     44   REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, PRIVATE :: tabice_agr  
     45 
     46 
    4447   !!---------------------------------------------------------------------- 
    4548   !! NEMO/NST 3.4 , NEMO Consortium (2012) 
     
    6669      u_ice_nst(:,:) = 0. 
    6770      v_ice_nst(:,:) = 0. 
    68 #undef toto 
    69 #ifdef toto 
    70       CALL Agrif_Bc_variable( u_ice_nst, u_ice_id ,procname=interp_u_ice, calledweight=1. ) 
    71       CALL Agrif_Bc_variable( v_ice_nst, v_ice_id ,procname=interp_v_ice, calledweight=1. ) 
    72 #endif 
     71      CALL Agrif_Bc_variable( u_ice_id ,procname=interp_u_ice, calledweight=1. ) 
     72      CALL Agrif_Bc_variable( v_ice_id ,procname=interp_v_ice, calledweight=1. ) 
    7373      Agrif_SpecialValue=0. 
    7474      Agrif_UseSpecialValue = .FALSE. 
     
    142142      !!  we are in inside a new parent ice time step 
    143143      !!----------------------------------------------------------------------- 
    144       REAL(wp), DIMENSION(jpi,jpj) :: zuice, zvice 
    145144      INTEGER :: ji,jj 
    146145      REAL(wp) :: zrhox, zrhoy 
     
    159158         Agrif_SpecialValue=-9999. 
    160159         Agrif_UseSpecialValue = .TRUE. 
    161          zuice = 0. 
    162          zvice = 0. 
    163 #undef toto 
    164 #ifdef toto 
    165          CALL Agrif_Bc_variable(zuice,u_ice_id,procname=interp_u_ice, calledweight=1.) 
    166          CALL Agrif_Bc_variable(zvice,v_ice_id,procname=interp_v_ice, calledweight=1.) 
    167 #endif 
     160         IF( .NOT. ALLOCATED(uice_agr) )THEN 
     161            ALLOCATE(uice_agr(jpi,jpj), vice_agr(jpi,jpj)) 
     162         ENDIF 
     163         uice_agr = 0. 
     164         vice_agr = 0. 
     165         CALL Agrif_Bc_variable(u_ice_id,procname=interp_u_ice, calledweight=1.) 
     166         CALL Agrif_Bc_variable(v_ice_id,procname=interp_v_ice, calledweight=1.) 
    168167         Agrif_SpecialValue=0. 
    169168         Agrif_UseSpecialValue = .FALSE. 
    170169         !   
    171170         zrhox = agrif_rhox() ;    zrhoy = agrif_rhoy()       
    172          zuice(:,:) =  zuice(:,:)/(zrhoy*e2u(:,:))*umask(:,:,1) 
    173          zvice(:,:) =  zvice(:,:)/(zrhox*e1v(:,:))*vmask(:,:,1) 
     171         uice_agr(:,:) =  uice_agr(:,:)/(zrhoy*e2u(:,:))*umask(:,:,1) 
     172         vice_agr(:,:) =  vice_agr(:,:)/(zrhox*e1v(:,:))*vmask(:,:,1) 
    174173         ! fill  boundaries 
    175174         DO jj = 1, jpj 
    176175            DO ji = 1, 2 
    177                u_ice_oe(ji,  jj,2) = zuice(ji       ,jj)  
    178                u_ice_oe(ji+2,jj,2) = zuice(nlci+ji-3,jj) 
     176               u_ice_oe(ji,  jj,2) = uice_agr(ji       ,jj)  
     177               u_ice_oe(ji+2,jj,2) = uice_agr(nlci+ji-3,jj) 
    179178            END DO 
    180179         END DO 
    181180         DO jj = 1, jpj 
    182             v_ice_oe(2,jj,2) = zvice(2     ,jj)  
    183             v_ice_oe(4,jj,2) = zvice(nlci-1,jj) 
     181            v_ice_oe(2,jj,2) = vice_agr(2     ,jj)  
     182            v_ice_oe(4,jj,2) = vice_agr(nlci-1,jj) 
    184183         END DO 
    185184         DO ji = 1, jpi 
    186             u_ice_sn(ji,2,2) = zuice(ji,2     )  
    187             u_ice_sn(ji,4,2) = zuice(ji,nlcj-1) 
     185            u_ice_sn(ji,2,2) = uice_agr(ji,2     )  
     186            u_ice_sn(ji,4,2) = uice_agr(ji,nlcj-1) 
    188187         END DO 
    189188         DO jj = 1, 2 
    190189            DO ji = 1, jpi 
    191                v_ice_sn(ji,jj  ,2) = zvice(ji,jj       )  
    192                v_ice_sn(ji,jj+2,2) = zvice(ji,nlcj+jj-3) 
     190               v_ice_sn(ji,jj  ,2) = vice_agr(ji,jj       )  
     191               v_ice_sn(ji,jj+2,2) = vice_agr(ji,nlcj+jj-3) 
    193192            END DO 
    194193         END DO 
     
    341340      !!  we are in inside a new parent ice time step 
    342341     !!----------------------------------------------------------------------- 
    343       REAL(wp), DIMENSION(jpi,jpj,7) :: ztab  
    344342      INTEGER :: ji,jj,jn 
    345343      !!----------------------------------------------------------------------- 
     
    352350         adv_ice_sn(:,:,:,1) =  adv_ice_sn(:,:,:,2) 
    353351         ! interpolation of boundaries 
    354          ztab(:,:,:) = 0. 
     352         IF(.NOT.ALLOCATED(tabice_agr))THEN 
     353            ALLOCATE(tabice_agr(jpi,jpj,7))    
     354         ENDIF 
     355         tabice_agr(:,:,:) = 0. 
    355356         Agrif_SpecialValue=-9999. 
    356357         Agrif_UseSpecialValue = .TRUE. 
    357 #undef toto 
    358 #ifdef toto 
    359          CALL Agrif_Bc_variable( ztab, adv_ice_id ,procname=interp_adv_ice,calledweight=1. ) 
    360 #endif 
     358         CALL Agrif_Bc_variable( adv_ice_id ,procname=interp_adv_ice,calledweight=1. ) 
    361359         Agrif_SpecialValue=0. 
    362360         Agrif_UseSpecialValue = .FALSE. 
     
    366364            DO jj = 1, jpj 
    367365               DO ji=1,2 
    368                   adv_ice_oe(ji  ,jj,jn,2) = ztab(ji       ,jj,jn)  
    369                   adv_ice_oe(ji+2,jj,jn,2) = ztab(nlci-2+ji,jj,jn) 
     366                  adv_ice_oe(ji  ,jj,jn,2) = tabice_agr(ji       ,jj,jn)  
     367                  adv_ice_oe(ji+2,jj,jn,2) = tabice_agr(nlci-2+ji,jj,jn) 
    370368               END DO 
    371369            END DO 
     
    375373            Do jj =1,2 
    376374               DO ji = 1, jpi 
    377                   adv_ice_sn(ji,jj  ,jn,2) = ztab(ji,jj       ,jn)  
    378                   adv_ice_sn(ji,jj+2,jn,2) = ztab(ji,nlcj-2+jj,jn) 
     375                  adv_ice_sn(ji,jj  ,jn,2) = tabice_agr(ji,jj       ,jn)  
     376                  adv_ice_sn(ji,jj+2,jn,2) = tabice_agr(ji,nlcj-2+jj,jn) 
    379377               END DO 
    380378            END DO 
     
    394392      INTEGER :: ji,jj,jn 
    395393      REAL(wp) :: zalpha 
    396       REAL(wp), DIMENSION(jpi,jpj,7) :: ztab  
     394      REAL(wp), DIMENSION(jpi,jpj,7) :: tabice_agr  
    397395      !!-----------------------------------------------------------------------       
    398396      ! 
     
    401399      zalpha = REAL(lim_nbstep,wp) / (Agrif_Rhot()*Agrif_PArent(nn_fsbc)/REAL(nn_fsbc)) 
    402400      ! 
    403       ztab(:,:,:) = 0.e0 
     401      tabice_agr(:,:,:) = 0.e0 
    404402      DO jn =1,7 
    405403         DO jj =1,2 
    406404            DO ji = 1, jpi 
    407                ztab(ji,jj        ,jn) = (1-zalpha)*adv_ice_sn(ji,jj  ,jn,1) + zalpha*adv_ice_sn(ji,jj  ,jn,2)  
    408                ztab(ji,nlcj-2+jj ,jn) = (1-zalpha)*adv_ice_sn(ji,jj+2,jn,1) + zalpha*adv_ice_sn(ji,jj+2,jn,2)  
     405               tabice_agr(ji,jj        ,jn) = (1-zalpha)*adv_ice_sn(ji,jj  ,jn,1) + zalpha*adv_ice_sn(ji,jj  ,jn,2)  
     406               tabice_agr(ji,nlcj-2+jj ,jn) = (1-zalpha)*adv_ice_sn(ji,jj+2,jn,1) + zalpha*adv_ice_sn(ji,jj+2,jn,2)  
    409407            END DO 
    410408         END DO 
     
    414412         DO jj = 1, jpj 
    415413            DO ji=1,2 
    416                ztab(ji       ,jj,jn) = (1-zalpha)*adv_ice_oe(ji  ,jj,jn,1) + zalpha*adv_ice_oe(ji  ,jj,jn,2)  
    417                ztab(nlci-2+ji,jj,jn) = (1-zalpha)*adv_ice_oe(ji+2,jj,jn,1) + zalpha*adv_ice_oe(ji+2,jj,jn,2)  
     414               tabice_agr(ji       ,jj,jn) = (1-zalpha)*adv_ice_oe(ji  ,jj,jn,1) + zalpha*adv_ice_oe(ji  ,jj,jn,2)  
     415               tabice_agr(nlci-2+ji,jj,jn) = (1-zalpha)*adv_ice_oe(ji+2,jj,jn,1) + zalpha*adv_ice_oe(ji+2,jj,jn,2)  
    418416            END DO 
    419417         END DO 
    420418      END DO 
    421419      ! 
    422       CALL parcoursT( ztab(:,:, 1), frld  ) 
    423       CALL parcoursT( ztab(:,:, 2), hicif ) 
    424       CALL parcoursT( ztab(:,:, 3), hsnif ) 
    425       CALL parcoursT( ztab(:,:, 4), tbif(:,:,1) ) 
    426       CALL parcoursT( ztab(:,:, 5), tbif(:,:,2) ) 
    427       CALL parcoursT( ztab(:,:, 6), tbif(:,:,3) ) 
    428       CALL parcoursT( ztab(:,:, 7), qstoif ) 
     420      CALL parcoursT( tabice_agr(:,:, 1), frld  ) 
     421      CALL parcoursT( tabice_agr(:,:, 2), hicif ) 
     422      CALL parcoursT( tabice_agr(:,:, 3), hsnif ) 
     423      CALL parcoursT( tabice_agr(:,:, 4), tbif(:,:,1) ) 
     424      CALL parcoursT( tabice_agr(:,:, 5), tbif(:,:,2) ) 
     425      CALL parcoursT( tabice_agr(:,:, 6), tbif(:,:,3) ) 
     426      CALL parcoursT( tabice_agr(:,:, 7), qstoif ) 
    429427      ! 
    430428   END SUBROUTINE agrif_trp_lim2 
     
    509507 
    510508 
    511    SUBROUTINE interp_u_ice( tabres, i1, i2, j1, j2 ) 
     509   SUBROUTINE interp_u_ice( tabres, i1, i2, j1, j2, before ) 
    512510      !!----------------------------------------------------------------------- 
    513511      !!                     *** ROUTINE interp_u_ice *** 
     
    515513      INTEGER, INTENT(in) :: i1, i2, j1, j2 
    516514      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 
     515      LOGICAL, INTENT(in) :: before 
    517516      !! 
    518517      INTEGER :: ji,jj 
     
    520519      ! 
    521520#if defined key_lim2_vp 
    522       DO jj=MAX(j1,2),j2 
    523          DO ji=MAX(i1,2),i2 
    524             IF( tmu(ji,jj) == 0. ) THEN 
    525                tabres(ji,jj) = -9999. 
    526             ELSE 
    527                tabres(ji,jj) = e2f(ji-1,jj-1) * u_ice(ji,jj) 
    528             ENDIF 
    529          END DO 
    530       END DO 
     521      IF( before ) THEN 
     522         DO jj=MAX(j1,2),j2 
     523            DO ji=MAX(i1,2),i2 
     524               IF( tmu(ji,jj) == 0. ) THEN 
     525                  tabres(ji,jj) = -9999. 
     526               ELSE 
     527                  tabres(ji,jj) = e2f(ji-1,jj-1) * u_ice(ji,jj) 
     528               ENDIF 
     529            END DO 
     530         END DO 
     531      ENDIF 
    531532#else 
    532       DO jj= j1, j2 
    533          DO ji= i1, i2 
    534             IF( umask(ji,jj,1) == 0. ) THEN 
    535                tabres(ji,jj) = -9999. 
    536             ELSE 
    537                tabres(ji,jj) = e2u(ji,jj) * u_ice(ji,jj) 
    538             ENDIF 
    539          END DO 
    540       END DO 
     533      IF( before ) THEN 
     534         DO jj= j1, j2 
     535            DO ji= i1, i2 
     536               IF( umask(ji,jj,1) == 0. ) THEN 
     537                  tabres(ji,jj) = -9999. 
     538               ELSE 
     539                  tabres(ji,jj) = e2u(ji,jj) * u_ice(ji,jj) 
     540               ENDIF 
     541            END DO 
     542         END DO 
     543      ENDIF 
    541544#endif 
    542545   END SUBROUTINE interp_u_ice 
    543546 
    544547 
    545    SUBROUTINE interp_v_ice( tabres, i1, i2, j1, j2 ) 
     548   SUBROUTINE interp_v_ice( tabres, i1, i2, j1, j2, before ) 
    546549      !!----------------------------------------------------------------------- 
    547550      !!                    *** ROUTINE interp_v_ice *** 
     
    549552      INTEGER, INTENT(in) :: i1, i2, j1, j2 
    550553      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 
     554      LOGICAL, INTENT(in) :: before 
    551555      !! 
    552556      INTEGER :: ji, jj 
     
    554558      ! 
    555559#if defined key_lim2_vp 
    556       DO jj=MAX(j1,2),j2 
    557          DO ji=MAX(i1,2),i2 
    558             IF( tmu(ji,jj) == 0. ) THEN 
    559                tabres(ji,jj) = -9999. 
    560             ELSE 
    561                tabres(ji,jj) = e1f(ji-1,jj-1) * v_ice(ji,jj) 
    562             ENDIF 
    563          END DO 
    564       END DO 
     560      IF( before ) THEN 
     561         DO jj=MAX(j1,2),j2 
     562            DO ji=MAX(i1,2),i2 
     563               IF( tmu(ji,jj) == 0. ) THEN 
     564                  tabres(ji,jj) = -9999. 
     565               ELSE 
     566                  tabres(ji,jj) = e1f(ji-1,jj-1) * v_ice(ji,jj) 
     567               ENDIF 
     568            END DO 
     569         END DO 
     570      ENDIF    
    565571#else 
    566       DO jj= j1 ,j2 
    567          DO ji = i1, i2 
    568             IF( vmask(ji,jj,1) == 0. ) THEN 
    569                tabres(ji,jj) = -9999. 
    570             ELSE 
    571                tabres(ji,jj) = e1v(ji,jj) * v_ice(ji,jj) 
    572             ENDIF 
    573          END DO 
    574       END DO 
     572      IF( before ) THEN 
     573         DO jj= j1 ,j2 
     574            DO ji = i1, i2 
     575               IF( vmask(ji,jj,1) == 0. ) THEN 
     576                  tabres(ji,jj) = -9999. 
     577               ELSE 
     578                  tabres(ji,jj) = e1v(ji,jj) * v_ice(ji,jj) 
     579               ENDIF 
     580            END DO 
     581         END DO 
     582      ENDIF 
    575583#endif 
    576584   END SUBROUTINE interp_v_ice 
    577585 
    578586 
    579    SUBROUTINE interp_adv_ice( tabres, i1, i2, j1, j2 ) 
     587   SUBROUTINE interp_adv_ice( tabres, i1, i2, j1, j2, before ) 
    580588      !!----------------------------------------------------------------------- 
    581589      !!                    *** ROUTINE interp_adv_ice ***                            
     
    587595      INTEGER, INTENT(in) :: i1, i2, j1, j2 
    588596      REAL(wp), DIMENSION(i1:i2,j1:j2,7), INTENT(inout) :: tabres 
     597      LOGICAL, INTENT(in) :: before 
    589598      !! 
    590599      INTEGER :: ji, jj, jk 
    591600      !!----------------------------------------------------------------------- 
    592601      ! 
    593       DO jj=j1,j2 
    594          DO ji=i1,i2 
    595             IF( tms(ji,jj) == 0. ) THEN 
    596                tabres(ji,jj,:) = -9999.  
    597             ELSE 
    598                tabres(ji,jj, 1) = frld  (ji,jj) 
    599                tabres(ji,jj, 2) = hicif (ji,jj) 
    600                tabres(ji,jj, 3) = hsnif (ji,jj) 
    601                tabres(ji,jj, 4) = tbif  (ji,jj,1) 
    602                tabres(ji,jj, 5) = tbif  (ji,jj,2) 
    603                tabres(ji,jj, 6) = tbif  (ji,jj,3) 
    604                tabres(ji,jj, 7) = qstoif(ji,jj) 
    605             ENDIF 
    606          END DO 
    607       END DO 
     602      IF( before ) THEN 
     603         DO jj=j1,j2 
     604            DO ji=i1,i2 
     605               IF( tms(ji,jj) == 0. ) THEN 
     606                  tabres(ji,jj,:) = -9999.  
     607               ELSE 
     608                  tabres(ji,jj, 1) = frld  (ji,jj) 
     609                  tabres(ji,jj, 2) = hicif (ji,jj) 
     610                  tabres(ji,jj, 3) = hsnif (ji,jj) 
     611                  tabres(ji,jj, 4) = tbif  (ji,jj,1) 
     612                  tabres(ji,jj, 5) = tbif  (ji,jj,2) 
     613                  tabres(ji,jj, 6) = tbif  (ji,jj,3) 
     614                  tabres(ji,jj, 7) = qstoif(ji,jj) 
     615               ENDIF 
     616            END DO 
     617         END DO 
     618      ENDIF 
    608619      ! 
    609620   END SUBROUTINE interp_adv_ice 
Note: See TracChangeset for help on using the changeset viewer.