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 3099 – NEMO

Changeset 3099


Ignore:
Timestamp:
2011-11-14T17:35:33+01:00 (12 years ago)
Author:
acc
Message:

Branch dev_NOC_2011_MERGE. Changes to dynhpg.F90 following review (#866)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2011/dev_NOC_2011_MERGE/NEMOGCM/NEMO/OPA_SRC/DYN/dynhpg.F90

    r3081 r3099  
    10201020      !! 
    10211021      !! ** Method  :   s-coordinate case. 
    1022       !!      Reformulate the horizontal hydrostatical pressure gradient 
    1023       !!      term using Pressure Jacobian. A new correction term  
    1024       !!      is developed to eliminate the sigma-coordinate error. 
     1022      !!      A Pressure-Jacobian horizontal pressure gradient method 
     1023      !!      based on the constrained cubic-spline interpolation for 
     1024      !!      all vertical coordinate systems 
    10251025      !! 
    10261026      !! ** Action : - Update (ua,va) with the now hydrastatic pressure trend 
     
    10301030 
    10311031      USE wrk_nemo, ONLY:   wrk_in_use, wrk_not_released 
    1032       USE oce     , ONLY:   fsde3w_tmp => ta       ! (ta,sa) used as 3D workspace 
    1033       USE oce     , ONLY:      rhd_tmp => sa  
     1032      USE oce     , ONLY:       zdeptht => ta       ! (ta,sa) used as 3D workspace 
     1033      USE oce     , ONLY:          zrhh => sa  
    10341034      USE wrk_nemo, ONLY:         zhpi => wrk_3d_3  
    10351035      USE wrk_nemo, ONLY:           zu => wrk_3d_4  
     
    10521052      !! The local variables for the correction term 
    10531053      INTEGER  :: jk1, jis, jid, jjs, jjd 
    1054       REAL(wp) :: zuijk, zvijk, pwes, pwed, pnss, pnsd, deps 
    1055       REAL(wp) :: rhdt1  
    1056       REAL(wp) :: dpdx1, dpdx2, dpdy1, dpdy2 
    1057       INTEGER  :: bhitwe, bhitns 
     1054      REAL(wp) :: zuijk, zvijk, zpwes, zpwed, zpnss, zpnsd, zdeps 
     1055      REAL(wp) :: zrhdt1  
     1056      REAL(wp) :: zdpdx1, zdpdx2, zdpdy1, zdpdy2 
     1057      INTEGER  :: zbhitwe, zbhitns 
    10581058      !!---------------------------------------------------------------------- 
    10591059 
     
    10741074      IF( lk_vvl ) znad = 1._wp 
    10751075 
    1076       ! Save fsde3w and rhd 
    1077       fsde3w_tmp(:,:,:) = fsde3w(:,:,:)  
    1078       rhd_tmp(:,:,:)    = rhd(:,:,:)    
    1079  
    10801076      ! Clean 3-D work arrays 
    10811077      zhpi(:,:,:) = 0. 
    10821078       
    1083       ! how to add vector opt.? N.B., jpi&jpi rather than jpim1&jpjm1 are needed here 
    10841079      ! Preparing vertical density profile for hybrid-sco coordinate 
    10851080      DO jj = 1, jpj 
    10861081        DO ji = 1, jpi    
    10871082          jk = mbathy(ji,jj) 
    1088           IF( jk <= 0 ) THEN; rhd(ji,jj,:) = 0._wp 
    1089           ELSE IF(jk == 1) THEN; rhd(ji,jj, jk+1:jpk) = rhd(ji,jj,jk) 
     1083          IF( jk <= 0 ) THEN; zrhh(ji,jj,:) = 0._wp 
     1084          ELSE IF(jk == 1) THEN; zrhh(ji,jj, jk+1:jpk) = rhd(ji,jj,jk) 
    10901085          ELSE IF(jk < jpkm1) THEN 
    10911086             DO jkk = jk+1, jpk 
    1092                 rhd(ji,jj,jkk) = interp1(fsde3w(ji,jj,jkk),   fsde3w(ji,jj,jkk-1), & 
     1087                zrhh(ji,jj,jkk) = interp1(fsde3w(ji,jj,jkk),   fsde3w(ji,jj,jkk-1), & 
    10931088                                         fsde3w(ji,jj,jkk-2), rhd(ji,jj,jkk-1), rhd(ji,jj,jkk-2)) 
    10941089             END DO  
    1095           END IF 
     1090          ENDIF 
    10961091        END DO 
    10971092      END DO 
     
    10991094      DO jj = 1, jpj 
    11001095        DO ji = 1, jpi 
    1101           fsde3w(ji,jj,1) = 0.5_wp * fse3w(ji,jj,1) 
    1102           fsde3w(ji,jj,1) = fsde3w(ji,jj,1) - sshn(ji,jj) * znad 
     1096          zdeptht(ji,jj,1) = 0.5_wp * fse3w(ji,jj,1) 
     1097          zdeptht(ji,jj,1) = zdeptht(ji,jj,1) - sshn(ji,jj) * znad 
    11031098          DO jk = 2, jpk 
    1104              fsde3w(ji,jj,jk) = fsde3w(ji,jj,jk-1) + fse3w(ji,jj,jk) 
     1099             zdeptht(ji,jj,jk) = zdeptht(ji,jj,jk-1) + fse3w(ji,jj,jk) 
    11051100          END DO 
    11061101        END DO 
     
    11101105        DO jj = 1, jpj 
    11111106          DO ji = 1, jpi 
    1112             fsp(ji,jj,jk) = rhd(ji,jj,jk) 
    1113             xsp(ji,jj,jk) = fsde3w(ji,jj,jk) 
     1107            fsp(ji,jj,jk) = zrhh(ji,jj,jk) 
     1108            xsp(ji,jj,jk) = zdeptht(ji,jj,jk) 
    11141109          END DO 
    11151110        END DO 
     
    11231118      DO jj = 2, jpj 
    11241119        DO ji = 2, jpi  
    1125           rhdt1 = rhd(ji,jj,1) - interp3(fsde3w(ji,jj,1),asp(ji,jj,1), & 
     1120          zrhdt1 = zrhh(ji,jj,1) - interp3(zdeptht(ji,jj,1),asp(ji,jj,1), & 
    11261121                                         bsp(ji,jj,1),   csp(ji,jj,1), & 
    1127                                          dsp(ji,jj,1) ) * 0.5_wp * fsde3w(ji,jj,1) 
    1128           rhdt1 = max(rhdt1, 1000._wp - rau0)        ! no lighter than fresh water 
     1122                                         dsp(ji,jj,1) ) * 0.5_wp * zdeptht(ji,jj,1) 
     1123          zrhdt1 = MAX(zrhdt1, 1000._wp - rau0)        ! no lighter than fresh water 
    11291124 
    11301125          ! assuming linear profile across the top half surface layer 
    1131           zhpi(ji,jj,1) =  0.5_wp * fse3w(ji,jj,1) * rhdt1   
     1126          zhpi(ji,jj,1) =  0.5_wp * fse3w(ji,jj,1) * zrhdt1   
    11321127        END DO 
    11331128      END DO 
     
    11381133          DO ji = 2, jpi 
    11391134            zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) +                          & 
    1140                              integ2(fsde3w(ji,jj,jk-1), fsde3w(ji,jj,jk),& 
     1135                             integ2(zdeptht(ji,jj,jk-1), zdeptht(ji,jj,jk),& 
    11411136                                    asp(ji,jj,jk-1),    bsp(ji,jj,jk-1), & 
    11421137                                    csp(ji,jj,jk-1),    dsp(ji,jj,jk-1)) 
     
    11741169        DO jj = 2, jpjm1      
    11751170          DO ji = 2, jpim1   
    1176             pwes = 0._wp; pwed = 0._wp 
    1177             pnss = 0._wp; pnsd = 0._wp 
     1171            zpwes = 0._wp; zpwed = 0._wp 
     1172            zpnss = 0._wp; zpnsd = 0._wp 
    11781173            zuijk = zu(ji,jj,jk) 
    11791174            zvijk = zv(ji,jj,jk) 
     
    11811176            !!!!!     for u equation 
    11821177            IF( jk <= mbku(ji,jj) ) THEN 
    1183                IF( -fsde3w(ji+1,jj,mbku(ji,jj)) >= -fsde3w(ji,jj,mbku(ji,jj)) ) THEN 
     1178               IF( -zdeptht(ji+1,jj,mbku(ji,jj)) >= -zdeptht(ji,jj,mbku(ji,jj)) ) THEN 
    11841179                 jis = ji + 1; jid = ji 
    11851180               ELSE 
     
    11891184               ! integrate the pressure on the shallow side 
    11901185               jk1 = jk  
    1191                bhitwe = 0 
    1192                DO WHILE ( -fsde3w(jis,jj,jk1) > zuijk ) 
     1186               zbhitwe = 0 
     1187               DO WHILE ( -zdeptht(jis,jj,jk1) > zuijk ) 
    11931188                 IF( jk1 == mbku(ji,jj) ) THEN 
    1194                    bhitwe = 1 
     1189                   zbhitwe = 1 
    11951190                   EXIT 
    11961191                 ENDIF 
    1197                  deps = min(fsde3w(jis,jj,jk1+1), -zuijk) 
    1198                  pwes = pwes +                                    &  
    1199                       integ2(fsde3w(jis,jj,jk1), deps,            & 
     1192                 zdeps = MIN(zdeptht(jis,jj,jk1+1), -zuijk) 
     1193                 zpwes = zpwes +                                    &  
     1194                      integ2(zdeptht(jis,jj,jk1), zdeps,            & 
    12001195                             asp(jis,jj,jk1),    bsp(jis,jj,jk1), & 
    12011196                             csp(jis,jj,jk1),    dsp(jis,jj,jk1)) 
     
    12031198               END DO 
    12041199             
    1205                IF(bhitwe == 1) THEN 
    1206                  zuijk = -fsde3w(jis,jj,jk1) 
     1200               IF(zbhitwe == 1) THEN 
     1201                 zuijk = -zdeptht(jis,jj,jk1) 
    12071202               ENDIF 
    12081203 
    12091204               ! integrate the pressure on the deep side 
    12101205               jk1 = jk  
    1211                bhitwe = 0 
    1212                DO WHILE ( -fsde3w(jid,jj,jk1) < zuijk ) 
     1206               zbhitwe = 0 
     1207               DO WHILE ( -zdeptht(jid,jj,jk1) < zuijk ) 
    12131208                 IF( jk1 == 1 ) THEN 
    1214                    bhitwe = 1 
     1209                   zbhitwe = 1 
    12151210                   EXIT 
    12161211                 ENDIF 
    1217                  deps = max(fsde3w(jid,jj,jk1-1), -zuijk) 
    1218                  pwed = pwed +                                        &  
    1219                         integ2(deps,              fsde3w(jid,jj,jk1), & 
     1212                 zdeps = MAX(zdeptht(jid,jj,jk1-1), -zuijk) 
     1213                 zpwed = zpwed +                                        &  
     1214                        integ2(zdeps,              zdeptht(jid,jj,jk1), & 
    12201215                               asp(jid,jj,jk1-1), bsp(jid,jj,jk1-1),  & 
    12211216                               csp(jid,jj,jk1-1), dsp(jid,jj,jk1-1) ) 
     
    12231218               END DO 
    12241219             
    1225                IF( bhitwe == 1 ) THEN 
    1226                  deps = fsde3w(jid,jj,1) + min(zuijk, sshn(jid,jj)*znad) 
    1227                  rhdt1 = rhd(jid,jj,1) - interp3(fsde3w(jid,jj,1), asp(jid,jj,1), & 
     1220               IF( zbhitwe == 1 ) THEN 
     1221                 zdeps = zdeptht(jid,jj,1) + MIN(zuijk, sshn(jid,jj)*znad) 
     1222                 zrhdt1 = zrhh(jid,jj,1) - interp3(zdeptht(jid,jj,1), asp(jid,jj,1), & 
    12281223                                                 bsp(jid,jj,1),    csp(jid,jj,1), & 
    1229                                                  dsp(jid,jj,1)) * deps 
    1230                  rhdt1 = max(rhdt1, 1000._wp - rau0)        ! no lighter than fresh water 
    1231                  pwed  = pwed + 0.5_wp * (rhd(jid,jj,1) + rhdt1) * deps 
     1224                                                 dsp(jid,jj,1)) * zdeps 
     1225                 zrhdt1 = MAX(zrhdt1, 1000._wp - rau0)        ! no lighter than fresh water 
     1226                 zpwed  = zpwed + 0.5_wp * (zrhh(jid,jj,1) + zrhdt1) * zdeps 
    12321227               ENDIF 
    12331228 
    1234  
    1235                dpdx1 = zcoef0 / e1u(ji,jj) * (zhpi(ji+1,jj,jk) - zhpi(ji,jj,jk)) 
     1229               ! update the momentum trends in u direction 
     1230 
     1231               zdpdx1 = zcoef0 / e1u(ji,jj) * (zhpi(ji+1,jj,jk) - zhpi(ji,jj,jk)) 
    12361232               IF( lk_vvl ) THEN 
    1237                  dpdx2 = zcoef0 / e1u(ji,jj) * &  
    1238                          ( REAL(jis-jid, wp) * (pwes + pwed) + (sshn(ji+1,jj)-sshn(ji,jj)) )  
     1233                 zdpdx2 = zcoef0 / e1u(ji,jj) * &  
     1234                         ( REAL(jis-jid, wp) * (zpwes + zpwed) + (sshn(ji+1,jj)-sshn(ji,jj)) )  
    12391235                ELSE 
    1240                  dpdx2 = zcoef0 / e1u(ji,jj) * REAL(jis-jid, wp) * (pwes + pwed)  
     1236                 zdpdx2 = zcoef0 / e1u(ji,jj) * REAL(jis-jid, wp) * (zpwes + zpwed)  
    12411237               ENDIF 
    12421238 
    1243                ua(ji,jj,jk) = ua(ji,jj,jk) + (dpdx1 + dpdx2) * & 
     1239               ua(ji,jj,jk) = ua(ji,jj,jk) + (zdpdx1 + zdpdx2) * & 
    12441240               &           umask(ji,jj,jk) * tmask(ji,jj,jk) * tmask(ji+1,jj,jk) 
    12451241            ENDIF 
     
    12471243            !!!!!     for v equation 
    12481244            IF( jk <= mbkv(ji,jj) ) THEN 
    1249                IF( -fsde3w(ji,jj+1,mbkv(ji,jj)) >= -fsde3w(ji,jj,mbkv(ji,jj)) ) THEN 
     1245               IF( -zdeptht(ji,jj+1,mbkv(ji,jj)) >= -zdeptht(ji,jj,mbkv(ji,jj)) ) THEN 
    12501246                 jjs = jj + 1; jjd = jj 
    12511247               ELSE 
     
    12551251               ! integrate the pressure on the shallow side 
    12561252               jk1 = jk  
    1257                bhitns = 0 
    1258                DO WHILE ( -fsde3w(ji,jjs,jk1) > zvijk ) 
     1253               zbhitns = 0 
     1254               DO WHILE ( -zdeptht(ji,jjs,jk1) > zvijk ) 
    12591255                 IF( jk1 == mbkv(ji,jj) ) THEN 
    1260                    bhitns = 1 
     1256                   zbhitns = 1 
    12611257                   EXIT 
    12621258                 ENDIF 
    1263                  deps = min(fsde3w(ji,jjs,jk1+1), -zvijk) 
    1264                  pnss = pnss +                                      &  
    1265                         integ2(fsde3w(ji,jjs,jk1), deps,            & 
     1259                 zdeps = MIN(zdeptht(ji,jjs,jk1+1), -zvijk) 
     1260                 zpnss = zpnss +                                      &  
     1261                        integ2(zdeptht(ji,jjs,jk1), zdeps,            & 
    12661262                               asp(ji,jjs,jk1),    bsp(ji,jjs,jk1), & 
    12671263                               csp(ji,jjs,jk1),    dsp(ji,jjs,jk1) ) 
     
    12691265               END DO 
    12701266             
    1271                IF(bhitns == 1) THEN 
    1272                  zvijk = -fsde3w(ji,jjs,jk1) 
     1267               IF(zbhitns == 1) THEN 
     1268                 zvijk = -zdeptht(ji,jjs,jk1) 
    12731269               ENDIF 
    12741270 
    12751271               ! integrate the pressure on the deep side 
    12761272               jk1 = jk  
    1277                bhitns = 0 
    1278                DO WHILE ( -fsde3w(ji,jjd,jk1) < zvijk ) 
     1273               zbhitns = 0 
     1274               DO WHILE ( -zdeptht(ji,jjd,jk1) < zvijk ) 
    12791275                 IF( jk1 == 1 ) THEN 
    1280                    bhitns = 1 
     1276                   zbhitns = 1 
    12811277                   EXIT 
    12821278                 ENDIF 
    1283                  deps = max(fsde3w(ji,jjd,jk1-1), -zvijk) 
    1284                  pnsd = pnsd +                                        &  
    1285                         integ2(deps,              fsde3w(ji,jjd,jk1), & 
     1279                 zdeps = MAX(zdeptht(ji,jjd,jk1-1), -zvijk) 
     1280                 zpnsd = zpnsd +                                        &  
     1281                        integ2(zdeps,              zdeptht(ji,jjd,jk1), & 
    12861282                               asp(ji,jjd,jk1-1), bsp(ji,jjd,jk1-1), & 
    12871283                               csp(ji,jjd,jk1-1), dsp(ji,jjd,jk1-1) ) 
     
    12891285               END DO 
    12901286             
    1291                IF( bhitns == 1 ) THEN 
    1292                  deps = fsde3w(ji,jjd,1) + min(zvijk, sshn(ji,jjd)*znad) 
    1293                  rhdt1 = rhd(ji,jjd,1) - interp3(fsde3w(ji,jjd,1), asp(ji,jjd,1), & 
     1287               IF( zbhitns == 1 ) THEN 
     1288                 zdeps = zdeptht(ji,jjd,1) + MIN(zvijk, sshn(ji,jjd)*znad) 
     1289                 zrhdt1 = zrhh(ji,jjd,1) - interp3(zdeptht(ji,jjd,1), asp(ji,jjd,1), & 
    12941290                                                 bsp(ji,jjd,1),    csp(ji,jjd,1), & 
    1295                                                  dsp(ji,jjd,1) ) * deps 
    1296                  rhdt1 = max(rhdt1, 1000._wp - rau0)        ! no lighter than fresh water 
    1297                  pnsd  = pnsd + 0.5_wp * (rhd(ji,jjd,1) + rhdt1) * deps 
     1291                                                 dsp(ji,jjd,1) ) * zdeps 
     1292                 zrhdt1 = MAX(zrhdt1, 1000._wp - rau0)        ! no lighter than fresh water 
     1293                 zpnsd  = zpnsd + 0.5_wp * (zrhh(ji,jjd,1) + zrhdt1) * zdeps 
    12981294               ENDIF 
    12991295 
    1300  
    1301                dpdy1 = zcoef0 / e2v(ji,jj) * (zhpi(ji,jj+1,jk) - zhpi(ji,jj,jk)) 
     1296               ! update the momentum trends in v direction 
     1297 
     1298               zdpdy1 = zcoef0 / e2v(ji,jj) * (zhpi(ji,jj+1,jk) - zhpi(ji,jj,jk)) 
    13021299               IF( lk_vvl ) THEN 
    1303                    dpdy2 = zcoef0 / e2v(ji,jj) * & 
    1304                            ( REAL(jjs-jjd, wp) * (pnss + pnsd) + (sshn(ji,jj+1)-sshn(ji,jj)) )  
     1300                   zdpdy2 = zcoef0 / e2v(ji,jj) * & 
     1301                           ( REAL(jjs-jjd, wp) * (zpnss + zpnsd) + (sshn(ji,jj+1)-sshn(ji,jj)) )  
    13051302               ELSE 
    1306                    dpdy2 = zcoef0 / e2v(ji,jj) * REAL(jjs-jjd, wp) * (pnss + pnsd )  
     1303                   zdpdy2 = zcoef0 / e2v(ji,jj) * REAL(jjs-jjd, wp) * (zpnss + zpnsd )  
    13071304               ENDIF 
    13081305 
    1309                va(ji,jj,jk) = va(ji,jj,jk) + (dpdy1 + dpdy2)*& 
     1306               va(ji,jj,jk) = va(ji,jj,jk) + (zdpdy1 + zdpdy2)*& 
    13101307               &              vmask(ji,jj,jk)*tmask(ji,jj,jk)*tmask(ji,jj+1,jk) 
    13111308            ENDIF 
     
    13161313      END DO 
    13171314 
    1318       ! Restore fsde3w and rhd 
    1319       fsde3w(:,:,:) = fsde3w_tmp(:,:,:) 
    1320       rhd(:,:,:)    = rhd_tmp(:,:,:) 
    1321  
    13221315      ! 
    13231316      IF( wrk_not_released(3, 3,4,5,6,7,8,9,10,11) )   & 
    13241317         CALL ctl_stop('dyn:hpg_prj: failed to release workspace arrays') 
    13251318      ! 
     1319XXXXXXX 
    13261320   END SUBROUTINE hpg_prj 
    13271321 
     
    13621356      dsp = 0.0_wp 
    13631357       
     1358      DO ji = 1, jpi 
     1359        DO jj = 1, jpj 
     1360          IF (polynomial_type == 1) THEN     ! Constrained Cubic Spline 
     1361             DO jk = 2, jpkm1-1 
     1362                zdxtmp1 = xsp(ji,jj,jk)   - xsp(ji,jj,jk-1)   
     1363                zdxtmp2 = xsp(ji,jj,jk+1) - xsp(ji,jj,jk)   
     1364                zdf1    = ( fsp(ji,jj,jk)   - fsp(ji,jj,jk-1) ) / zdxtmp1 
     1365                zdf2    = ( fsp(ji,jj,jk+1) - fsp(ji,jj,jk)   ) / zdxtmp2 
     1366    
     1367                zalpha = ( zdxtmp1 + 2._wp * zdxtmp2 ) / ( zdxtmp1 + zdxtmp2 ) / 3._wp 
     1368               
     1369                IF(zdf1 * zdf2 <= 0._wp) THEN 
     1370                    zdf(jk) = 0._wp 
     1371                ELSE 
     1372                  zdf(jk) = zdf1 * zdf2 / ( ( 1._wp - zalpha ) * zdf1 + zalpha * zdf2 ) 
     1373                ENDIF 
     1374             END DO 
     1375 
     1376             zdf(1)     = 1.5_wp * ( fsp(ji,jj,2) - fsp(ji,jj,1) ) / & 
     1377                        &          ( xsp(ji,jj,2) - xsp(ji,jj,1) ) -  0.5_wp * zdf(2) 
     1378             zdf(jpkm1) = 1.5_wp * ( fsp(ji,jj,jpkm1) - fsp(ji,jj,jpkm1-1) ) / & 
     1379                        &          ( xsp(ji,jj,jpkm1) - xsp(ji,jj,jpkm1-1) ) - & 
     1380                        & 0.5_wp * zdf(jpkm1 - 1) 
     1381    
     1382             DO jk = 1, jpkm1 - 1 
     1383                zdxtmp = xsp(ji,jj,jk+1) - xsp(ji,jj,jk)  
     1384                ztmp1  = (zdf(jk+1) + 2._wp * zdf(jk)) / zdxtmp 
     1385                ztmp2  =  6._wp * (fsp(ji,jj,jk+1) - fsp(ji,jj,jk)) / zdxtmp / zdxtmp 
     1386                zddf1  = -2._wp * ztmp1 + ztmp2  
     1387                ztmp1  = (2._wp * zdf(jk+1) + zdf(jk)) / zdxtmp 
     1388                zddf2  =  2._wp * ztmp1 - ztmp2  
     1389    
     1390                dsp(ji,jj,jk) = (zddf2 - zddf1) / 6._wp / zdxtmp 
     1391                csp(ji,jj,jk) = ( xsp(ji,jj,jk+1) * zddf1 - xsp(ji,jj,jk)*zddf2 ) / 2._wp / zdxtmp 
     1392                bsp(ji,jj,jk) = ( fsp(ji,jj,jk+1) - fsp(ji,jj,jk) ) / zdxtmp - &  
     1393                              & csp(ji,jj,jk) * ( xsp(ji,jj,jk+1) + xsp(ji,jj,jk) ) - & 
     1394                              & dsp(ji,jj,jk) * ( xsp(ji,jj,jk+1)**2 + & 
     1395                              &                   xsp(ji,jj,jk+1) * xsp(ji,jj,jk) + & 
     1396                              &                   xsp(ji,jj,jk)**2 ) 
     1397                asp(ji,jj,jk) = fsp(ji,jj,jk) - bsp(ji,jj,jk) * xsp(ji,jj,jk) - & 
     1398                              &                 csp(ji,jj,jk) * xsp(ji,jj,jk)**2 - & 
     1399                              &                 dsp(ji,jj,jk) * xsp(ji,jj,jk)**3 
     1400             END DO 
     1401  
     1402          ELSE IF (polynomial_type == 2) THEN     ! Linear 
     1403  
     1404             DO jk = 1, jpkm1-1 
     1405                zdxtmp =xsp(ji,jj,jk+1) - xsp(ji,jj,jk)  
     1406                ztmp1 = fsp(ji,jj,jk+1) - fsp(ji,jj,jk) 
     1407    
     1408                dsp(ji,jj,jk) = 0._wp 
     1409                csp(ji,jj,jk) = 0._wp 
     1410                bsp(ji,jj,jk) = ztmp1 / zdxtmp 
     1411                asp(ji,jj,jk) = fsp(ji,jj,jk) - bsp(ji,jj,jk) * xsp(ji,jj,jk) 
     1412             END DO 
     1413 
     1414          ELSE 
     1415             CALL ctl_stop( 'invalid polynomial type in cspline' ) 
     1416          ENDIF 
     1417 
     1418        END DO 
     1419      END DO 
    13641420       
    1365       Do ji = 1, jpi 
    1366       Do jj = 1, jpj 
    1367  
    1368       If (polynomial_type == 1) Then     ! Constrained Cubic Spline 
    1369           Do jk = 2, jpkm1-1 
    1370              zdxtmp1 = xsp(ji,jj,jk)   - xsp(ji,jj,jk-1)   
    1371              zdxtmp2 = xsp(ji,jj,jk+1) - xsp(ji,jj,jk)   
    1372              zdf1    = ( fsp(ji,jj,jk)   - fsp(ji,jj,jk-1) ) / zdxtmp1 
    1373              zdf2    = ( fsp(ji,jj,jk+1) - fsp(ji,jj,jk)   ) / zdxtmp2 
    1374    
    1375              zalpha = ( zdxtmp1 + 2._wp * zdxtmp2 ) / ( zdxtmp1 + zdxtmp2 ) / 3._wp 
    1376               
    1377              If(zdf1 * zdf2 <= 0._wp) Then 
    1378                zdf(jk) = 0._wp 
    1379              Else 
    1380                zdf(jk) = zdf1 * zdf2 / ( ( 1._wp - zalpha ) * zdf1 + zalpha * zdf2 ) 
    1381              End If 
    1382           End Do 
    1383    
    1384           zdf(1)     = 1.5_wp * ( fsp(ji,jj,2) - fsp(ji,jj,1) ) / ( xsp(ji,jj,2) - xsp(ji,jj,1) ) - & 
    1385                     &  0.5_wp * zdf(2) 
    1386           zdf(jpkm1) = 1.5_wp * ( fsp(ji,jj,jpkm1) - fsp(ji,jj,jpkm1-1) ) / & 
    1387                     &           ( xsp(ji,jj,jpkm1) - xsp(ji,jj,jpkm1-1) ) - & 
    1388                     & 0.5_wp * zdf(jpkm1 - 1) 
    1389    
    1390           Do jk = 1, jpkm1 - 1 
    1391              zdxtmp = xsp(ji,jj,jk+1) - xsp(ji,jj,jk)  
    1392              ztmp1  = (zdf(jk+1) + 2._wp * zdf(jk)) / zdxtmp 
    1393              ztmp2  =  6._wp * (fsp(ji,jj,jk+1) - fsp(ji,jj,jk)) / zdxtmp / zdxtmp 
    1394              zddf1  = -2._wp * ztmp1 + ztmp2  
    1395              ztmp1  = (2._wp * zdf(jk+1) + zdf(jk)) / zdxtmp 
    1396              zddf2  =  2._wp * ztmp1 - ztmp2  
    1397    
    1398              dsp(ji,jj,jk) = (zddf2 - zddf1) / 6._wp / zdxtmp 
    1399              csp(ji,jj,jk) = ( xsp(ji,jj,jk+1) * zddf1 - xsp(ji,jj,jk)*zddf2 ) / 2._wp / zdxtmp 
    1400              bsp(ji,jj,jk) = ( fsp(ji,jj,jk+1) - fsp(ji,jj,jk) ) / zdxtmp - &  
    1401                            & csp(ji,jj,jk) * ( xsp(ji,jj,jk+1) + xsp(ji,jj,jk) ) - & 
    1402                            & dsp(ji,jj,jk) * ( xsp(ji,jj,jk+1)**2 + & 
    1403                            &                   xsp(ji,jj,jk+1) * xsp(ji,jj,jk) + & 
    1404                            &                   xsp(ji,jj,jk)**2 ) 
    1405              asp(ji,jj,jk) = fsp(ji,jj,jk) - bsp(ji,jj,jk) * xsp(ji,jj,jk) - & 
    1406                            &                 csp(ji,jj,jk) * xsp(ji,jj,jk)**2 - & 
    1407                            &                 dsp(ji,jj,jk) * xsp(ji,jj,jk)**3 
    1408           End Do 
    1409  
    1410        Else If (polynomial_type == 2) Then     ! Linear 
    1411  
    1412         Do jk = 1, jpkm1-1 
    1413            zdxtmp =xsp(ji,jj,jk+1) - xsp(ji,jj,jk)  
    1414            ztmp1 = fsp(ji,jj,jk+1) - fsp(ji,jj,jk) 
    1415    
    1416            dsp(ji,jj,jk) = 0._wp 
    1417            csp(ji,jj,jk) = 0._wp 
    1418            bsp(ji,jj,jk) = ztmp1 / zdxtmp 
    1419            asp(ji,jj,jk) = fsp(ji,jj,jk) - bsp(ji,jj,jk) * xsp(ji,jj,jk) 
    1420         End Do 
    1421  
    1422        Else 
    1423         CALL ctl_stop( 'invalid polynomial type in cspline' ) 
    1424       End If 
    1425  
    1426       End Do 
    1427       End Do 
    1428        
    1429    End Subroutine cspline 
     1421   END SUBROUTINE cspline 
    14301422 
    14311423 
     
    14511443      IF(abs(zdeltx) <= 10._wp * EPSILON(x)) THEN 
    14521444        f = 0.5_wp * (fl + fr) 
    1453        ELSE 
     1445      ELSE 
    14541446        f = ( (x - xl ) * fr - ( x - xr ) * fl ) / zdeltx 
    1455       END IF 
     1447      ENDIF 
    14561448       
    14571449   END FUNCTION interp1 
     
    14801472      !!                 ***  ROUTINE interp1  *** 
    14811473      !!        
    1482       !! ** Purpose :   deriavtive of a cubic spline function 
     1474      !! ** Purpose :   Calculate the first order of deriavtive of 
     1475      !!                a cubic spline function y=a+b*x+c*x^2+d*x^3 
    14831476      !!           
    1484       !! ** Method  :   
     1477      !! ** Method  :   f=dy/dx=b+2*c*x+3*d*x^2 
    14851478      !! 
    14861479      !!---------------------------------------------------------------------- 
Note: See TracChangeset for help on using the changeset viewer.