Ignore:
Timestamp:
Mar 22, 2007 9:54:05 AM (15 years ago)
Author:
raasch
Message:

preliminary update for changes concerning non-cyclic boundary conditions

File:
1 edited

Legend:

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

    r73 r75  
    44! Actual revisions:
    55! -----------------
    6 !
     6! Volume flow control for non-cyclic boundary conditions added (currently only
     7! for the north boundary!!), 2nd+3rd argument removed from exchange horiz
    78!
    89! Former revisions:
     
    5455       ALLOCATE( d(nzb:nzt+1,nys-1:nyn+1,nxl-1:nxr+1) )
    5556    ENDIF
     57
     58!
     59!-- Conserve the volume flow at the outflow in case of non-cyclic lateral
     60!-- boundary conditions
     61    IF ( conserve_volume_flow  .AND.  bc_ns == 'radiation/dirichlet')  THEN
     62
     63       volume_flow(2)   = 0.0
     64       volume_flow_l(2) = 0.0
     65
     66       IF ( nyn == ny )  THEN
     67          j = ny+1
     68          DO  i = nxl, nxr
     69!
     70!--          Sum up the volume flow through the north boundary
     71             DO  k = nzb_2d(j,i) + 1, nzt
     72                volume_flow_l(2) = volume_flow_l(2) + v(k,j,i) * dzu(k)
     73             ENDDO
     74          ENDDO
     75       ENDIF
     76#if defined( __parallel )   
     77       CALL MPI_ALLREDUCE( volume_flow_l(2), volume_flow(2), 1, MPI_REAL, &
     78                           MPI_SUM, comm1dx, ierr )   
     79#else
     80       volume_flow = volume_flow_l 
     81#endif
     82       volume_flow_offset(2) = ( volume_flow_initial(2) - volume_flow(2) )    &
     83                               / volume_flow_area(2)                         
     84
     85       IF ( outflow_n )  THEN
     86          j = nyn+1
     87          DO  i = nxl, nxr
     88             DO  k = nzb_v_inner(j,i) + 1, nzt
     89                v(k,j,i) = v(k,j,i) + volume_flow_offset(2)
     90             ENDDO
     91          ENDDO
     92       ENDIF
     93
     94       CALL exchange_horiz( v )
     95
     96    ENDIF
     97
    5698
    5799!
     
    322364!
    323365!--    Exchange boundaries for p
    324        CALL exchange_horiz( tend, 0, 0 )
     366       CALL exchange_horiz( tend )
    325367     
    326368    ELSEIF ( psolver == 'sor' )  THEN
     
    365407!-- Correction of the provisional velocities with the current perturbation
    366408!-- pressure just computed
    367     IF ( bc_lr /= 'cyclic'  .OR.  bc_ns /= 'cyclic' )  uvmean_outflow_l = 0.0
    368     IF ( conserve_volume_flow )  THEN
     409    IF ( conserve_volume_flow  .AND. &
     410         ( bc_lr == 'cyclic'  .OR.  bc_ns == 'cyclic' ) )  THEN
    369411       volume_flow_l(1) = 0.0
    370412       volume_flow_l(2) = 0.0
     
    393435
    394436!
    395 !--       Sum up the horizontal velocity along the outflow plane (in case
    396 !--       of non-cyclic boundary conditions). The respective mean velocity
    397 !--       is calculated from this in routine boundary_conds.
    398 !          IF ( outflow_l  .AND.  i == nxl )  THEN
    399 !             !$OMP CRITICAL
    400 !             DO  k = nzb, nzt+1
    401 !                uvmean_outflow_l(k) = uvmean_outflow_l(k) + v(k,j,nxl)
    402 !             ENDDO
    403 !             !$OMP END CRITICAL
    404 !          ELSEIF ( outflow_r  .AND.  i == nxr )  THEN
    405 !             !$OMP CRITICAL
    406 !             DO  k = nzb, nzt+1
    407 !                uvmean_outflow_l(k) = uvmean_outflow_l(k) + v(k,j,nxr)
    408 !             ENDDO
    409 !             !$OMP END CRITICAL
    410 !          ELSEIF ( outflow_s  .AND.  j == nys )  THEN
    411 !             !$OMP CRITICAL
    412 !             DO  k = nzb, nzt+1
    413 !                uvmean_outflow_l(k) = uvmean_outflow_l(k) + u(k,nys,i)
    414 !             ENDDO
    415 !             !$OMP END CRITICAL
    416 !          ELSEIF ( outflow_n  .AND.  j == nyn )  THEN
    417 !             !$OMP CRITICAL
    418 !             DO  k = nzb, nzt+1
    419 !                uvmean_outflow_l(k) = uvmean_outflow_l(k) + u(k,nyn,i)
    420 !             ENDDO
    421 !             !$OMP END CRITICAL
    422 !          ENDIF
    423 
    424 !
    425437!--       Sum up the volume flow through the right and north boundary
    426           IF ( conserve_volume_flow  .AND.  i == nx )  THEN
     438          IF ( conserve_volume_flow  .AND.  bc_lr == 'cyclic'  .AND. &
     439               i == nx )  THEN
    427440             !$OMP CRITICAL
    428441             DO  k = nzb_2d(j,i) + 1, nzt
     
    431444             !$OMP END CRITICAL
    432445          ENDIF
    433           IF ( conserve_volume_flow  .AND.  j == ny )  THEN
     446          IF ( conserve_volume_flow  .AND.  bc_ns == 'cyclic'  .AND. &
     447               j == ny )  THEN
    434448             !$OMP CRITICAL
    435449             DO  k = nzb_2d(j,i) + 1, nzt
     
    445459!
    446460!-- Conserve the volume flow
    447     IF ( conserve_volume_flow )  THEN
     461    IF ( conserve_volume_flow  .AND. &
     462         ( bc_lr == 'cyclic'  .OR.  bc_ns == 'cyclic' ) )  THEN
    448463
    449464#if defined( __parallel )   
     
    461476       DO  i = nxl, nxr
    462477          DO  j = nys, nyn
    463              DO  k = nzb_u_inner(j,i) + 1, nzt
    464                 u(k,j,i) = u(k,j,i) + volume_flow_offset(1)
    465              ENDDO
    466              DO  k = nzb_v_inner(j,i) + 1, nzt
    467                 v(k,j,i) = v(k,j,i) + volume_flow_offset(2)
    468              ENDDO
     478             IF ( bc_lr == 'cyclic' )  THEN
     479                DO  k = nzb_u_inner(j,i) + 1, nzt
     480                   u(k,j,i) = u(k,j,i) + volume_flow_offset(1)
     481                ENDDO
     482             ENDIF
     483             IF ( bc_ns == 'cyclic' )  THEN
     484                DO  k = nzb_v_inner(j,i) + 1, nzt
     485                   v(k,j,i) = v(k,j,i) + volume_flow_offset(2)
     486                ENDDO
     487             ENDIF
    469488          ENDDO
    470489       ENDDO
     
    475494!
    476495!-- Exchange of boundaries for the velocities
    477     CALL exchange_horiz( u, uxrp,    0 )
    478     CALL exchange_horiz( v,    0, vynp )
    479     CALL exchange_horiz( w,    0,    0 )
     496    CALL exchange_horiz( u )
     497    CALL exchange_horiz( v )
     498    CALL exchange_horiz( w )
    480499
    481500!
Note: See TracChangeset for help on using the changeset viewer.