Ignore:
Timestamp:
Jan 18, 2021 11:15:37 AM (3 years ago)
Author:
raasch
Message:

maximum phase velocities are alwasy used for radiation boundary conditions, parameter use_cmax removed

File:
1 edited

Legend:

Unmodified
Added
Removed
  • palm/trunk/SOURCE/dynamics_mod.f90

    r4843 r4845  
    2424! -----------------
    2525! $Id$
     26! radiation boundary condition always uses maximum phase velocity, respective code for calculating
     27! the phase velocity is removed
     28!
     29! 4843 2021-01-15 15:22:11Z raasch
    2630! local namelist parameter added to switch off the module although the respective module namelist
    2731! appears in the namelist file
     
    8387
    8488    USE arrays_3d,                                                                                 &
    85         ONLY:  c_u, c_u_m, c_u_m_l, c_v, c_v_m, c_v_m_l, c_w, c_w_m, c_w_m_l,                      &
    86                diss,                                                                               &
     89        ONLY:  diss,                                                                               &
    8790               diss_p,                                                                             &
    8891               dzu,                                                                                &
     
    9497               q, q_1, q_2, q_p,                                                                   &
    9598               s, s_1, s_2, s_p,                                                                   &
    96                u, u_1, u_2, u_init, u_p, u_m_l, u_m_n, u_m_r, u_m_s,                               &
    97                v, v_1, v_2, v_p, v_init, v_m_l, v_m_n, v_m_r, v_m_s,                               &
    98                w, w_1, w_2, w_p, w_m_l, w_m_n, w_m_r, w_m_s,                                       &
     99               u, u_1, u_2, u_init, u_p,                                                           &
     100               v, v_1, v_2, v_p, v_init,                                                           &
     101               w, w_1, w_2, w_p,                                                                   &
    99102               zu
    100103
     
    138141               rans_mode,                                                                          &
    139142               rans_tke_e,                                                                         &
    140                tsc,                                                                                &
    141                use_cmax
     143               tsc
    142144
    143145    USE exchange_horiz_mod,                                                                        &
     
    896898    INTEGER(iwp) ::  m  !< running index surface elements
    897899
    898     REAL(wp)    ::  c_max !< maximum phase velocity allowed by CFL criterion, used for outflow boundary condition
    899     REAL(wp)    ::  denom !< horizontal gradient of velocity component normal to the outflow boundary
    900 
    901900!
    902901!-- Bottom boundary
     
    11281127!
    11291128!-- Radiation boundary conditions for the velocities at the respective outflow.
    1130 !-- The phase velocity is either assumed to the maximum phase velocity that ensures numerical
    1131 !-- stability (CFL-condition) or calculated after Orlanski(1976) and averaged along the outflow
    1132 !-- boundary.
     1129!-- The phase velocity is set to the maximum phase velocity that ensures numerical
     1130!-- stability (CFL-condition), i.e. a Courant number of one is assumed.
    11331131    IF ( bc_radiation_s )  THEN
    1134 
    1135        IF ( use_cmax )  THEN
    1136           u_p(:,-1,:) = u(:,0,:)
    1137           v_p(:,0,:)  = v(:,1,:)
    1138           w_p(:,-1,:) = w(:,0,:)
    1139        ELSEIF ( .NOT. use_cmax )  THEN
    1140 
    1141           c_max = dy / dt_3d
    1142 
    1143           c_u_m_l = 0.0_wp
    1144           c_v_m_l = 0.0_wp
    1145           c_w_m_l = 0.0_wp
    1146 
    1147           c_u_m = 0.0_wp
    1148           c_v_m = 0.0_wp
    1149           c_w_m = 0.0_wp
    1150 
    1151 !
    1152 !--       Calculate the phase speeds for u, v, and w, first local and then average along the outflow
    1153 !--       boundary.
    1154           DO  k = nzb+1, nzt+1
    1155              DO  i = nxl, nxr
    1156 
    1157                 denom = u_m_s(k,0,i) - u_m_s(k,1,i)
    1158 
    1159                 IF ( denom /= 0.0_wp )  THEN
    1160                    c_u(k,i) = -c_max * ( u(k,0,i) - u_m_s(k,0,i) ) / ( denom * tsc(2) )
    1161                    IF ( c_u(k,i) < 0.0_wp )  THEN
    1162                       c_u(k,i) = 0.0_wp
    1163                    ELSEIF ( c_u(k,i) > c_max )  THEN
    1164                       c_u(k,i) = c_max
    1165                    ENDIF
    1166                 ELSE
    1167                    c_u(k,i) = c_max
    1168                 ENDIF
    1169 
    1170                 denom = v_m_s(k,1,i) - v_m_s(k,2,i)
    1171 
    1172                 IF ( denom /= 0.0_wp )  THEN
    1173                    c_v(k,i) = -c_max * ( v(k,1,i) - v_m_s(k,1,i) ) / ( denom * tsc(2) )
    1174                    IF ( c_v(k,i) < 0.0_wp )  THEN
    1175                       c_v(k,i) = 0.0_wp
    1176                    ELSEIF ( c_v(k,i) > c_max )  THEN
    1177                       c_v(k,i) = c_max
    1178                    ENDIF
    1179                 ELSE
    1180                    c_v(k,i) = c_max
    1181                 ENDIF
    1182 
    1183                 denom = w_m_s(k,0,i) - w_m_s(k,1,i)
    1184 
    1185                 IF ( denom /= 0.0_wp )  THEN
    1186                    c_w(k,i) = -c_max * ( w(k,0,i) - w_m_s(k,0,i) ) / ( denom * tsc(2) )
    1187                    IF ( c_w(k,i) < 0.0_wp )  THEN
    1188                       c_w(k,i) = 0.0_wp
    1189                    ELSEIF ( c_w(k,i) > c_max )  THEN
    1190                       c_w(k,i) = c_max
    1191                    ENDIF
    1192                 ELSE
    1193                    c_w(k,i) = c_max
    1194                 ENDIF
    1195 
    1196                 c_u_m_l(k) = c_u_m_l(k) + c_u(k,i)
    1197                 c_v_m_l(k) = c_v_m_l(k) + c_v(k,i)
    1198                 c_w_m_l(k) = c_w_m_l(k) + c_w(k,i)
    1199 
    1200              ENDDO
    1201           ENDDO
    1202 
    1203 #if defined( __parallel )
    1204           IF ( collective_wait )  CALL MPI_BARRIER( comm1dx, ierr )
    1205           CALL MPI_ALLREDUCE( c_u_m_l(nzb+1), c_u_m(nzb+1), nzt-nzb, MPI_REAL, MPI_SUM, comm1dx,   &
    1206                               ierr )
    1207           IF ( collective_wait )  CALL MPI_BARRIER( comm1dx, ierr )
    1208           CALL MPI_ALLREDUCE( c_v_m_l(nzb+1), c_v_m(nzb+1), nzt-nzb, MPI_REAL, MPI_SUM, comm1dx,   &
    1209                               ierr )
    1210           IF ( collective_wait )  CALL MPI_BARRIER( comm1dx, ierr )
    1211           CALL MPI_ALLREDUCE( c_w_m_l(nzb+1), c_w_m(nzb+1), nzt-nzb, MPI_REAL, MPI_SUM, comm1dx,   &
    1212                               ierr )
    1213 #else
    1214           c_u_m = c_u_m_l
    1215           c_v_m = c_v_m_l
    1216           c_w_m = c_w_m_l
    1217 #endif
    1218 
    1219           c_u_m = c_u_m / (nx+1)
    1220           c_v_m = c_v_m / (nx+1)
    1221           c_w_m = c_w_m / (nx+1)
    1222 
    1223 !
    1224 !--       Save old timelevels for the next timestep
    1225           IF ( intermediate_timestep_count == 1 )  THEN
    1226              u_m_s(:,:,:) = u(:,0:1,:)
    1227              v_m_s(:,:,:) = v(:,1:2,:)
    1228              w_m_s(:,:,:) = w(:,0:1,:)
    1229           ENDIF
    1230 
    1231 !
    1232 !--       Calculate the new velocities
    1233           DO  k = nzb+1, nzt+1
    1234              DO  i = nxlg, nxrg
    1235                 u_p(k,-1,i) = u(k,-1,i) - dt_3d * tsc(2) * c_u_m(k) *                              &
    1236                                           ( u(k,-1,i) - u(k,0,i) ) * ddy
    1237 
    1238                 v_p(k,0,i)  = v(k,0,i)  - dt_3d * tsc(2) * c_v_m(k) *                              &
    1239                                           ( v(k,0,i) - v(k,1,i) ) * ddy
    1240 
    1241                 w_p(k,-1,i) = w(k,-1,i) - dt_3d * tsc(2) * c_w_m(k) *                              &
    1242                                           ( w(k,-1,i) - w(k,0,i) ) * ddy
    1243              ENDDO
    1244           ENDDO
    1245 
    1246 !
    1247 !--       Bottom boundary at the outflow
    1248           IF ( ibc_uv_b == 0 )  THEN
    1249              u_p(nzb,-1,:) = 0.0_wp
    1250              v_p(nzb,0,:)  = 0.0_wp
    1251           ELSE
    1252              u_p(nzb,-1,:) =  u_p(nzb+1,-1,:)
    1253              v_p(nzb,0,:)  =  v_p(nzb+1,0,:)
    1254           ENDIF
    1255           w_p(nzb,-1,:) = 0.0_wp
    1256 
    1257 !
    1258 !--       Top boundary at the outflow
    1259           IF ( ibc_uv_t == 0 )  THEN
    1260              u_p(nzt+1,-1,:) = u_init(nzt+1)
    1261              v_p(nzt+1,0,:)  = v_init(nzt+1)
    1262           ELSE
    1263              u_p(nzt+1,-1,:) = u_p(nzt,-1,:)
    1264              v_p(nzt+1,0,:)  = v_p(nzt,0,:)
    1265           ENDIF
    1266           w_p(nzt:nzt+1,-1,:) = 0.0_wp
    1267 
    1268        ENDIF
    1269 
     1132       u_p(:,-1,:) = u(:,0,:)
     1133       v_p(:,0,:)  = v(:,1,:)
     1134       w_p(:,-1,:) = w(:,0,:)
    12701135    ENDIF
    12711136
    12721137    IF ( bc_radiation_n )  THEN
    1273 
    1274        IF ( use_cmax )  THEN
    1275           u_p(:,ny+1,:) = u(:,ny,:)
    1276           v_p(:,ny+1,:) = v(:,ny,:)
    1277           w_p(:,ny+1,:) = w(:,ny,:)
    1278        ELSEIF ( .NOT. use_cmax )  THEN
    1279 
    1280           c_max = dy / dt_3d
    1281 
    1282           c_u_m_l = 0.0_wp
    1283           c_v_m_l = 0.0_wp
    1284           c_w_m_l = 0.0_wp
    1285 
    1286           c_u_m = 0.0_wp
    1287           c_v_m = 0.0_wp
    1288           c_w_m = 0.0_wp
    1289 
    1290 !
    1291 !--       Calculate the phase speeds for u, v, and w, first local and then average along the outflow
    1292 !--       boundary.
    1293           DO  k = nzb+1, nzt+1
    1294              DO  i = nxl, nxr
    1295 
    1296                 denom = u_m_n(k,ny,i) - u_m_n(k,ny-1,i)
    1297 
    1298                 IF ( denom /= 0.0_wp )  THEN
    1299                    c_u(k,i) = -c_max * ( u(k,ny,i) - u_m_n(k,ny,i) ) / ( denom * tsc(2) )
    1300                    IF ( c_u(k,i) < 0.0_wp )  THEN
    1301                       c_u(k,i) = 0.0_wp
    1302                    ELSEIF ( c_u(k,i) > c_max )  THEN
    1303                       c_u(k,i) = c_max
    1304                    ENDIF
    1305                 ELSE
    1306                    c_u(k,i) = c_max
    1307                 ENDIF
    1308 
    1309                 denom = v_m_n(k,ny,i) - v_m_n(k,ny-1,i)
    1310 
    1311                 IF ( denom /= 0.0_wp )  THEN
    1312                    c_v(k,i) = -c_max * ( v(k,ny,i) - v_m_n(k,ny,i) ) / ( denom * tsc(2) )
    1313                    IF ( c_v(k,i) < 0.0_wp )  THEN
    1314                       c_v(k,i) = 0.0_wp
    1315                    ELSEIF ( c_v(k,i) > c_max )  THEN
    1316                       c_v(k,i) = c_max
    1317                    ENDIF
    1318                 ELSE
    1319                    c_v(k,i) = c_max
    1320                 ENDIF
    1321 
    1322                 denom = w_m_n(k,ny,i) - w_m_n(k,ny-1,i)
    1323 
    1324                 IF ( denom /= 0.0_wp )  THEN
    1325                    c_w(k,i) = -c_max * ( w(k,ny,i) - w_m_n(k,ny,i) ) / ( denom * tsc(2) )
    1326                    IF ( c_w(k,i) < 0.0_wp )  THEN
    1327                       c_w(k,i) = 0.0_wp
    1328                    ELSEIF ( c_w(k,i) > c_max )  THEN
    1329                       c_w(k,i) = c_max
    1330                    ENDIF
    1331                 ELSE
    1332                    c_w(k,i) = c_max
    1333                 ENDIF
    1334 
    1335                 c_u_m_l(k) = c_u_m_l(k) + c_u(k,i)
    1336                 c_v_m_l(k) = c_v_m_l(k) + c_v(k,i)
    1337                 c_w_m_l(k) = c_w_m_l(k) + c_w(k,i)
    1338 
    1339              ENDDO
    1340           ENDDO
    1341 
    1342 #if defined( __parallel )
    1343           IF ( collective_wait )  CALL MPI_BARRIER( comm1dx, ierr )
    1344           CALL MPI_ALLREDUCE( c_u_m_l(nzb+1), c_u_m(nzb+1), nzt-nzb, MPI_REAL, MPI_SUM, comm1dx,   &
    1345                               ierr )
    1346           IF ( collective_wait )  CALL MPI_BARRIER( comm1dx, ierr )
    1347           CALL MPI_ALLREDUCE( c_v_m_l(nzb+1), c_v_m(nzb+1), nzt-nzb, MPI_REAL, MPI_SUM, comm1dx,   &
    1348                               ierr )
    1349           IF ( collective_wait )  CALL MPI_BARRIER( comm1dx, ierr )
    1350           CALL MPI_ALLREDUCE( c_w_m_l(nzb+1), c_w_m(nzb+1), nzt-nzb, MPI_REAL, MPI_SUM, comm1dx,   &
    1351                               ierr )
    1352 #else
    1353           c_u_m = c_u_m_l
    1354           c_v_m = c_v_m_l
    1355           c_w_m = c_w_m_l
    1356 #endif
    1357 
    1358           c_u_m = c_u_m / (nx+1)
    1359           c_v_m = c_v_m / (nx+1)
    1360           c_w_m = c_w_m / (nx+1)
    1361 
    1362 !
    1363 !--       Save old timelevels for the next timestep
    1364           IF ( intermediate_timestep_count == 1 )  THEN
    1365                 u_m_n(:,:,:) = u(:,ny-1:ny,:)
    1366                 v_m_n(:,:,:) = v(:,ny-1:ny,:)
    1367                 w_m_n(:,:,:) = w(:,ny-1:ny,:)
    1368           ENDIF
    1369 
    1370 !
    1371 !--       Calculate the new velocities
    1372           DO  k = nzb+1, nzt+1
    1373              DO  i = nxlg, nxrg
    1374                 u_p(k,ny+1,i) = u(k,ny+1,i) - dt_3d * tsc(2) * c_u_m(k) *                          &
    1375                                               ( u(k,ny+1,i) - u(k,ny,i) ) * ddy
    1376 
    1377                 v_p(k,ny+1,i) = v(k,ny+1,i)  - dt_3d * tsc(2) * c_v_m(k) *                         &
    1378                                                ( v(k,ny+1,i) - v(k,ny,i) ) * ddy
    1379 
    1380                 w_p(k,ny+1,i) = w(k,ny+1,i) - dt_3d * tsc(2) * c_w_m(k) *                          &
    1381                                               ( w(k,ny+1,i) - w(k,ny,i) ) * ddy
    1382              ENDDO
    1383           ENDDO
    1384 
    1385 !
    1386 !--       Bottom boundary at the outflow
    1387           IF ( ibc_uv_b == 0 )  THEN
    1388              u_p(nzb,ny+1,:) = 0.0_wp
    1389              v_p(nzb,ny+1,:) = 0.0_wp
    1390           ELSE
    1391              u_p(nzb,ny+1,:) =  u_p(nzb+1,ny+1,:)
    1392              v_p(nzb,ny+1,:) =  v_p(nzb+1,ny+1,:)
    1393           ENDIF
    1394           w_p(nzb,ny+1,:) = 0.0_wp
    1395 
    1396 !
    1397 !--       Top boundary at the outflow
    1398           IF ( ibc_uv_t == 0 )  THEN
    1399              u_p(nzt+1,ny+1,:) = u_init(nzt+1)
    1400              v_p(nzt+1,ny+1,:) = v_init(nzt+1)
    1401           ELSE
    1402              u_p(nzt+1,ny+1,:) = u_p(nzt,nyn+1,:)
    1403              v_p(nzt+1,ny+1,:) = v_p(nzt,nyn+1,:)
    1404           ENDIF
    1405           w_p(nzt:nzt+1,ny+1,:) = 0.0_wp
    1406 
    1407        ENDIF
    1408 
     1138       u_p(:,ny+1,:) = u(:,ny,:)
     1139       v_p(:,ny+1,:) = v(:,ny,:)
     1140       w_p(:,ny+1,:) = w(:,ny,:)
    14091141    ENDIF
    14101142
    14111143    IF ( bc_radiation_l )  THEN
    1412 
    1413        IF ( use_cmax )  THEN
    1414           u_p(:,:,0)  = u(:,:,1)
    1415           v_p(:,:,-1) = v(:,:,0)
    1416           w_p(:,:,-1) = w(:,:,0)
    1417        ELSEIF ( .NOT. use_cmax )  THEN
    1418 
    1419           c_max = dx / dt_3d
    1420 
    1421           c_u_m_l = 0.0_wp
    1422           c_v_m_l = 0.0_wp
    1423           c_w_m_l = 0.0_wp
    1424 
    1425           c_u_m = 0.0_wp
    1426           c_v_m = 0.0_wp
    1427           c_w_m = 0.0_wp
    1428 
    1429 !
    1430 !--       Calculate the phase speeds for u, v, and w, first local and then average along the outflow
    1431 !--       boundary.
    1432           DO  k = nzb+1, nzt+1
    1433              DO  j = nys, nyn
    1434 
    1435                 denom = u_m_l(k,j,1) - u_m_l(k,j,2)
    1436 
    1437                 IF ( denom /= 0.0_wp )  THEN
    1438                    c_u(k,j) = -c_max * ( u(k,j,1) - u_m_l(k,j,1) ) / ( denom * tsc(2) )
    1439                    IF ( c_u(k,j) < 0.0_wp )  THEN
    1440                       c_u(k,j) = 0.0_wp
    1441                    ELSEIF ( c_u(k,j) > c_max )  THEN
    1442                       c_u(k,j) = c_max
    1443                    ENDIF
    1444                 ELSE
    1445                    c_u(k,j) = c_max
    1446                 ENDIF
    1447 
    1448                 denom = v_m_l(k,j,0) - v_m_l(k,j,1)
    1449 
    1450                 IF ( denom /= 0.0_wp )  THEN
    1451                    c_v(k,j) = -c_max * ( v(k,j,0) - v_m_l(k,j,0) ) / ( denom * tsc(2) )
    1452                    IF ( c_v(k,j) < 0.0_wp )  THEN
    1453                       c_v(k,j) = 0.0_wp
    1454                    ELSEIF ( c_v(k,j) > c_max )  THEN
    1455                       c_v(k,j) = c_max
    1456                    ENDIF
    1457                 ELSE
    1458                    c_v(k,j) = c_max
    1459                 ENDIF
    1460 
    1461                 denom = w_m_l(k,j,0) - w_m_l(k,j,1)
    1462 
    1463                 IF ( denom /= 0.0_wp )  THEN
    1464                    c_w(k,j) = -c_max * ( w(k,j,0) - w_m_l(k,j,0) ) / ( denom * tsc(2) )
    1465                    IF ( c_w(k,j) < 0.0_wp )  THEN
    1466                       c_w(k,j) = 0.0_wp
    1467                    ELSEIF ( c_w(k,j) > c_max )  THEN
    1468                       c_w(k,j) = c_max
    1469                    ENDIF
    1470                 ELSE
    1471                    c_w(k,j) = c_max
    1472                 ENDIF
    1473 
    1474                 c_u_m_l(k) = c_u_m_l(k) + c_u(k,j)
    1475                 c_v_m_l(k) = c_v_m_l(k) + c_v(k,j)
    1476                 c_w_m_l(k) = c_w_m_l(k) + c_w(k,j)
    1477 
    1478              ENDDO
    1479           ENDDO
    1480 
    1481 #if defined( __parallel )
    1482           IF ( collective_wait )  CALL MPI_BARRIER( comm1dy, ierr )
    1483           CALL MPI_ALLREDUCE( c_u_m_l(nzb+1), c_u_m(nzb+1), nzt-nzb, MPI_REAL, MPI_SUM, comm1dy,   &
    1484                               ierr )
    1485           IF ( collective_wait )  CALL MPI_BARRIER( comm1dy, ierr )
    1486           CALL MPI_ALLREDUCE( c_v_m_l(nzb+1), c_v_m(nzb+1), nzt-nzb, MPI_REAL, MPI_SUM, comm1dy,   &
    1487                               ierr )
    1488           IF ( collective_wait )  CALL MPI_BARRIER( comm1dy, ierr )
    1489           CALL MPI_ALLREDUCE( c_w_m_l(nzb+1), c_w_m(nzb+1), nzt-nzb, MPI_REAL, MPI_SUM, comm1dy,   &
    1490                               ierr )
    1491 #else
    1492           c_u_m = c_u_m_l
    1493           c_v_m = c_v_m_l
    1494           c_w_m = c_w_m_l
    1495 #endif
    1496 
    1497           c_u_m = c_u_m / (ny+1)
    1498           c_v_m = c_v_m / (ny+1)
    1499           c_w_m = c_w_m / (ny+1)
    1500 
    1501 !
    1502 !--       Save old timelevels for the next timestep
    1503           IF ( intermediate_timestep_count == 1 )  THEN
    1504                 u_m_l(:,:,:) = u(:,:,1:2)
    1505                 v_m_l(:,:,:) = v(:,:,0:1)
    1506                 w_m_l(:,:,:) = w(:,:,0:1)
    1507           ENDIF
    1508 
    1509 !
    1510 !--       Calculate the new velocities
    1511           DO  k = nzb+1, nzt+1
    1512              DO  j = nysg, nyng
    1513                 u_p(k,j,0)  = u(k,j,0) - dt_3d * tsc(2) * c_u_m(k) *                               &
    1514                                          ( u(k,j,0) - u(k,j,1) ) * ddx
    1515 
    1516                 v_p(k,j,-1) = v(k,j,-1) - dt_3d * tsc(2) * c_v_m(k) *                              &
    1517                                           ( v(k,j,-1) - v(k,j,0) ) * ddx
    1518 
    1519                 w_p(k,j,-1) = w(k,j,-1) - dt_3d * tsc(2) * c_w_m(k) *                              &
    1520                                           ( w(k,j,-1) - w(k,j,0) ) * ddx
    1521              ENDDO
    1522           ENDDO
    1523 
    1524 !
    1525 !--       Bottom boundary at the outflow
    1526           IF ( ibc_uv_b == 0 )  THEN
    1527              u_p(nzb,:,0)  = 0.0_wp
    1528              v_p(nzb,:,-1) = 0.0_wp
    1529           ELSE
    1530              u_p(nzb,:,0)  =  u_p(nzb+1,:,0)
    1531              v_p(nzb,:,-1) =  v_p(nzb+1,:,-1)
    1532           ENDIF
    1533           w_p(nzb,:,-1) = 0.0_wp
    1534 
    1535 !
    1536 !--       Top boundary at the outflow
    1537           IF ( ibc_uv_t == 0 )  THEN
    1538              u_p(nzt+1,:,0)  = u_init(nzt+1)
    1539              v_p(nzt+1,:,-1) = v_init(nzt+1)
    1540           ELSE
    1541              u_p(nzt+1,:,0)  = u_p(nzt,:,0)
    1542              v_p(nzt+1,:,-1) = v_p(nzt,:,-1)
    1543           ENDIF
    1544           w_p(nzt:nzt+1,:,-1) = 0.0_wp
    1545 
    1546        ENDIF
    1547 
     1144       u_p(:,:,0)  = u(:,:,1)
     1145       v_p(:,:,-1) = v(:,:,0)
     1146       w_p(:,:,-1) = w(:,:,0)
    15481147    ENDIF
    15491148
    15501149    IF ( bc_radiation_r )  THEN
    1551 
    1552        IF ( use_cmax )  THEN
    1553           u_p(:,:,nx+1) = u(:,:,nx)
    1554           v_p(:,:,nx+1) = v(:,:,nx)
    1555           w_p(:,:,nx+1) = w(:,:,nx)
    1556        ELSEIF ( .NOT. use_cmax )  THEN
    1557 
    1558           c_max = dx / dt_3d
    1559 
    1560           c_u_m_l = 0.0_wp
    1561           c_v_m_l = 0.0_wp
    1562           c_w_m_l = 0.0_wp
    1563 
    1564           c_u_m = 0.0_wp
    1565           c_v_m = 0.0_wp
    1566           c_w_m = 0.0_wp
    1567 
    1568 !
    1569 !--       Calculate the phase speeds for u, v, and w, first local and then average along the outflow
    1570 !--       boundary.
    1571           DO  k = nzb+1, nzt+1
    1572              DO  j = nys, nyn
    1573 
    1574                 denom = u_m_r(k,j,nx) - u_m_r(k,j,nx-1)
    1575 
    1576                 IF ( denom /= 0.0_wp )  THEN
    1577                    c_u(k,j) = -c_max * ( u(k,j,nx) - u_m_r(k,j,nx) ) / ( denom * tsc(2) )
    1578                    IF ( c_u(k,j) < 0.0_wp )  THEN
    1579                       c_u(k,j) = 0.0_wp
    1580                    ELSEIF ( c_u(k,j) > c_max )  THEN
    1581                       c_u(k,j) = c_max
    1582                    ENDIF
    1583                 ELSE
    1584                    c_u(k,j) = c_max
    1585                 ENDIF
    1586 
    1587                 denom = v_m_r(k,j,nx) - v_m_r(k,j,nx-1)
    1588 
    1589                 IF ( denom /= 0.0_wp )  THEN
    1590                    c_v(k,j) = -c_max * ( v(k,j,nx) - v_m_r(k,j,nx) ) / ( denom * tsc(2) )
    1591                    IF ( c_v(k,j) < 0.0_wp )  THEN
    1592                       c_v(k,j) = 0.0_wp
    1593                    ELSEIF ( c_v(k,j) > c_max )  THEN
    1594                       c_v(k,j) = c_max
    1595                    ENDIF
    1596                 ELSE
    1597                    c_v(k,j) = c_max
    1598                 ENDIF
    1599 
    1600                 denom = w_m_r(k,j,nx) - w_m_r(k,j,nx-1)
    1601 
    1602                 IF ( denom /= 0.0_wp )  THEN
    1603                    c_w(k,j) = -c_max * ( w(k,j,nx) - w_m_r(k,j,nx) ) / ( denom * tsc(2) )
    1604                    IF ( c_w(k,j) < 0.0_wp )  THEN
    1605                       c_w(k,j) = 0.0_wp
    1606                    ELSEIF ( c_w(k,j) > c_max )  THEN
    1607                       c_w(k,j) = c_max
    1608                    ENDIF
    1609                 ELSE
    1610                    c_w(k,j) = c_max
    1611                 ENDIF
    1612 
    1613                 c_u_m_l(k) = c_u_m_l(k) + c_u(k,j)
    1614                 c_v_m_l(k) = c_v_m_l(k) + c_v(k,j)
    1615                 c_w_m_l(k) = c_w_m_l(k) + c_w(k,j)
    1616 
    1617              ENDDO
    1618           ENDDO
    1619 
    1620 #if defined( __parallel )
    1621           IF ( collective_wait )  CALL MPI_BARRIER( comm1dy, ierr )
    1622           CALL MPI_ALLREDUCE( c_u_m_l(nzb+1), c_u_m(nzb+1), nzt-nzb, MPI_REAL, MPI_SUM, comm1dy,   &
    1623                               ierr )
    1624           IF ( collective_wait )  CALL MPI_BARRIER( comm1dy, ierr )
    1625           CALL MPI_ALLREDUCE( c_v_m_l(nzb+1), c_v_m(nzb+1), nzt-nzb, MPI_REAL, MPI_SUM, comm1dy,   &
    1626                               ierr )
    1627           IF ( collective_wait )  CALL MPI_BARRIER( comm1dy, ierr )
    1628           CALL MPI_ALLREDUCE( c_w_m_l(nzb+1), c_w_m(nzb+1), nzt-nzb, MPI_REAL, MPI_SUM, comm1dy,   &
    1629                               ierr )
    1630 #else
    1631           c_u_m = c_u_m_l
    1632           c_v_m = c_v_m_l
    1633           c_w_m = c_w_m_l
    1634 #endif
    1635 
    1636           c_u_m = c_u_m / (ny+1)
    1637           c_v_m = c_v_m / (ny+1)
    1638           c_w_m = c_w_m / (ny+1)
    1639 
    1640 !
    1641 !--       Save old timelevels for the next timestep
    1642           IF ( intermediate_timestep_count == 1 )  THEN
    1643                 u_m_r(:,:,:) = u(:,:,nx-1:nx)
    1644                 v_m_r(:,:,:) = v(:,:,nx-1:nx)
    1645                 w_m_r(:,:,:) = w(:,:,nx-1:nx)
    1646           ENDIF
    1647 
    1648 !
    1649 !--       Calculate the new velocities
    1650           DO  k = nzb+1, nzt+1
    1651              DO  j = nysg, nyng
    1652                 u_p(k,j,nx+1) = u(k,j,nx+1) - dt_3d * tsc(2) * c_u_m(k) *                          &
    1653                                               ( u(k,j,nx+1) - u(k,j,nx) ) * ddx
    1654 
    1655                 v_p(k,j,nx+1) = v(k,j,nx+1) - dt_3d * tsc(2) * c_v_m(k) *                          &
    1656                                               ( v(k,j,nx+1) - v(k,j,nx) ) * ddx
    1657 
    1658                 w_p(k,j,nx+1) = w(k,j,nx+1) - dt_3d * tsc(2) * c_w_m(k) *                          &
    1659                                               ( w(k,j,nx+1) - w(k,j,nx) ) * ddx
    1660              ENDDO
    1661           ENDDO
    1662 
    1663 !
    1664 !--       Bottom boundary at the outflow
    1665           IF ( ibc_uv_b == 0 )  THEN
    1666              u_p(nzb,:,nx+1) = 0.0_wp
    1667              v_p(nzb,:,nx+1) = 0.0_wp
    1668           ELSE
    1669              u_p(nzb,:,nx+1) =  u_p(nzb+1,:,nx+1)
    1670              v_p(nzb,:,nx+1) =  v_p(nzb+1,:,nx+1)
    1671           ENDIF
    1672           w_p(nzb,:,nx+1) = 0.0_wp
    1673 
    1674 !
    1675 !--       Top boundary at the outflow
    1676           IF ( ibc_uv_t == 0 )  THEN
    1677              u_p(nzt+1,:,nx+1) = u_init(nzt+1)
    1678              v_p(nzt+1,:,nx+1) = v_init(nzt+1)
    1679           ELSE
    1680              u_p(nzt+1,:,nx+1) = u_p(nzt,:,nx+1)
    1681              v_p(nzt+1,:,nx+1) = v_p(nzt,:,nx+1)
    1682           ENDIF
    1683           w_p(nzt:nzt+1,:,nx+1) = 0.0_wp
    1684 
    1685        ENDIF
    1686 
     1150       u_p(:,:,nx+1) = u(:,:,nx)
     1151       v_p(:,:,nx+1) = v(:,:,nx)
     1152       w_p(:,:,nx+1) = w(:,:,nx)
    16871153    ENDIF
    16881154
    16891155 END SUBROUTINE dynamics_boundary_conditions
     1156
     1157
    16901158!--------------------------------------------------------------------------------------------------!
    16911159! Description:
     
    17801248
    17811249    ENDIF
    1782 
    17831250
    17841251 END SUBROUTINE dynamics_3d_data_averaging
Note: See TracChangeset for help on using the changeset viewer.