1027
1028
1031
1033# ifdef DISTRIBUTE
1035# endif
1036
1037
1038
1039 integer, intent(in) :: ng, tile, model
1040 integer, intent(in) :: LBi, UBi, LBj, UBj, LBk, UBk
1041 integer, intent(in) :: IminS, ImaxS, JminS, JmaxS
1042 integer, intent(in) :: Nghost, NHsteps, NVsteps
1043
1044 real(r8), intent(in) :: DTsizeH, DTsizeV
1045
1046# ifdef ASSUMED_SHAPE
1047 real(r8), intent(in) :: pm(LBi:,LBj:)
1048 real(r8), intent(in) :: pn(LBi:,LBj:)
1049# ifdef GEOPOTENTIAL_HCONV
1050 real(r8), intent(in) :: on_r(LBi:,LBj:)
1051 real(r8), intent(in) :: om_p(LBi:,LBj:)
1052# else
1053 real(r8), intent(in) :: pmon_r(LBi:,LBj:)
1054 real(r8), intent(in) :: pnom_p(LBi:,LBj:)
1055# endif
1056# ifdef MASKING
1057# ifdef GEOPOTENTIAL_HCONV
1058 real(r8), intent(in) :: pmask(LBi:,LBj:)
1059 real(r8), intent(in) :: rmask(LBi:,LBj:)
1060 real(r8), intent(in) :: umask(LBi:,LBj:)
1061 real(r8), intent(in) :: vmask(LBi:,LBj:)
1062# else
1063 real(r8), intent(in) :: umask(LBi:,LBj:)
1064 real(r8), intent(in) :: pmask(LBi:,LBj:)
1065# endif
1066# endif
1067 real(r8), intent(in) :: Hz(LBi:,LBj:,:)
1068 real(r8), intent(in) :: z_r(LBi:,LBj:,:)
1069
1070 real(r8), intent(in) :: Kh(LBi:,LBj:)
1071 real(r8), intent(in) :: Kv(LBi:,LBj:,0:)
1072
1073 real(r8), intent(inout) :: ad_A(LBi:,LBj:,LBk:)
1074# else
1075 real(r8), intent(in) :: pm(LBi:UBi,LBj:UBj)
1076 real(r8), intent(in) :: pn(LBi:UBi,LBj:UBj)
1077# ifdef GEOPOTENTIAL_HCONV
1078 real(r8), intent(in) :: on_r(LBi:UBi,LBj:UBj)
1079 real(r8), intent(in) :: om_p(LBi:UBi,LBj:UBj)
1080# else
1081 real(r8), intent(in) :: pmon_r(LBi:UBi,LBj:UBj)
1082 real(r8), intent(in) :: pnom_p(LBi:UBi,LBj:UBj)
1083# endif
1084# ifdef MASKING
1085# ifdef GEOPOTENTIAL_HCONV
1086 real(r8), intent(in) :: pmask(LBi:UBi,LBj:UBj)
1087 real(r8), intent(in) :: rmask(LBi:UBi,LBj:UBj)
1088 real(r8), intent(in) :: umask(LBi:UBi,LBj:UBj)
1089 real(r8), intent(in) :: vmask(LBi:UBi,LBj:UBj)
1090# else
1091 real(r8), intent(in) :: umask(LBi:UBi,LBj:UBj)
1092 real(r8), intent(in) :: pmask(LBi:UBi,LBj:UBj)
1093# endif
1094# endif
1095 real(r8), intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
1096 real(r8), intent(in) :: z_r(LBi:UBi,LBj:UBj,N(ng))
1097
1098 real(r8), intent(in) :: Kh(LBi:UBi,LBj:UBj)
1099 real(r8), intent(in) :: Kv(LBi:UBi,LBj:UBj,0:UBk)
1100
1101 real(r8), intent(inout) :: ad_A(LBi:UBi,LBj:UBj,LBk:UBk)
1102# endif
1103
1104
1105
1106 integer :: Nnew, Nold, Nsav
1107 integer :: i, j, k, kk, kt, k1, k1b, k2, k2b, step
1108
1109 real(r8) :: adfac, adfac1, adfac2
1110 real(r8) :: cff, cff1, cff2, cff3, cff4
1111
1112 real(r8), dimension(LBi:UBi,LBj:UBj,LBk:UBk,2) :: ad_Awrk
1113
1114 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: Hfac
1115 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: ad_FE
1116 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: ad_FX
1117# ifdef VCONVOLUTION
1118# ifndef SPLINES_VCONV
1119 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,0:N(ng)) :: FC
1120# endif
1121# if !defined IMPLICIT_VCONV || defined SPLINES_VCONV
1122 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,N(ng)) :: oHz
1123# endif
1124# if defined IMPLICIT_VCONV || defined SPLINES_VCONV
1125 real(r8), dimension(IminS:ImaxS,0:N(ng)) :: BC
1126 real(r8), dimension(IminS:ImaxS,0:N(ng)) :: CF
1127# ifdef SPLINES_VCONV
1128 real(r8), dimension(IminS:ImaxS,0:N(ng)) :: FC
1129 real(r8), dimension(IminS:ImaxS,N(ng)) :: Hzk
1130# endif
1131 real(r8), dimension(IminS:ImaxS,0:N(ng)) :: ad_DC
1132# else
1133 real(r8), dimension(IminS:ImaxS,0:N(ng)) :: ad_FS
1134# endif
1135# endif
1136# ifdef GEOPOTENTIAL_HCONV
1137 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: dZdx
1138 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: dZde
1139
1140 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: dZdx_r
1141 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: dZde_p
1142 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: ad_FZ
1143 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: ad_dAdz
1144 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: ad_dAdx
1145 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: ad_dAde
1146# endif
1147
1148# include "set_bounds.h"
1149
1150
1151
1152
1153
1154 ad_awrk(lbi:ubi,lbj:ubj,lbk:ubk,1:2)=0.0_r8
1155# ifdef VCONVOLUTION
1156# ifdef IMPLICIT_VCONV
1157 ad_dc(imins:imaxs,0:
n(ng))=0.0_r8
1158# else
1159 ad_fs(imins:imaxs,0:
n(ng))=0.0_r8
1160# endif
1161# endif
1162 ad_fe(imins:imaxs,jmins:jmaxs)=0.0_r8
1163 ad_fx(imins:imaxs,jmins:jmaxs)=0.0_r8
1164# ifdef GEOPOTENTIAL_HCONV
1165 ad_fz(imins:imaxs,jmins:jmaxs,1:2)=0.0_r8
1166 ad_dadz(imins:imaxs,jmins:jmaxs,1:2)=0.0_r8
1167 ad_dadx(imins:imaxs,jmins:jmaxs,1:2)=0.0_r8
1168 ad_dade(imins:imaxs,jmins:jmaxs,1:2)=0.0_r8
1169# endif
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180 cff=dtsizeh*0.25_r8
1181 DO j=jstr-1,jend+1
1182 DO i=istru-1,iend+1
1183 hfac(i,j)=cff*(pm(i-1,j)+pm(i,j))*(pn(i-1,j)+pn(i,j))
1184# ifdef VCONVOLUTION
1185# ifndef SPLINES_VCONV
1186 fc(i,j,
n(ng))=0.0_r8
1188# ifdef IMPLICIT_VCONV
1189 fc(i,j,k)=-dtsizev*(kv(i-1,j,k)+kv(i,j,k))/ &
1190 & (z_r(i-1,j,k+1)+z_r(i,j,k+1)- &
1191 & z_r(i-1,j,k )-z_r(i,j,k ))
1192# else
1193 fc(i,j,k)=dtsizev*(kv(i-1,j,k)+kv(i,j,k))/ &
1194 & (z_r(i-1,j,k+1)+z_r(i,j,k+1)- &
1195 & z_r(i-1,j,k )-z_r(i,j,k ))
1196# endif
1197 END DO
1198 fc(i,j,0)=0.0_r8
1199# endif
1200# if !defined IMPLICIT_VCONV || defined SPLINES_VCONV
1202 ohz(i,j,k)=2.0_r8/(hz(i-1,j,k)+hz(i,j,k))
1203 END DO
1204# endif
1205# endif
1206 END DO
1207 END DO
1208 nold=1
1209 nnew=2
1210
1211
1212
1213
1214
1215# ifdef DISTRIBUTE
1216
1217
1218
1219
1220
1221
1223 & lbi, ubi, lbj, ubj, lbk, ubk, &
1224 & nghost, &
1226 & ad_a)
1227# endif
1228
1229
1230
1231
1233 & lbi, ubi, lbj, ubj, lbk, ubk, &
1234 & ad_a)
1236 DO j=jstr,jend
1237 DO i=istru,iend
1238
1239
1240 ad_awrk(i,j,k,nold)=ad_awrk(i,j,k,nold)+ad_a(i,j,k)
1241 ad_a(i,j,k)=0.0_r8
1242 END DO
1243 END DO
1244 END DO
1245
1246# ifdef VCONVOLUTION
1247# ifdef IMPLICIT_VCONV
1248# ifdef SPLINES_VCONV
1249
1250
1251
1252
1253
1254
1255 DO step=1,nvsteps
1256
1257
1258
1259 nsav=nnew
1260 nnew=nold
1261 nold=nsav
1262
1263
1264
1265
1266
1267
1268
1269 DO j=jstr,jend
1271 DO i=istru,iend
1272 hzk(i,k)=0.5_r8*(hz(i-1,j,k)+ &
1273 & hz(i ,j,k))
1274 END DO
1275 END DO
1276 cff1=1.0_r8/6.0_r8
1278 DO i=istru,iend
1279 fc(i,k)=cff1*hzk(i,k )-dtsizev*kv(i,j,k-1)*ohz(i,j,k )
1280 cf(i,k)=cff1*hzk(i,k+1)-dtsizev*kv(i,j,k+1)*ohz(i,j,k+1)
1281 END DO
1282 END DO
1283 DO i=istru,iend
1284 cf(i,0)=0.0_r8
1285 END DO
1286
1287 cff1=1.0_r8/3.0_r8
1289 DO i=istru,iend
1290 bc(i,k)=cff1*(hzk(i,k)+hzk(i,k+1))+ &
1291 & dtsizev*kv(i,j,k)*(ohz(i,j,k)+ohz(i,j,k+1))
1292 cff=1.0_r8/(bc(i,k)-fc(i,k)*cf(i,k-1))
1293 cf(i,k)=cff*cf(i,k)
1294 END DO
1295 END DO
1296
1297
1298
1300 DO i=istru,iend
1301
1302
1303
1304
1305 adfac=dtsizev*ohz(i,j,k)*ad_awrk(i,j,k,nnew)
1306 ad_dc(i,k-1)=ad_dc(i,k-1)-adfac
1307 ad_dc(i,k )=ad_dc(i,k )+adfac
1308 ad_awrk(i,j,k,nold)=ad_awrk(i,j,k,nold)+ &
1309 & ad_awrk(i,j,k,nnew)
1310 ad_awrk(i,j,k,nnew)=0.0_r8
1311
1312
1313 ad_dc(i,k)=ad_dc(i,k)*kv(i,j,k)
1314 END DO
1315 END DO
1317 DO i=istru,iend
1318
1319
1320 ad_dc(i,k+1)=ad_dc(i,k+1)-cf(i,k)*ad_dc(i,k)
1321 END DO
1322 END DO
1323 DO i=istru,iend
1324
1325
1326 ad_dc(i,
n(ng))=0.0_r8
1327 END DO
1328
1329
1330
1332 DO i=istru,iend
1333 cff=1.0_r8/(bc(i,k)-fc(i,k)*cf(i,k-1))
1334
1335
1336
1337
1338 adfac=cff*ad_dc(i,k)
1339 ad_awrk(i,j,k ,nold)=ad_awrk(i,j,k ,nold)-adfac
1340 ad_awrk(i,j,k+1,nold)=ad_awrk(i,j,k+1,nold)+adfac
1341 ad_dc(i,k-1)=ad_dc(i,k-1)-fc(i,k)*adfac
1342 ad_dc(i,k)=0.0_r8
1343 END DO
1344 END DO
1345 DO i=istru,iend
1346
1347
1348 ad_dc(i,0)=0.0_r8
1349 END DO
1350 END DO
1351 END DO
1352# else
1353
1354
1355
1356
1357
1358 DO step=1,nvsteps
1359
1360
1361
1362 nsav=nnew
1363 nnew=nold
1364 nold=nsav
1365
1366
1367
1368 DO j=jstr,jend
1370 DO i=istru,iend
1371 bc(i,k)=0.5*(hz(i-1,j,k)+hz(i,j,k))- &
1372 & fc(i,j,k)-fc(i,j,k-1)
1373 END DO
1374 END DO
1375
1376
1377
1378 DO i=istru,iend
1379 cff=1.0_r8/bc(i,1)
1380 cf(i,1)=cff*fc(i,j,1)
1381 END DO
1383 DO i=istru,iend
1384 cff=1.0_r8/(bc(i,k)-fc(i,j,k-1)*cf(i,k-1))
1385 cf(i,k)=cff*fc(i,j,k)
1386 END DO
1387 END DO
1388
1389
1391 DO i=istru,iend
1392# ifdef MASKING
1393
1394
1395 ad_awrk(i,j,k,nnew)=ad_awrk(i,j,k,nnew)*umask(i,j)
1396# endif
1397
1398
1399 ad_dc(i,k)=ad_dc(i,k)+ &
1400 & ad_awrk(i,j,k,nnew)
1401 ad_awrk(i,j,k,nnew)=0.0_r8
1402
1403
1404 ad_dc(i,k+1)=-cf(i,k)*ad_dc(i,k)
1405 END DO
1406 END DO
1407 DO i=istru,iend
1408# ifdef MASKING
1409
1410
1411 ad_awrk(i,j,
n(ng),nnew)=ad_awrk(i,j,
n(ng),nnew)*umask(i,j)
1412# endif
1413
1414
1415 ad_dc(i,
n(ng))=ad_dc(i,
n(ng))+ &
1416 & ad_awrk(i,j,
n(ng),nnew)
1417 ad_awrk(i,j,
n(ng),nnew)=0.0_r8
1418
1419
1420
1421
1422 adfac=ad_dc(i,
n(ng))/ &
1423 & (bc(i,
n(ng))-fc(i,j,
n(ng)-1)*cf(i,
n(ng)-1))
1424 ad_dc(i,
n(ng)-1)=ad_dc(i,
n(ng)-1)-fc(i,j,
n(ng)-1)*adfac
1425 ad_dc(i,
n(ng) )=adfac
1426 END DO
1427
1428
1429
1430
1431
1433 DO i=istru,iend
1434 cff=1.0_r8/(bc(i,k)-fc(i,j,k-1)*cf(i,k-1))
1435
1436
1437 adfac=cff*ad_dc(i,k)
1438 ad_dc(i,k-1)=ad_dc(i,k-1)-fc(i,j,k-1)*adfac
1439 ad_dc(i,k )=adfac
1440 END DO
1441 END DO
1442 DO i=istru,iend
1443 cff=1.0_r8/bc(i,1)
1444
1445
1446 ad_dc(i,1)=cff*ad_dc(i,1)
1447 END DO
1448
1449
1450
1452 DO i=istru,iend
1453 cff=0.5*(hz(i-1,j,k)+hz(i,j,k))
1454
1455
1456 ad_awrk(i,j,k,nold)=ad_awrk(i,j,k,nold)+cff*ad_dc(i,k)
1457 ad_dc(i,k)=0.0_r8
1458 END DO
1459 END DO
1460 END DO
1461 END DO
1462# endif
1463# else
1464
1465
1466
1467
1468
1469 DO step=1,nvsteps
1470
1471
1472
1473 nsav=nnew
1474 nnew=nold
1475 nold=nsav
1476
1477
1478
1479
1480 DO j=jstr,jend
1482 DO i=istru,iend
1483
1484
1485
1486
1487 adfac=ohz(i,j,k)*ad_awrk(i,j,k,nnew)
1488 ad_fs(i,k-1)=ad_fs(i,k-1)-adfac
1489 ad_fs(i,k )=ad_fs(i,k )+adfac
1490 ad_awrk(i,j,k,nold)=ad_awrk(i,j,k,nold)+ &
1491 & ad_awrk(i,j,k,nnew)
1492 ad_awrk(i,j,k,nnew)=0.0_r8
1493 END DO
1494 END DO
1495
1496
1497
1498
1499 DO i=istru,iend
1500
1501
1502 ad_fs(i,
n(ng))=0.0_r8
1503
1504
1505 ad_fs(i,0)=0.0_r8
1506 END DO
1508 DO i=istru,iend
1509# ifdef MASKING
1510
1511
1512 ad_fs(i,k)=ad_fs(i,k)*umask(i,j)
1513# endif
1514
1515
1516
1517 adfac=fc(i,j,k)*ad_fs(i,k)
1518 ad_awrk(i,j,k ,nold)=ad_awrk(i,j,k ,nold)-adfac
1519 ad_awrk(i,j,k+1,nold)=ad_awrk(i,j,k+1,nold)+adfac
1520 ad_fs(i,k)=0.0_r8
1521 END DO
1522 END DO
1523 END DO
1524 END DO
1525# endif
1526# endif
1527
1528
1529
1530
1531
1532 DO step=1,nhsteps
1533
1534
1535
1536 nsav=nnew
1537 nnew=nold
1538 nold=nsav
1539
1540
1541
1542# ifdef DISTRIBUTE
1543
1544
1545
1546
1547
1548
1550 & lbi, ubi, lbj, ubj, lbk, ubk, &
1551 & nghost, &
1553 & ad_awrk(:,:,:,nnew))
1554# endif
1555
1556
1557
1558
1560 & lbi, ubi, lbj, ubj, lbk, ubk, &
1561 & ad_awrk(:,:,:,nnew))
1562
1563# ifdef GEOPOTENTIAL_HCONV
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576 k1=2
1577 k2=1
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588 k1=k2
1589 k2=3-k1
1590 END DO
1591
1592 k_loop :
DO k=
n(ng),0,-1
1593
1594
1595
1596
1597 k2b=1
1598 DO kk=0,k
1599 k1b=k2b
1600 k2b=3-k1b
1601
1602
1603
1604
1605 IF (kk.lt.
n(ng))
THEN
1606 DO j=jstr,jend
1607 DO i=istru-1,iend+1
1608 cff=0.5_r8*(pm(i-1,j)+pm(i,j))
1609# ifdef MASKING
1610 cff=cff*umask(i,j)
1611# endif
1612 dzdx(i,j)=cff*(z_r(i ,j,kk+1)- &
1613 & z_r(i-1,j,kk+1))
1614 END DO
1615 END DO
1616 DO j=jstr,jend
1617 DO i=istru-1,iend
1618 dzdx_r(i,j,k2)=0.5_r8*(dzdx(i ,j)+ &
1619 & dzdx(i+1,j))
1620 END DO
1621 END DO
1622 IF (kk.eq.0) THEN
1623 DO j=jstr,jend
1624 DO i=istru-1,iend
1625 dzdx_r(i,j,k1b)=0.0_r8
1626 END DO
1627 END DO
1628 END IF
1629
1630 DO j=jstr,jend+1
1631 DO i=istru-1,iend
1632 cff=0.5_r8*(pn(i,j-1)+pn(i,j))
1633# ifdef MASKING
1634 cff=cff*vmask(i,j)
1635# endif
1636 dzde(i,j)=cff*(z_r(i,j ,kk+1)- &
1637 & z_r(i,j-1,kk+1))
1638 END DO
1639 END DO
1640 DO j=jstr,jend+1
1641 DO i=istru,iend
1642 dzde_p(i,j,k2)=0.5_r8*(dzde(i-1,j)+ &
1643 & dzde(i ,j))
1644 END DO
1645 END DO
1646 IF (kk.eq.0) THEN
1647 DO j=jstr,jend+1
1648 DO i=istru,iend
1649 dzde_p(i,j,k1b)=0.0_r8
1650 END DO
1651 END DO
1652 END IF
1653 END IF
1654 END DO
1655
1656 IF (k.gt.0) THEN
1657
1658
1659
1660 DO j=jstr,jend
1661 DO i=istru,iend
1662
1663
1664
1665
1666
1667
1668
1669 adfac1=hfac(i,j)*ad_awrk(i,j,k,nnew)
1670 adfac2=dtsizeh*ad_awrk(i,j,k,nnew)
1671 ad_fe(i,j )=ad_fe(i,j )-adfac1
1672 ad_fe(i,j+1)=ad_fe(i,j+1)+adfac1
1673 ad_fx(i-1,j)=ad_fx(i-1,j)-adfac1
1674 ad_fx(i ,j)=ad_fx(i ,j)+adfac1
1675 ad_fz(i,j,k1)=ad_fz(i,j,k1)-adfac2
1676 ad_fz(i,j,k2)=ad_fz(i,j,k2)+adfac2
1677 ad_awrk(i,j,k,nold)=ad_awrk(i,j,k,nold)+ &
1678 & ad_awrk(i,j,k,nnew)
1679 ad_awrk(i,j,k,nnew)=0.0_r8
1680 END DO
1681 END DO
1682
1683
1684
1685
1686 IF (k.lt.
n(ng))
THEN
1687 DO j=jstr,jend
1688 DO i=istru,iend
1689 cff=0.25_r8*(kh(i-1,j)+kh(i,j))
1690 cff1=min(dzde_p(i,j ,k1),0.0_r8)
1691 cff2=min(dzde_p(i,j+1,k2),0.0_r8)
1692 cff3=max(dzde_p(i,j ,k2),0.0_r8)
1693 cff4=max(dzde_p(i,j+1,k1),0.0_r8)
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705 adfac=cff*ad_fz(i,j,k2)
1706 ad_dadz(i,j,k2)=ad_dadz(i,j,k2)+ &
1707 & (cff1*cff1+ &
1708 & cff2*cff2+ &
1709 & cff3*cff3+ &
1710 & cff4*cff4)*adfac
1711 ad_dade(i,j ,k1)=ad_dade(i,j ,k1)-cff1*adfac
1712 ad_dade(i,j+1,k2)=ad_dade(i,j+1,k2)-cff2*adfac
1713 ad_dade(i,j ,k2)=ad_dade(i,j ,k2)-cff3*adfac
1714 ad_dade(i,j+1,k1)=ad_dade(i,j+1,k1)-cff4*adfac
1715
1716 cff1=min(dzdx_r(i-1,j,k1),0.0_r8)
1717 cff2=min(dzdx_r(i ,j,k2),0.0_r8)
1718 cff3=max(dzdx_r(i-1,j,k2),0.0_r8)
1719 cff4=max(dzdx_r(i ,j,k1),0.0_r8)
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730 ad_dadz(i,j,k2)=ad_dadz(i,j,k2)+ &
1731 & (cff1*cff1+ &
1732 & cff2*cff2+ &
1733 & cff3*cff3+ &
1734 & cff4*cff4)*adfac
1735 ad_dadx(i-1,j,k1)=ad_dadx(i-1,j,k1)-cff1*adfac
1736 ad_dadx(i ,j,k2)=ad_dadx(i ,j,k2)-cff2*adfac
1737 ad_dadx(i-1,j,k2)=ad_dadx(i-1,j,k2)-cff3*adfac
1738 ad_dadx(i ,j,k1)=ad_dadx(i ,j,k1)-cff4*adfac
1739 ad_fz(i,j,k2)=0.0_r8
1740 END DO
1741 END DO
1742 END IF
1743 DO j=jstr,jend+1
1744 DO i=istru,iend
1745 cff=0.0625_r8*(kh(i-1,j-1)+kh(i-1,j)+ &
1746 & kh(i ,j-1)+kh(i ,j))*om_p(i,j)
1747 cff1=min(dzde_p(i,j,k1),0.0_r8)
1748 cff2=max(dzde_p(i,j,k1),0.0_r8)
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758 adfac=cff*(hz(i-1,j-1,k)+hz(i-1,j,k)+ &
1759 & hz(i ,j-1,k)+hz(i ,j,k))*ad_fe(i,j)
1760 adfac1=adfac*0.5_r8*cff1
1761 adfac2=adfac*0.5_r8*cff2
1762 ad_dade(i,j,k1)=ad_dade(i,j,k1)+adfac
1763 ad_dadz(i,j-1,k1)=ad_dadz(i,j-1,k1)-adfac1
1764 ad_dadz(i,j ,k2)=ad_dadz(i,j ,k2)-adfac1
1765 ad_dadz(i,j-1,k2)=ad_dadz(i,j-1,k2)-adfac2
1766 ad_dadz(i,j ,k1)=ad_dadz(i,j ,k1)-adfac2
1767 ad_fe(i,j)=0.0_r8
1768 END DO
1769 END DO
1770 DO j=jstr,jend
1771 DO i=istru-1,iend
1772 cff=kh(i,j)*on_r(i,j)
1773 cff1=min(dzdx_r(i,j,k1),0.0_r8)
1774 cff2=max(dzdx_r(i,j,k1),0.0_r8)
1775
1776
1777
1778
1779
1780
1781
1782
1783 adfac=cff*hz(i,j,k)*ad_fx(i,j)
1784 adfac1=adfac*0.5_r8*cff1
1785 adfac2=adfac*0.5_r8*cff2
1786 ad_dadx(i,j,k1)=ad_dadx(i,j,k1)+adfac
1787 ad_dadz(i ,j,k1)=ad_dadz(i ,j,k1)-adfac1
1788 ad_dadz(i+1,j,k2)=ad_dadz(i+1,j,k2)-adfac1
1789 ad_dadz(i ,j,k2)=ad_dadz(i ,j,k2)-adfac2
1790 ad_dadz(i+1,j,k1)=ad_dadz(i+1,j,k1)-adfac2
1791 ad_fx(i,j)=0.0_r8
1792 END DO
1793 END DO
1794 END IF
1795 IF ((k.eq.0).or.(k.eq.
n(ng)))
THEN
1796 DO j=jstr-1,jend+1
1797 DO i=istru-1,iend+1
1798
1799
1800 ad_fz(i,j,k2)=0.0_r8
1801
1802
1803 ad_dadz(i,j,k2)=0.0_r8
1804 END DO
1805 END DO
1806 ELSE
1807 DO j=jstr-1,jend+1
1808 DO i=istru-1,iend+1
1809 cff=1.0_r8/(z_r(i,j,k+1)-z_r(i,j,k))
1810# ifdef MASKING
1811
1812
1813 ad_dadz(i,j,k2)=ad_dadz(i,j,k2)*umask(i,j)
1814# endif
1815
1816
1817
1818 adfac=cff*ad_dadz(i,j,k2)
1819 ad_awrk(i,j,k ,nold)=ad_awrk(i,j,k ,nold)-adfac
1820 ad_awrk(i,j,k+1,nold)=ad_awrk(i,j,k+1,nold)+adfac
1821 ad_dadz(i,j,k2)=0.0_r8
1822 END DO
1823 END DO
1824 END IF
1825 IF (k.lt.
n(ng))
THEN
1826 DO j=jstr,jend+1
1827 DO i=istru,iend
1828 cff=0.25_r8*(pn(i-1,j )+pn(i,j )+ &
1829 & pn(i-1,j-1)+pn(i,j-1))
1830# ifdef MASKING
1831
1832
1833 ad_dade(i,j,k2)=ad_dade(i,j,k2)*pmask(i,j)
1834
1835
1836
1837
1838 adfac=cff*ad_dade(i,j,k2)
1839 ad_awrk(i,j ,k+1,nold)=ad_awrk(i,j ,k+1,nold)+ &
1840 & umask(i,j )*adfac
1841 ad_awrk(i,j-1,k+1,nold)=ad_awrk(i,j-1,k+1,nold)- &
1842 & umask(i,j-1)*adfac
1843 ad_dade(i,j,k2)=0.0_r8
1844# else
1845
1846
1847
1848 adfac=cff*ad_dade(i,j,k2)
1849 ad_awrk(i,j ,k+1,nold)=ad_awrk(i,j ,k+1,nold)+ &
1850 & adfac
1851 ad_awrk(i,j-1,k+1,nold)=ad_awrk(i,j-1,k+1,nold)- &
1852 & adfac
1853 ad_dade(i,j,k2)=0.0_r8
1854# endif
1855 END DO
1856 END DO
1857 DO j=jstr,jend
1858 DO i=istru-1,iend
1859# ifdef MASKING
1860
1861
1862 ad_dadx(i,j,k2)=ad_dadx(i,j,k2)*rmask(i,j)
1863
1864
1865
1866
1867 adfac=pm(i,j)*ad_dadx(i,j,k2)
1868 ad_awrk(i ,j,k+1,nold)=ad_awrk(i ,j,k+1,nold)- &
1869 & umask(i ,j)*adfac
1870 ad_awrk(i+1,j,k+1,nold)=ad_awrk(i+1,j,k+1,nold)+ &
1871 & umask(i+1,j)*adfac
1872 ad_dadx(i,j,k2)=0.0_r8
1873# else
1874
1875
1876
1877 adfac=pm(i,j)*ad_dadx(i,j,k2)
1878 ad_awrk(i ,j,k+1,nold)=ad_awrk(i ,j,k+1,nold)- &
1879 & adfac
1880 ad_awrk(i+1,j,k+1,nold)=ad_awrk(i+1,j,k+1,nold)+ &
1881 & adfac
1882 ad_dadx(i,j,k2)=0.0_r8
1883# endif
1884 END DO
1885 END DO
1886 END IF
1887
1888
1889
1890 kt=k2
1891 k2=k1
1892 k1=kt
1893 END DO k_loop
1894
1895# else
1896
1897
1898
1900 DO j=jstr,jend
1901 DO i=istru,iend
1902
1903
1904
1905
1906
1907 adfac=hfac(i,j)*ad_awrk(i,j,k,nnew)
1908 ad_fe(i,j )=ad_fe(i,j )-adfac
1909 ad_fe(i,j+1)=ad_fe(i,j+1)+adfac
1910 ad_fx(i-1,j)=ad_fx(i-1,j)-adfac
1911 ad_fx(i ,j)=ad_fx(i ,j)+adfac
1912 ad_awrk(i,j,k,nold)=ad_awrk(i,j,k,nold)+ &
1913 & ad_awrk(i,j,k,nnew)
1914 ad_awrk(i,j,k,nnew)=0.0_r8
1915 END DO
1916 END DO
1917
1918
1919
1920 DO j=jstr,jend+1
1921 DO i=istru,iend
1922# ifdef MASKING
1923
1924
1925 ad_fe(i,j)=ad_fe(i,j)*pmask(i,j)
1926# endif
1927
1928
1929
1930
1931 adfac=pnom_p(i,j)*0.25_r8*(kh(i-1,j )+kh(i,j )+ &
1932 & kh(i-1,j-1)+kh(i,j-1))* &
1933 & ad_fe(i,j)
1934 ad_awrk(i,j-1,k,nold)=ad_awrk(i,j-1,k,nold)-adfac
1935 ad_awrk(i,j ,k,nold)=ad_awrk(i,j ,k,nold)+adfac
1936 ad_fe(i,j)=0.0_r8
1937 END DO
1938 END DO
1939 DO j=jstr,jend
1940 DO i=istru-1,iend
1941
1942
1943
1944 adfac=pmon_r(i,j)*kh(i,j)*ad_fx(i,j)
1945 ad_awrk(i ,j,k,nold)=ad_awrk(i ,j,k,nold)-adfac
1946 ad_awrk(i+1,j,k,nold)=ad_awrk(i+1,j,k,nold)+adfac
1947 ad_fx(i,j)=0.0_r8
1948 END DO
1949 END DO
1950 END DO
1951# endif
1952 END DO
1953
1954
1955
1956
1957
1959 DO j=jstr-1,jend+1
1960 DO i=istru-1,iend+1
1961
1962
1963 ad_a(i,j,k)=ad_a(i,j,k)+ad_awrk(i,j,k,nold)
1964 ad_awrk(i,j,k,nold)=0.0_r8
1965 END DO
1966 END DO
1967 END DO
1968# ifdef DISTRIBUTE
1969
1970
1971
1972
1973
1974
1976 & lbi, ubi, lbj, ubj, lbk, ubk, &
1977 & nghost, &
1979 & ad_a)
1980# endif
1981
1982
1983
1984
1986 & lbi, ubi, lbj, ubj, lbk, ubk, &
1987 & ad_a)
1988
1989 RETURN
subroutine ad_dabc_u3d_tile(ng, tile, lbi, ubi, lbj, ubj, lbk, ubk, ad_a)