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 14644 for NEMO/branches/2020/dev_r14116_HPC-04_mcastril_Mixed_Precision_implementation_final/src/NST/agrif_oce_interp.F90 – NEMO

Ignore:
Timestamp:
2021-03-26T15:33:49+01:00 (3 years ago)
Author:
sparonuz
Message:

Merge trunk -r14642:HEAD

Location:
NEMO/branches/2020/dev_r14116_HPC-04_mcastril_Mixed_Precision_implementation_final
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2020/dev_r14116_HPC-04_mcastril_Mixed_Precision_implementation_final

    • Property svn:externals
      •  

        old new  
        99 
        1010# SETTE 
        11 ^/utils/CI/sette_wave@13990         sette 
         11^/utils/CI/sette@14244        sette 
  • NEMO/branches/2020/dev_r14116_HPC-04_mcastril_Mixed_Precision_implementation_final/src/NST/agrif_oce_interp.F90

    r14200 r14644  
    22   !!====================================================================== 
    33   !!                   ***  MODULE  agrif_oce_interp  *** 
    4    !! AGRIF: interpolation package for the ocean dynamics (OPA) 
     4   !! AGRIF: interpolation package for the ocean dynamics (OCE) 
    55   !!====================================================================== 
    66   !! History :  2.0  !  2002-06  (L. Debreu)  Original cade 
     
    109109      vv(:,:,:,Kbb) = vv(:,:,:,Kbb) * vmask(:,:,:)  
    110110 
    111       CALL lbc_lnk_multi( 'agrif_istate_oce', uu(:,:,:  ,Kbb), 'U', -1.0_wp , vv(:,:,:,Kbb), 'V', -1.0_wp ) 
     111      CALL lbc_lnk( 'agrif_istate_oce', uu(:,:,:  ,Kbb), 'U', -1.0_wp , vv(:,:,:,Kbb), 'V', -1.0_wp ) 
    112112      CALL lbc_lnk( 'agrif_istate_oce', ts(:,:,:,:,Kbb), 'T',  1.0_wp ) 
    113113 
     
    863863                  ! Build vertical grids: 
    864864                  N_in = mbkt_parent(ji,jj) 
    865                   ! Input grid (account for partial cells if any): 
    866                   DO jk=1,N_in 
    867                      z_in(jk) = ptab(ji,jj,jk,n2) - ptab(ji,jj,k2,n2) 
    868                      tabin(jk,1:jpts) = ptab(ji,jj,jk,1:jpts) 
    869                   END DO 
     865                  N_out = mbkt(ji,jj) 
     866                  IF (N_in*N_out > 0) THEN 
     867                     ! Input grid (account for partial cells if any): 
     868                     DO jk=1,N_in 
     869                        z_in(jk) = ptab(ji,jj,jk,n2) - ptab(ji,jj,k2,n2) 
     870                        tabin(jk,1:jpts) = ptab(ji,jj,jk,1:jpts) 
     871                     END DO 
    870872                   
    871                   ! Intermediate grid: 
    872                   IF ( l_vremap ) THEN 
    873                      DO jk = 1, N_in 
    874                         h_in_i(jk) = e3t0_parent(ji,jj,jk) * &  
    875                           &       (1._wp + ptab(ji,jj,k2,n2)/(ht0_parent(ji,jj)*ssmask(ji,jj) + 1._wp - ssmask(ji,jj))) 
     873                     ! Intermediate grid: 
     874                     IF ( l_vremap ) THEN 
     875                        DO jk = 1, N_in 
     876                           h_in_i(jk) = e3t0_parent(ji,jj,jk) * &  
     877                             &       (1._wp + ptab(ji,jj,k2,n2)/(ht0_parent(ji,jj)*ssmask(ji,jj) + 1._wp - ssmask(ji,jj))) 
     878                        END DO 
     879                        z_in_i(1) = 0.5_wp * h_in_i(1) 
     880                        DO jk=2,N_in 
     881                           z_in_i(jk) = z_in_i(jk-1) + 0.5_wp * ( h_in_i(jk) + h_in_i(jk-1) ) 
     882                        END DO 
     883                        z_in_i(1:N_in) = z_in_i(1:N_in)  - ptab(ji,jj,k2,n2) 
     884                     ENDIF                               
     885 
     886                     ! Output (Child) grid: 
     887                     DO jk=1,N_out 
     888                        h_out(jk) = e3t(ji,jj,jk,Krhs_a) 
    876889                     END DO 
    877                      z_in_i(1) = 0.5_wp * h_in_i(1) 
    878                      DO jk=2,N_in 
    879                         z_in_i(jk) = z_in_i(jk-1) + 0.5_wp * ( h_in_i(jk) + h_in_i(jk-1) ) 
     890                     z_out(1) = 0.5_wp * h_out(1) 
     891                     DO jk=2,N_out 
     892                        z_out(jk) = z_out(jk-1) + 0.5_wp * ( h_out(jk)+h_out(jk-1) ) 
    880893                     END DO 
    881                      z_in_i(1:N_in) = z_in_i(1:N_in)  - ptab(ji,jj,k2,n2) 
    882                   ENDIF                               
    883  
    884                   ! Output (Child) grid: 
    885                   N_out = mbkt(ji,jj) 
    886                   DO jk=1,N_out 
    887                      h_out(jk) = e3t(ji,jj,jk,Krhs_a) 
    888                   END DO 
    889                   z_out(1) = 0.5_wp * h_out(1) 
    890                   DO jk=2,N_out 
    891                      z_out(jk) = z_out(jk-1) + 0.5_wp * ( h_out(jk)+h_out(jk-1) ) 
    892                   END DO 
    893                   IF (.NOT.ln_linssh) z_out(1:N_out) = z_out(1:N_out)  - ssh(ji,jj,Krhs_a) 
    894  
    895                   IF (N_in*N_out > 0) THEN 
     894                     IF (.NOT.ln_linssh) z_out(1:N_out) = z_out(1:N_out)  - ssh(ji,jj,Krhs_a) 
     895 
    896896                     IF( l_ini_child ) THEN 
    897897                        CALL remap_linear(tabin(1:N_in,1:jpts),z_in(1:N_in),ts(ji,jj,1:N_out,1:jpts,Krhs_a),              & 
     
    10401040                  uu(ji,jj,:,Krhs_a) = 0._wp 
    10411041                  N_in = mbku_parent(ji,jj) 
    1042                   zhtot = 0._wp 
    1043                   DO jk=1,N_in 
    1044                      !IF (jk==N_in) THEN 
    1045                      !   h_in(jk) = hu0_parent(ji,jj) + ptab(ji,jj,k2,2) - zhtot 
    1046                      !ELSE 
    1047                      !   h_in(jk) = ptab(ji,jj,jk,2)/(e2u(ji,jj)*zrhoy)  
    1048                      !ENDIF 
    1049                      IF ( l_vremap ) THEN 
    1050                         h_in(jk) = e3u0_parent(ji,jj,jk)  
    1051                      ELSE 
    1052                         IF (jk==N_in) THEN 
    1053                            h_in(jk) = hu0_parent(ji,jj) + ptab(ji,jj,k2,2) - zhtot 
     1042                  N_out = mbku(ji,jj) 
     1043                  IF (N_in*N_out > 0) THEN 
     1044                     zhtot = 0._wp 
     1045                     DO jk=1,N_in 
     1046                        !IF (jk==N_in) THEN 
     1047                        !   h_in(jk) = hu0_parent(ji,jj) + ptab(ji,jj,k2,2) - zhtot 
     1048                        !ELSE 
     1049                        !   h_in(jk) = ptab(ji,jj,jk,2)/(e2u(ji,jj)*zrhoy)  
     1050                        !ENDIF 
     1051                        IF ( l_vremap ) THEN 
     1052                           h_in(jk) = e3u0_parent(ji,jj,jk)  
    10541053                        ELSE 
    1055                            h_in(jk) = ptab(ji,jj,jk,2)/(e2u(ji,jj)*zrhoy)  
     1054                           IF (jk==N_in) THEN 
     1055                              h_in(jk) = hu0_parent(ji,jj) + ptab(ji,jj,k2,2) - zhtot 
     1056                           ELSE 
     1057                              h_in(jk) = ptab(ji,jj,jk,2)/(e2u(ji,jj)*zrhoy)  
     1058                           ENDIF 
    10561059                        ENDIF 
    1057                      ENDIF 
    1058                      zhtot = zhtot + h_in(jk) 
    1059                      IF( h_in(jk) .GT. 0. ) THEN 
    1060                      tabin(jk) = ptab(ji,jj,jk,1)/(e2u(ji,jj)*zrhoy*h_in(jk)) 
    1061                      ELSE 
    1062                      tabin(jk) = 0. 
    1063                      ENDIF 
    1064                  END DO 
    1065                  z_in(1) = 0.5_wp * h_in(1) - zhtot + hu0_parent(ji,jj)  
    1066                  DO jk=2,N_in 
    1067                     z_in(jk) = z_in(jk-1) + 0.5_wp * (h_in(jk)+h_in(jk-1)) 
    1068                  END DO 
     1060                        zhtot = zhtot + h_in(jk) 
     1061                        IF( h_in(jk) .GT. 0. ) THEN 
     1062                           tabin(jk) = ptab(ji,jj,jk,1)/(e2u(ji,jj)*zrhoy*h_in(jk)) 
     1063                        ELSE 
     1064                           tabin(jk) = 0. 
     1065                        ENDIF 
     1066                    END DO 
     1067                    z_in(1) = 0.5_wp * h_in(1) - zhtot + hu0_parent(ji,jj)  
     1068                    DO jk=2,N_in 
     1069                       z_in(jk) = z_in(jk-1) + 0.5_wp * (h_in(jk)+h_in(jk-1)) 
     1070                    END DO 
    10691071                      
    1070                  N_out = 0 
    1071                  DO jk=1,jpk 
    1072                     IF (umask(ji,jj,jk) == 0) EXIT 
    1073                     N_out = N_out + 1 
    1074                     h_out(N_out) = e3u(ji,jj,jk,Krhs_a) 
    1075                  END DO 
    1076  
    1077                  z_out(1) = 0.5_wp * h_out(1) - SUM(h_out(1:N_out)) + hu_0(ji,jj) 
    1078                  DO jk=2,N_out 
    1079                     z_out(jk) = z_out(jk-1) + 0.5_wp * (h_out(jk-1) + h_out(jk))  
    1080                  END DO   
    1081  
    1082                  IF (N_in*N_out > 0) THEN 
    1083                      IF( l_ini_child ) THEN 
    1084                         CALL remap_linear       (tabin(1:N_in),z_in(1:N_in),uu(ji,jj,1:N_out,Krhs_a),z_out(1:N_out),N_in,N_out,1) 
    1085                      ELSE 
    1086                         CALL reconstructandremap(tabin(1:N_in),h_in(1:N_in),uu(ji,jj,1:N_out,Krhs_a),h_out(1:N_out),N_in,N_out,1) 
    1087                      ENDIF    
     1072                    DO jk=1, N_out 
     1073                       h_out(jk) = e3u(ji,jj,jk,Krhs_a) 
     1074                    END DO 
     1075 
     1076                    z_out(1) = 0.5_wp * h_out(1) - SUM(h_out(1:N_out)) + hu_0(ji,jj) 
     1077                    DO jk=2,N_out 
     1078                       z_out(jk) = z_out(jk-1) + 0.5_wp * (h_out(jk-1) + h_out(jk))  
     1079                    END DO   
     1080 
     1081                    IF( l_ini_child ) THEN 
     1082                       CALL remap_linear       (tabin(1:N_in),z_in(1:N_in),uu(ji,jj,1:N_out,Krhs_a),z_out(1:N_out),N_in,N_out,1) 
     1083                    ELSE 
     1084                       CALL reconstructandremap(tabin(1:N_in),h_in(1:N_in),uu(ji,jj,1:N_out,Krhs_a),h_out(1:N_out),N_in,N_out,1) 
     1085                    ENDIF    
    10881086                 ENDIF 
    10891087               END DO 
     
    11711169                  vv(ji,jj,:,Krhs_a) = 0._wp 
    11721170                  N_in = mbkv_parent(ji,jj) 
    1173                   zhtot = 0._wp 
    1174                   DO jk=1,N_in 
    1175                      !IF (jk==N_in) THEN 
    1176                      !   h_in(jk) = hv0_parent(ji,jj) + ptab(ji,jj,k2,2) - zhtot 
    1177                      !ELSE 
    1178                      !   h_in(jk) = ptab(ji,jj,jk,2)/(e1v(ji,jj)*zrhox)  
    1179                      !ENDIF 
    1180                      IF (l_vremap) THEN 
    1181                         h_in(jk) = e3v0_parent(ji,jj,jk) 
    1182                      ELSE 
    1183                         IF (jk==N_in) THEN 
    1184                            h_in(jk) = hv0_parent(ji,jj) + ptab(ji,jj,k2,2) - zhtot 
     1171                  N_out = mbkv(ji,jj) 
     1172 
     1173                  IF (N_in*N_out > 0) THEN 
     1174                     zhtot = 0._wp 
     1175                     DO jk=1,N_in 
     1176                        !IF (jk==N_in) THEN 
     1177                        !   h_in(jk) = hv0_parent(ji,jj) + ptab(ji,jj,k2,2) - zhtot 
     1178                        !ELSE 
     1179                        !   h_in(jk) = ptab(ji,jj,jk,2)/(e1v(ji,jj)*zrhox)  
     1180                        !ENDIF 
     1181                        IF (l_vremap) THEN 
     1182                           h_in(jk) = e3v0_parent(ji,jj,jk) 
    11851183                        ELSE 
    1186                            h_in(jk) = ptab(ji,jj,jk,2)/(e1v(ji,jj)*zrhox)  
     1184                           IF (jk==N_in) THEN 
     1185                              h_in(jk) = hv0_parent(ji,jj) + ptab(ji,jj,k2,2) - zhtot 
     1186                           ELSE 
     1187                              h_in(jk) = ptab(ji,jj,jk,2)/(e1v(ji,jj)*zrhox)  
     1188                           ENDIF 
    11871189                        ENDIF 
    1188                      ENDIF 
    1189                      zhtot = zhtot + h_in(jk) 
    1190                      IF( h_in(jk) .GT. 0. ) THEN 
    1191                        tabin(jk) = ptab(ji,jj,jk,1)/(e1v(ji,jj)*zrhox*h_in(jk)) 
    1192                      ELSE 
    1193                        tabin(jk)  = 0. 
    1194                      ENDIF  
    1195                   END DO 
    1196  
    1197                   z_in(1) = 0.5_wp * h_in(1) - zhtot + hv0_parent(ji,jj) 
    1198                   DO jk=2,N_in 
    1199                      z_in(jk) = z_in(jk-1) + 0.5_wp * (h_in(jk-1)+h_in(jk)) 
    1200                   END DO 
    1201  
    1202                   N_out = 0 
    1203                   DO jk=1,jpk 
    1204                      IF (vmask(ji,jj,jk) == 0) EXIT 
    1205                      N_out = N_out + 1 
    1206                      h_out(N_out) = e3v(ji,jj,jk,Krhs_a) 
    1207                   END DO 
    1208  
    1209                   z_out(1) = 0.5_wp * h_out(1) - SUM(h_out(1:N_out)) + hv_0(ji,jj) 
    1210                   DO jk=2,N_out 
    1211                      z_out(jk) = z_out(jk-1) + 0.5_wp * (h_out(jk-1)+h_out(jk)) 
    1212                   END DO 
     1190                        zhtot = zhtot + h_in(jk) 
     1191                        IF( h_in(jk) .GT. 0. ) THEN 
     1192                          tabin(jk) = ptab(ji,jj,jk,1)/(e1v(ji,jj)*zrhox*h_in(jk)) 
     1193                        ELSE 
     1194                          tabin(jk)  = 0. 
     1195                        ENDIF  
     1196                     END DO 
     1197 
     1198                     z_in(1) = 0.5_wp * h_in(1) - zhtot + hv0_parent(ji,jj) 
     1199                     DO jk=2,N_in 
     1200                        z_in(jk) = z_in(jk-1) + 0.5_wp * (h_in(jk-1)+h_in(jk)) 
     1201                     END DO 
     1202 
     1203                     DO jk=1,N_out 
     1204                        h_out(jk) = e3v(ji,jj,jk,Krhs_a) 
     1205                     END DO 
     1206 
     1207                     z_out(1) = 0.5_wp * h_out(1) - SUM(h_out(1:N_out)) + hv_0(ji,jj) 
     1208                     DO jk=2,N_out 
     1209                        z_out(jk) = z_out(jk-1) + 0.5_wp * (h_out(jk-1)+h_out(jk)) 
     1210                     END DO 
    12131211  
    1214                   IF (N_in*N_out > 0) THEN 
    12151212                     IF( l_ini_child ) THEN 
    12161213                        CALL remap_linear       (tabin(1:N_in),z_in(1:N_in),vv(ji,jj,1:N_out,Krhs_a),z_out(1:N_out),N_in,N_out,1) 
     
    15601557                     &                 ptab(ji,jj,jk), tmask(ji,jj,jk) * e3t_0(ji,jj,jk), & 
    15611558                     &                 mig0(ji), mjg0(jj), jk 
    1562                 !     kindic_agr = kindic_agr + 1 
     1559                     kindic_agr = kindic_agr + 1 
    15631560                  ENDIF 
    15641561               END DO 
     
    17031700 
    17041701         IF( l_vremap ) THEN 
    1705             ! Interpolate thicknesses 
     1702            ! Interpolate interfaces  
    17061703            ! Warning: these are masked, hence extrapolated prior interpolation. 
    17071704            DO jk=k1,k2 
    17081705               DO jj=j1,j2 
    17091706                  DO ji=i1,i2 
    1710                       ptab(ji,jj,jk,2) = tmask(ji,jj,jk) * e3t(ji,jj,jk,Kmm_a) 
     1707                      ptab(ji,jj,jk,2) = tmask(ji,jj,jk) * gdepw(ji,jj,jk,Kmm_a) 
    17111708                  END DO 
    17121709               END DO 
    17131710            END DO 
    1714  
    1715             ! Extrapolate thicknesses in partial bottom cells: 
    1716             ! Set them to Agrif_SpecialValue (0.). Correct bottom thicknesses are retrieved later on 
    1717             IF (ln_zps) THEN 
    1718                DO jj=j1,j2 
    1719                   DO ji=i1,i2 
    1720                       jk = mbkt(ji,jj) 
    1721                       ptab(ji,jj,jk,2) = 0._wp 
    1722                   END DO 
    1723                END DO            
    1724             END IF 
    17251711         
    17261712           ! Save ssh at last level: 
     
    17361722         IF( l_vremap ) THEN 
    17371723            IF (ln_linssh) ptab(i1:i2,j1:j2,k2,2) = 0._wp  
    1738             avm_k(i1:i2,j1:j2,k1:k2) = 0._wp 
     1724            avm_k(i1:i2,j1:j2,1:jpkm1) = 0._wp 
    17391725                
    17401726            DO jj = j1, j2 
    17411727               DO ji =i1, i2 
    17421728                  N_in = mbkt_parent(ji,jj) 
    1743                   IF ( tmask(ji,jj,1) == 0._wp) N_in = 0 
    1744                   z_in(N_in+1) = ht0_parent(ji,jj) + ptab(ji,jj,k2,2) 
    1745                   DO jk = N_in, 1, -1  ! Parent vertical grid                
    1746                         z_in(jk) = z_in(jk+1) - ptab(ji,jj,jk,2) 
    1747                        tabin(jk) = ptab(ji,jj,jk,1) 
    1748                   END DO 
    1749                   N_out = mbkt(ji,jj)  
    1750                   DO jk = 1, N_out        ! Child vertical grid 
    1751                      z_out(jk) = gdepw(ji,jj,jk,Kmm_a) 
    1752                   END DO 
     1729                  N_out = mbkt(ji,jj) 
    17531730                  IF (N_in*N_out > 0) THEN 
     1731                     DO jk = 1, N_in  ! Parent vertical grid                
     1732                        z_in(jk)  = ptab(ji,jj,jk,2) - ptab(ji,jj,k2,2) 
     1733                        tabin(jk) = ptab(ji,jj,jk,1) 
     1734                     END DO 
     1735                     DO jk = 1, N_out        ! Child vertical grid 
     1736                        z_out(jk) = gdepw(ji,jj,jk,Kmm_a) - ssh(ji,jj,Kmm_a) 
     1737                     END DO 
     1738                     IF (.NOT.ln_linssh) z_out(1:N_out) = z_out(1:N_out)  - ssh(ji,jj,Kmm_a) 
     1739 
    17541740                     CALL remap_linear(tabin(1:N_in),z_in(1:N_in),avm_k(ji,jj,1:N_out),z_out(1:N_out),N_in,N_out,1) 
    17551741                  ENDIF 
     
    17571743            END DO 
    17581744         ELSE 
    1759             avm_k(i1:i2,j1:j2,k1:k2) = ptab (i1:i2,j1:j2,k1:k2,1) 
     1745            avm_k(i1:i2,j1:j2,1:jpkm1) = ptab (i1:i2,j1:j2,1:jpkm1,1) 
    17601746         ENDIF 
    17611747      ENDIF 
Note: See TracChangeset for help on using the changeset viewer.