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 11507 for NEMO/branches/2019/dev_r10984_HPC-13_IRRMANN_BDY_optimization/src/ICE/icevar.F90 – NEMO

Ignore:
Timestamp:
2019-09-06T17:19:33+02:00 (5 years ago)
Author:
clem
Message:

add a new functionality for bdy ice by allowing the user to have input files for ice/snw temperature and salinity instead of setting a constant value. Also, input files can have any number of categories

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2019/dev_r10984_HPC-13_IRRMANN_BDY_optimization/src/ICE/icevar.F90

    r11397 r11507  
    4747   !!   ice_var_zapneg    : remove negative ice fields 
    4848   !!   ice_var_roundoff  : remove negative values arising from roundoff erros 
    49    !!   ice_var_itd       : convert N-cat to M-cat 
    5049   !!   ice_var_bv        : brine volume 
    5150   !!   ice_var_enthalpy  : compute ice and snow enthalpies from temperature 
    5251   !!   ice_var_sshdyn    : compute equivalent ssh in lead 
     52   !!   ice_var_itd       : convert N-cat to M-cat 
    5353   !!---------------------------------------------------------------------- 
    5454   USE dom_oce        ! ocean space and time domain 
     
    787787      REAL(wp), DIMENSION(:), INTENT(in)    ::   phti, phts, pati    ! input  ice/snow variables 
    788788      REAL(wp), DIMENSION(:), INTENT(inout) ::   ph_i, ph_s, pa_i    ! output ice/snow variables 
    789       REAL(wp), DIMENSION(:), INTENT(in)   , OPTIONAL ::   ptmi, ptms, ptmsu, psmi    ! input  ice/snow temp & sal 
    790       REAL(wp), DIMENSION(:), INTENT(inout), OPTIONAL ::   pt_i, pt_s, pt_su, ps_i    ! output ice/snow temp & sal 
     789      REAL(wp), DIMENSION(:), INTENT(in)    ::   ptmi, ptms, ptmsu, psmi    ! input  ice/snow temp & sal 
     790      REAL(wp), DIMENSION(:), INTENT(inout) ::   pt_i, pt_s, pt_su, ps_i    ! output ice/snow temp & sal 
    791791      !!------------------------------------------------------------------- 
    792792      ! == thickness and concentration == ! 
     
    796796      ! 
    797797      ! == temperature and salinity == ! 
    798       IF( PRESENT( pt_i  ) )   pt_i (:) = ptmi (:) 
    799       IF( PRESENT( pt_s  ) )   pt_s (:) = ptms (:) 
    800       IF( PRESENT( pt_su ) )   pt_su(:) = ptmsu(:) 
    801       IF( PRESENT( ps_i  ) )   ps_i (:) = psmi (:) 
     798      pt_i (:) = ptmi (:) 
     799      pt_s (:) = ptms (:) 
     800      pt_su(:) = ptmsu(:) 
     801      ps_i (:) = psmi (:) 
    802802       
    803803   END SUBROUTINE ice_var_itd_1c1c 
     
    810810      REAL(wp), DIMENSION(:,:), INTENT(in)    ::   phti, phts, pati    ! input  ice/snow variables 
    811811      REAL(wp), DIMENSION(:)  , INTENT(inout) ::   ph_i, ph_s, pa_i    ! output ice/snow variables 
    812       REAL(wp), DIMENSION(:,:), INTENT(in)   , OPTIONAL ::   ptmi, ptms, ptmsu, psmi    ! input  ice/snow temp & sal 
    813       REAL(wp), DIMENSION(:)  , INTENT(inout), OPTIONAL ::   pt_i, pt_s, pt_su, ps_i    ! output ice/snow temp & sal 
     812      REAL(wp), DIMENSION(:,:), INTENT(in)    ::   ptmi, ptms, ptmsu, psmi    ! input  ice/snow temp & sal 
     813      REAL(wp), DIMENSION(:)  , INTENT(inout) ::   pt_i, pt_s, pt_su, ps_i    ! output ice/snow temp & sal 
    814814      ! 
    815815      REAL(wp), ALLOCATABLE, DIMENSION(:) ::   z1_ai, z1_vi, z1_vs 
     
    821821      ! 
    822822      ! == thickness and concentration == ! 
    823       ALLOCATE( z1_ai(idim) ) 
     823      ALLOCATE( z1_ai(idim), z1_vi(idim), z1_vs(idim) ) 
    824824      ! 
    825825      pa_i(:) = SUM( pati(:,:), dim=2 ) 
     
    833833      ! 
    834834      ! == temperature and salinity == ! 
    835       IF( PRESENT( pt_i ) .OR. PRESENT( pt_s ) .OR. PRESENT( pt_su ) .OR. PRESENT( ps_i ) ) THEN 
    836          ! 
    837          ALLOCATE( z1_vi(idim), z1_vs(idim) ) 
    838          ! 
    839          WHERE( ( pa_i(:) * ph_i(:) ) /= 0._wp )   ;   z1_vi(:) = 1._wp / ( pa_i(:) * ph_i(:) ) 
    840          ELSEWHERE                                 ;   z1_vi(:) = 0._wp 
    841          END WHERE 
    842          WHERE( ( pa_i(:) * ph_s(:) ) /= 0._wp )   ;   z1_vs(:) = 1._wp / ( pa_i(:) * ph_s(:) ) 
    843          ELSEWHERE                                 ;   z1_vs(:) = 0._wp 
    844          END WHERE 
    845          ! 
    846          IF( PRESENT( pt_i  ) )   pt_i (:) = SUM( ptmi (:,:) * pati(:,:) * phti(:,:), dim=2 ) * z1_vi(:) 
    847          IF( PRESENT( pt_s  ) )   pt_s (:) = SUM( ptms (:,:) * pati(:,:) * phts(:,:), dim=2 ) * z1_vs(:) 
    848          IF( PRESENT( pt_su ) )   pt_su(:) = SUM( ptmsu(:,:) * pati(:,:)            , dim=2 ) * z1_ai(:) 
    849          IF( PRESENT( ps_i  ) )   ps_i (:) = SUM( psmi (:,:) * pati(:,:) * phti(:,:), dim=2 ) * z1_vi(:) 
    850          ! 
    851          DEALLOCATE( z1_vi, z1_vs ) 
    852          ! 
    853       ENDIF 
    854       ! 
    855       DEALLOCATE( z1_ai ) 
     835      WHERE( ( pa_i(:) * ph_i(:) ) /= 0._wp )   ;   z1_vi(:) = 1._wp / ( pa_i(:) * ph_i(:) ) 
     836      ELSEWHERE                                 ;   z1_vi(:) = 0._wp 
     837      END WHERE 
     838      WHERE( ( pa_i(:) * ph_s(:) ) /= 0._wp )   ;   z1_vs(:) = 1._wp / ( pa_i(:) * ph_s(:) ) 
     839      ELSEWHERE                                 ;   z1_vs(:) = 0._wp 
     840      END WHERE 
     841      pt_i (:) = SUM( ptmi (:,:) * pati(:,:) * phti(:,:), dim=2 ) * z1_vi(:) 
     842      pt_s (:) = SUM( ptms (:,:) * pati(:,:) * phts(:,:), dim=2 ) * z1_vs(:) 
     843      pt_su(:) = SUM( ptmsu(:,:) * pati(:,:)            , dim=2 ) * z1_ai(:) 
     844      ps_i (:) = SUM( psmi (:,:) * pati(:,:) * phti(:,:), dim=2 ) * z1_vi(:) 
     845      ! 
     846      DEALLOCATE( z1_ai, z1_vi, z1_vs ) 
    856847      ! 
    857848   END SUBROUTINE ice_var_itd_Nc1c 
     
    889880      REAL(wp), DIMENSION(:),   INTENT(in)    ::   phti, phts, pati    ! input  ice/snow variables 
    890881      REAL(wp), DIMENSION(:,:), INTENT(inout) ::   ph_i, ph_s, pa_i    ! output ice/snow variables 
    891       REAL(wp), DIMENSION(:)  , INTENT(in)   , OPTIONAL ::   ptmi, ptms, ptmsu, psmi    ! input  ice/snow temp & sal 
    892       REAL(wp), DIMENSION(:,:), INTENT(inout), OPTIONAL ::   pt_i, pt_s, pt_su, ps_i    ! output ice/snow temp & sal 
     882      REAL(wp), DIMENSION(:)  , INTENT(in)    ::   ptmi, ptms, ptmsu, psmi    ! input  ice/snow temp & sal 
     883      REAL(wp), DIMENSION(:,:), INTENT(inout) ::   pt_i, pt_s, pt_su, ps_i    ! output ice/snow temp & sal 
    893884      ! 
    894885      INTEGER , DIMENSION(4) ::   itest 
     
    1005996      ! 
    1006997      ! == temperature and salinity == ! 
    1007       IF( PRESENT( pt_i  ) ) THEN 
    1008          DO jl = 1, jpl 
    1009             pt_i(:,jl) = ptmi (:) 
    1010          END DO 
    1011       ENDIF 
    1012       IF( PRESENT( pt_s  ) ) THEN 
    1013          DO jl = 1, jpl 
    1014             pt_s (:,jl) = ptms (:) 
    1015          END DO 
    1016       ENDIF 
    1017       IF( PRESENT( pt_su ) ) THEN 
    1018          DO jl = 1, jpl 
    1019             pt_su(:,jl) = ptmsu(:) 
    1020          END DO 
    1021       ENDIF 
    1022       IF( PRESENT( ps_i  ) ) THEN 
    1023          DO jl = 1, jpl 
    1024             ps_i (:,jl) = psmi (:) 
    1025          END DO 
    1026       ENDIF 
     998      DO jl = 1, jpl 
     999         pt_i(:,jl) = ptmi (:) 
     1000      END DO 
     1001      DO jl = 1, jpl 
     1002         pt_s (:,jl) = ptms (:) 
     1003      END DO 
     1004      DO jl = 1, jpl 
     1005         pt_su(:,jl) = ptmsu(:) 
     1006      END DO 
     1007      DO jl = 1, jpl 
     1008         ps_i (:,jl) = psmi (:) 
     1009      END DO 
    10271010      ! 
    10281011   END SUBROUTINE ice_var_itd_1cMc 
     
    10601043      REAL(wp), DIMENSION(:,:), INTENT(in)    ::   phti, phts, pati    ! input  ice/snow variables 
    10611044      REAL(wp), DIMENSION(:,:), INTENT(inout) ::   ph_i, ph_s, pa_i    ! output ice/snow variables 
    1062       REAL(wp), DIMENSION(:,:), INTENT(in)   , OPTIONAL ::   ptmi, ptms, ptmsu, psmi    ! input  ice/snow temp & sal 
    1063       REAL(wp), DIMENSION(:,:), INTENT(inout), OPTIONAL ::   pt_i, pt_s, pt_su, ps_i    ! output ice/snow temp & sal 
     1045      REAL(wp), DIMENSION(:,:), INTENT(in)    ::   ptmi, ptms, ptmsu, psmi    ! input  ice/snow temp & sal 
     1046      REAL(wp), DIMENSION(:,:), INTENT(inout) ::   pt_i, pt_s, pt_su, ps_i    ! output ice/snow temp & sal 
    10641047      ! 
    10651048      INTEGER , ALLOCATABLE, DIMENSION(:,:) ::   jlfil, jlfil2 
     
    10841067         ! 
    10851068         ! == temperature and salinity == ! 
    1086          IF( PRESENT( pt_i  ) )   pt_i (:,:) = ptmi (:,:) 
    1087          IF( PRESENT( pt_s  ) )   pt_s (:,:) = ptms (:,:) 
    1088          IF( PRESENT( pt_su ) )   pt_su(:,:) = ptmsu(:,:) 
    1089          IF( PRESENT( ps_i  ) )   ps_i (:,:) = psmi (:,:) 
     1069         pt_i (:,:) = ptmi (:,:) 
     1070         pt_s (:,:) = ptms (:,:) 
     1071         pt_su(:,:) = ptmsu(:,:) 
     1072         ps_i (:,:) = psmi (:,:) 
    10901073         !                              ! ---------------------- ! 
    10911074      ELSEIF( icat == 1 ) THEN          ! input cat = 1          ! 
    10921075         !                              ! ---------------------- ! 
    1093          CALL  ice_var_itd_1cMc( phti(:,1), phts(:,1), pati (:,1),            ph_i(:,:), ph_s(:,:), pa_i (:,:) ) 
    1094 !!         CALL  ice_var_itd_1cMc( phti(:,1), phts(:,1), pati (:,1),            ph_i(:,:), ph_s(:,:), pa_i (:,:), & 
    1095 !!            &                    ptmi(:,1), ptms(:,1), ptmsu(:,1), psmi(:,1), pt_i(:,:), pt_s(:,:), pt_su(:,:), ps_i(:,:) ) 
     1076         CALL  ice_var_itd_1cMc( phti(:,1), phts(:,1), pati (:,1),            ph_i(:,:), ph_s(:,:), pa_i (:,:), & 
     1077            &                    ptmi(:,1), ptms(:,1), ptmsu(:,1), psmi(:,1), pt_i(:,:), pt_s(:,:), pt_su(:,:), ps_i(:,:) ) 
    10961078         !                              ! ---------------------- ! 
    10971079      ELSEIF( jpl == 1 ) THEN           ! output cat = 1         ! 
    10981080         !                              ! ---------------------- ! 
    1099          CALL  ice_var_itd_Nc1c( phti(:,:), phts(:,:), pati (:,:),            ph_i(:,1), ph_s(:,1), pa_i (:,1) ) 
    1100 !!         CALL  ice_var_itd_Nc1c( phti(:,:), phts(:,:), pati (:,:),            ph_i(:,1), ph_s(:,1), pa_i (:,1), & 
    1101 !!            &                    ptmi(:,:), ptms(:,:), ptmsu(:,:), psmi(:,:), pt_i(:,1), pt_s(:,1), pt_su(:,1), ps_i(:,1) )          
     1081         CALL  ice_var_itd_Nc1c( phti(:,:), phts(:,:), pati (:,:),            ph_i(:,1), ph_s(:,1), pa_i (:,1), & 
     1082            &                    ptmi(:,:), ptms(:,:), ptmsu(:,:), psmi(:,:), pt_i(:,1), pt_s(:,1), pt_su(:,1), ps_i(:,1) ) 
    11021083         !                              ! ----------------------- ! 
    11031084      ELSE                              ! input cat /= output cat ! 
     
    11891170         ! == temperature and salinity == ! 
    11901171         ! 
    1191          IF( PRESENT( pt_i ) .OR. PRESENT( pt_s ) .OR. PRESENT( pt_su ) .OR. PRESENT( ps_i ) ) THEN 
    1192             ! 
    1193             ALLOCATE( z1_ai(idim), z1_vi(idim), z1_vs(idim), ztmp(idim) ) 
    1194             ! 
    1195             WHERE( SUM( pa_i(:,:), dim=2 ) /= 0._wp )               ;   z1_ai(:) = 1._wp / SUM( pa_i(:,:), dim=2 ) 
    1196             ELSEWHERE                                               ;   z1_ai(:) = 0._wp 
    1197             END WHERE 
    1198             WHERE( SUM( pa_i(:,:) * ph_i(:,:), dim=2 ) /= 0._wp )   ;   z1_vi(:) = 1._wp / SUM( pa_i(:,:) * ph_i(:,:), dim=2 ) 
    1199             ELSEWHERE                                               ;   z1_vi(:) = 0._wp 
    1200             END WHERE 
    1201             WHERE( SUM( pa_i(:,:) * ph_s(:,:), dim=2 ) /= 0._wp )   ;   z1_vs(:) = 1._wp / SUM( pa_i(:,:) * ph_s(:,:), dim=2 ) 
    1202             ELSEWHERE                                               ;   z1_vs(:) = 0._wp 
    1203             END WHERE 
    1204             ! 
    1205             ! fill all the categories with the same value 
    1206             IF( PRESENT( pt_i  ) ) THEN 
    1207                ztmp(:) = SUM( ptmi (:,:) * pati(:,:) * phti(:,:), dim=2 ) * z1_vi(:) 
    1208                DO jl = 1, jpl 
    1209                   pt_i (:,jl) = ztmp(:) 
    1210                END DO 
    1211             ENDIF 
    1212             IF( PRESENT( pt_s  ) ) THEN 
    1213                ztmp(:) =  SUM( ptms (:,:) * pati(:,:) * phts(:,:), dim=2 ) * z1_vs(:) 
    1214                DO jl = 1, jpl 
    1215                   pt_s (:,jl) = ztmp(:) 
    1216                END DO 
    1217             ENDIF 
    1218             IF( PRESENT( pt_su ) ) THEN 
    1219                ztmp(:) = SUM( ptmsu(:,:) * pati(:,:)            , dim=2 ) * z1_ai(:) 
    1220                DO jl = 1, jpl 
    1221                   pt_su(:,jl) = ztmp(:) 
    1222                END DO 
    1223             ENDIF 
    1224             IF( PRESENT( ps_i  ) ) THEN 
    1225                ztmp(:) = SUM( psmi (:,:) * pati(:,:) * phti(:,:), dim=2 ) * z1_vi(:) 
    1226                DO jl = 1, jpl 
    1227                   ps_i (:,jl) = ztmp(:) 
    1228                END DO 
    1229             ENDIF 
    1230             ! 
    1231             DEALLOCATE( z1_ai, z1_vi, z1_vs, ztmp ) 
    1232             ! 
    1233          ENDIF 
     1172         ALLOCATE( z1_ai(idim), z1_vi(idim), z1_vs(idim), ztmp(idim) ) 
     1173         ! 
     1174         WHERE( SUM( pa_i(:,:), dim=2 ) /= 0._wp )               ;   z1_ai(:) = 1._wp / SUM( pa_i(:,:), dim=2 ) 
     1175         ELSEWHERE                                               ;   z1_ai(:) = 0._wp 
     1176         END WHERE 
     1177         WHERE( SUM( pa_i(:,:) * ph_i(:,:), dim=2 ) /= 0._wp )   ;   z1_vi(:) = 1._wp / SUM( pa_i(:,:) * ph_i(:,:), dim=2 ) 
     1178         ELSEWHERE                                               ;   z1_vi(:) = 0._wp 
     1179         END WHERE 
     1180         WHERE( SUM( pa_i(:,:) * ph_s(:,:), dim=2 ) /= 0._wp )   ;   z1_vs(:) = 1._wp / SUM( pa_i(:,:) * ph_s(:,:), dim=2 ) 
     1181         ELSEWHERE                                               ;   z1_vs(:) = 0._wp 
     1182         END WHERE 
     1183         ! 
     1184         ! fill all the categories with the same value 
     1185         ztmp(:) = SUM( ptmi (:,:) * pati(:,:) * phti(:,:), dim=2 ) * z1_vi(:) 
     1186         DO jl = 1, jpl 
     1187            pt_i (:,jl) = ztmp(:) 
     1188         END DO 
     1189         ztmp(:) = SUM( ptms (:,:) * pati(:,:) * phts(:,:), dim=2 ) * z1_vs(:) 
     1190         DO jl = 1, jpl 
     1191            pt_s (:,jl) = ztmp(:) 
     1192         END DO 
     1193         ztmp(:) = SUM( ptmsu(:,:) * pati(:,:)            , dim=2 ) * z1_ai(:) 
     1194         DO jl = 1, jpl 
     1195            pt_su(:,jl) = ztmp(:) 
     1196         END DO 
     1197         ztmp(:) = SUM( psmi (:,:) * pati(:,:) * phti(:,:), dim=2 ) * z1_vi(:) 
     1198         DO jl = 1, jpl 
     1199            ps_i (:,jl) = ztmp(:) 
     1200         END DO 
     1201         ! 
     1202         DEALLOCATE( z1_ai, z1_vi, z1_vs, ztmp ) 
    12341203         ! 
    12351204      ENDIF 
Note: See TracChangeset for help on using the changeset viewer.