Ignore:
Timestamp:
May 30, 2017 5:47:52 PM (7 years ago)
Author:
suehring
Message:

Adjustments according new topography and surface-modelling concept implemented

File:
1 edited

Legend:

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

    r2119 r2232  
    2020! Current revisions:
    2121! ------------------
    22 !
     22! Adjustments to new topography and surface concept
    2323!
    2424! Former revisions:
     
    156156    USE indices,                                                               &
    157157        ONLY:  nbgp, ngp_2dh_outer, nx, nxl, nxlg, nxl_mg, nxr, nxrg, nxr_mg,  &
    158                ny, nys, nysg, nys_mg, nyn, nyng, nyn_mg, nzb, nzb_s_inner,     &
    159                nzb_u_inner, nzb_v_inner, nzb_w_inner, nzt, nzt_mg,             &
    160                rflags_s_inner
     158               ny, nys, nysg, nys_mg, nyn, nyng, nyn_mg, nzb, nzt, nzt_mg,     &
     159               wall_flags_0
    161160
    162161    USE kinds
     
    176175               weight_substep
    177176
     177    USE surface_mod,                                                           &
     178        ONLY :  bc_h
     179
    178180    IMPLICIT NONE
    179181
     
    181183    INTEGER(iwp) ::  j              !<
    182184    INTEGER(iwp) ::  k              !<
     185    INTEGER(iwp) ::  m              !<
    183186
    184187    REAL(wp)     ::  ddt_3d         !<
     
    269272!
    270273!--       Sum up the volume flow through the south/north boundary
    271           DO  k = nzb_u_inner(j,i)+1, nzt
    272              volume_flow_l(1) = volume_flow_l(1) + u(k,j,i) * dzw(k)
     274          DO  k = nzb+1, nzt
     275             volume_flow_l(1) = volume_flow_l(1) + u(k,j,i) * dzw(k)           &
     276                                     * MERGE( 1.0_wp, 0.0_wp,                  &
     277                                              BTEST( wall_flags_0(k,j,i), 1 )  &
     278                                            )
    273279          ENDDO
    274280       ENDDO
     
    285291
    286292       DO  j = nysg, nyng
    287           DO  k = nzb_u_inner(j,i)+1, nzt
    288              u(k,j,i) = u(k,j,i) + volume_flow_offset(1)
     293          DO  k = nzb+1, nzt
     294             u(k,j,i) = u(k,j,i) + volume_flow_offset(1)                       &
     295                                     * MERGE( 1.0_wp, 0.0_wp,                  &
     296                                              BTEST( wall_flags_0(k,j,i), 1 )  &
     297                                            )
    289298          ENDDO
    290299       ENDDO
     
    308317!
    309318!--       Sum up the volume flow through the south/north boundary
    310           DO  k = nzb_v_inner(j,i)+1, nzt
    311              volume_flow_l(2) = volume_flow_l(2) + v(k,j,i) * dzw(k)
     319          DO  k = nzb+1, nzt
     320             volume_flow_l(2) = volume_flow_l(2) + v(k,j,i) * dzw(k)           &
     321                                     * MERGE( 1.0_wp, 0.0_wp,                  &
     322                                              BTEST( wall_flags_0(k,j,i), 2 )  &
     323                                            )
    312324          ENDDO
    313325       ENDDO
     
    324336
    325337       DO  i = nxlg, nxrg
    326           DO  k = nzb_v_inner(j,i)+1, nzt
    327              v(k,j,i) = v(k,j,i) + volume_flow_offset(2)
     338          DO  k = nzb+1, nzt
     339             v(k,j,i) = v(k,j,i) + volume_flow_offset(2)                       &
     340                                     * MERGE( 1.0_wp, 0.0_wp,                  &
     341                                              BTEST( wall_flags_0(k,j,i), 2 )  &
     342                                            )
    328343          ENDDO
    329344       ENDDO
     
    350365       DO  i = nxl, nxr
    351366          DO  j = nys, nyn
    352              DO  k = nzb_w_inner(j,i)+1, nzt
    353                 w_l_l(k) = w_l_l(k) + w(k,j,i)
     367             DO  k = nzb+1, nzt
     368                w_l_l(k) = w_l_l(k) + w(k,j,i)                                 &
     369                                     * MERGE( 1.0_wp, 0.0_wp,                  &
     370                                              BTEST( wall_flags_0(k,j,i), 3 )  &
     371                                            )
    354372             ENDDO
    355373          ENDDO
     
    367385       DO  i = nxlg, nxrg
    368386          DO  j = nysg, nyng
    369              DO  k = nzb_w_inner(j,i)+1, nzt
    370                 w(k,j,i) = w(k,j,i) - w_l(k)
     387             DO  k = nzb+1, nzt
     388                w(k,j,i) = w(k,j,i) - w_l(k)                                   &
     389                                     * MERGE( 1.0_wp, 0.0_wp,                  &
     390                                              BTEST( wall_flags_0(k,j,i), 3 )  &
     391                                            )
    371392             ENDDO
    372393          ENDDO
     
    379400
    380401    IF ( psolver(1:9) == 'multigrid' )  THEN
    381        !$OMP PARALLEL DO SCHEDULE( STATIC )
     402       !$OMP PARALLEL DO SCHEDULE( STATIC ) PRIVATE (i,j,k)
    382403       DO  i = nxl-1, nxr+1
    383404          DO  j = nys-1, nyn+1
     
    388409       ENDDO
    389410    ELSE
    390        !$OMP PARALLEL DO SCHEDULE( STATIC )
     411       !$OMP PARALLEL DO SCHEDULE( STATIC ) PRIVATE (i,j,k)
    391412       DO  i = nxl, nxr
    392413          DO  j = nys, nyn
     
    406427    DO  i = nxl, nxr
    407428       DO  j = nys, nyn
    408           DO  k = nzb_s_inner(j,i)+1, nzt
     429          DO  k = nzb+1, nzt
    409430             d(k,j,i) = ( ( u(k,j,i+1) - u(k,j,i) ) * rho_air(k) * ddx +       &
    410431                          ( v(k,j+1,i) - v(k,j,i) ) * rho_air(k) * ddy +       &
    411432                          ( w(k,j,i)   * rho_air_zw(k) -                       &
    412433                            w(k-1,j,i) * rho_air_zw(k-1) ) * ddzw(k)           &
    413                         ) * ddt_3d * d_weight_pres
     434                        ) * ddt_3d * d_weight_pres                             &
     435                                   * MERGE( 1.0_wp, 0.0_wp,                    &
     436                                            BTEST( wall_flags_0(k,j,i), 0 )    &
     437                                          )
    414438          ENDDO
    415439!
    416440!--       Compute possible PE-sum of divergences for flow_statistics
    417           DO  k = nzb_s_inner(j,i)+1, nzt
    418              threadsum = threadsum + ABS( d(k,j,i) )
     441          DO  k = nzb+1, nzt
     442             threadsum = threadsum + ABS( d(k,j,i) )                           &
     443                                   * MERGE( 1.0_wp, 0.0_wp,                    &
     444                                            BTEST( wall_flags_0(k,j,i), 0 )    &
     445                                          )
    419446          ENDDO
    420447
     
    438465                          ( w(k,j,i)   * rho_air_zw(k) -                       &
    439466                            w(k-1,j,i) * rho_air_zw(k-1) ) * ddzw(k)           &
    440                         ) * ddt_3d * d_weight_pres * rflags_s_inner(k,j,i)
     467                        ) * ddt_3d * d_weight_pres                             &
     468                                   * MERGE( 1.0_wp, 0.0_wp,                    &
     469                                            BTEST( wall_flags_0(k,j,i), 0 )    &
     470                                          )     
    441471          ENDDO
    442472       ENDDO
     
    484514!--    Store computed perturbation pressure and set boundary condition in
    485515!--    z-direction
    486        !$OMP PARALLEL DO
     516       !$OMP PARALLEL DO PRIVATE (i,j,k)
    487517       DO  i = nxl, nxr
    488518          DO  j = nys, nyn
     
    499529       IF ( ibc_p_b == 1 )  THEN
    500530!
    501 !--       Neumann (dp/dz = 0)
    502           !$OMP PARALLEL DO
    503           DO  i = nxlg, nxrg
    504              DO  j = nysg, nyng
    505                 tend(nzb_s_inner(j,i),j,i) = tend(nzb_s_inner(j,i)+1,j,i)
    506              ENDDO
     531!--       Neumann (dp/dz = 0). Using surfae data type, first for non-natural
     532!--       surfaces, then for natural and urban surfaces
     533!--       Upward facing
     534          !$OMP PARALLEL DO PRIVATE( i, j, k )
     535          DO  m = 1, bc_h(0)%ns
     536             i             = bc_h(0)%i(m)           
     537             j             = bc_h(0)%j(m)
     538             k             = bc_h(0)%k(m)
     539             tend(k-1,j,i) = tend(k,j,i)
     540          ENDDO
     541!
     542!--       Downward facing
     543          !$OMP PARALLEL DO PRIVATE( i, j, k )
     544          DO  m = 1, bc_h(1)%ns
     545             i             = bc_h(1)%i(m)           
     546             j             = bc_h(1)%j(m)
     547             k             = bc_h(1)%k(m)
     548             tend(k+1,j,i) = tend(k,j,i)
    507549          ENDDO
    508550
    509551       ELSE
    510552!
    511 !--       Dirichlet
    512           !$OMP PARALLEL DO
    513           DO  i = nxlg, nxrg
    514              DO  j = nysg, nyng
    515                 tend(nzb_s_inner(j,i),j,i) = 0.0_wp
    516              ENDDO
     553!--       Dirichlet. Using surface data type, first for non-natural
     554!--       surfaces, then for natural and urban surfaces
     555!--       Upward facing
     556          !$OMP PARALLEL DO PRIVATE( i, j, k )
     557          DO  m = 1, bc_h(0)%ns
     558             i             = bc_h(0)%i(m)           
     559             j             = bc_h(0)%j(m)
     560             k             = bc_h(0)%k(m)
     561             tend(k-1,j,i) = 0.0_wp
     562          ENDDO
     563!
     564!--       Downward facing
     565          !$OMP PARALLEL DO PRIVATE( i, j, k )
     566          DO  m = 1, bc_h(1)%ns
     567             i             = bc_h(1)%i(m)           
     568             j             = bc_h(1)%j(m)
     569             k             = bc_h(1)%k(m)
     570             tend(k+1,j,i) = 0.0_wp
    517571          ENDDO
    518572
     
    524578!
    525579!--       Neumann
    526           !$OMP PARALLEL DO
     580          !$OMP PARALLEL DO PRIVATE (i,j,k)
    527581          DO  i = nxlg, nxrg
    528582             DO  j = nysg, nyng
     
    534588!
    535589!--       Dirichlet
    536           !$OMP PARALLEL DO
     590          !$OMP PARALLEL DO PRIVATE (i,j,k)
    537591          DO  i = nxlg, nxrg
    538592             DO  j = nysg, nyng
     
    646700       DO  j = nys, nyn
    647701
    648           DO  k = 1, nzt
    649              IF ( k > nzb_w_inner(j,i) )  THEN
    650                 w(k,j,i) = w(k,j,i) - dt_3d *                                 &
    651                            ( tend(k+1,j,i) - tend(k,j,i) ) * ddzu(k+1) *      &
    652                            weight_pres_l
    653              ENDIF
    654           ENDDO
    655 
    656           DO  k = 1, nzt
    657              IF ( k > nzb_u_inner(j,i) )  THEN
    658                 u(k,j,i) = u(k,j,i) - dt_3d *                                 &
    659                            ( tend(k,j,i) - tend(k,j,i-1) ) * ddx *            &
    660                            weight_pres_l
    661              ENDIF
    662           ENDDO
    663 
    664           DO  k = 1, nzt
    665              IF ( k > nzb_v_inner(j,i) )  THEN
    666                 v(k,j,i) = v(k,j,i) - dt_3d *                                 &
    667                            ( tend(k,j,i) - tend(k,j-1,i) ) * ddy *            &
    668                            weight_pres_l
    669              ENDIF
     702          DO  k = nzb+1, nzt
     703             w(k,j,i) = w(k,j,i) - dt_3d *                                     &
     704                           ( tend(k+1,j,i) - tend(k,j,i) ) * ddzu(k+1)         &
     705                                     * weight_pres_l                           &
     706                                     * MERGE( 1.0_wp, 0.0_wp,                  &
     707                                              BTEST( wall_flags_0(k,j,i), 3 )  &
     708                                            )
     709          ENDDO
     710
     711          DO  k = nzb+1, nzt
     712             u(k,j,i) = u(k,j,i) - dt_3d *                                     &
     713                           ( tend(k,j,i) - tend(k,j,i-1) ) * ddx               &
     714                                     * weight_pres_l                           &
     715                                     * MERGE( 1.0_wp, 0.0_wp,                  &
     716                                              BTEST( wall_flags_0(k,j,i), 1 )  &
     717                                            )
     718          ENDDO
     719
     720          DO  k = nzb+1, nzt
     721             v(k,j,i) = v(k,j,i) - dt_3d *                                     &
     722                           ( tend(k,j,i) - tend(k,j-1,i) ) * ddy               &
     723                                     * weight_pres_l                           &
     724                                     * MERGE( 1.0_wp, 0.0_wp,                  &
     725                                              BTEST( wall_flags_0(k,j,i), 2 )  &
     726                                            )
    670727          ENDDO                                                         
    671728
     
    676733!
    677734!-- Sum up the volume flow through the right and north boundary
    678     IF ( conserve_volume_flow  .AND.  bc_lr_cyc  .AND.  bc_ns_cyc  .AND.  &
     735    IF ( conserve_volume_flow  .AND.  bc_lr_cyc  .AND.  bc_ns_cyc  .AND.       &
    679736         nxr == nx )  THEN
    680737
     
    683740       DO  j = nys, nyn
    684741          !$OMP CRITICAL
    685           DO  k = nzb_u_inner(j,nx) + 1, nzt
    686              volume_flow_l(1) = volume_flow_l(1) + u(k,j,nx) * dzw(k)
     742          DO  k = nzb+1, nzt
     743             volume_flow_l(1) = volume_flow_l(1) + u(k,j,nxr) * dzw(k)         &
     744                                     * MERGE( 1.0_wp, 0.0_wp,                  &
     745                                              BTEST( wall_flags_0(k,j,nxr), 1 )&
     746                                            )
    687747          ENDDO
    688748          !$OMP END CRITICAL
     
    692752    ENDIF
    693753
    694     IF ( conserve_volume_flow  .AND.  bc_ns_cyc  .AND.  bc_lr_cyc  .AND.  &
     754    IF ( conserve_volume_flow  .AND.  bc_ns_cyc  .AND.  bc_lr_cyc  .AND.       &
    695755         nyn == ny )  THEN
    696756
     
    699759       DO  i = nxl, nxr
    700760          !$OMP CRITICAL
    701           DO  k = nzb_v_inner(ny,i) + 1, nzt
    702              volume_flow_l(2) = volume_flow_l(2) + v(k,ny,i) * dzw(k)
     761          DO  k = nzb+1, nzt
     762             volume_flow_l(2) = volume_flow_l(2) + v(k,nyn,i) * dzw(k)         &
     763                                     * MERGE( 1.0_wp, 0.0_wp,                  &
     764                                              BTEST( wall_flags_0(k,nyn,i), 2 )&
     765                                            )
    703766           ENDDO
    704767          !$OMP END CRITICAL
     
    727790       DO  i = nxl, nxr
    728791          DO  j = nys, nyn
    729              DO  k = nzb_u_inner(j,i) + 1, nzt
    730                 u(k,j,i) = u(k,j,i) + volume_flow_offset(1)
    731              ENDDO
    732              DO  k = nzb_v_inner(j,i) + 1, nzt
    733                 v(k,j,i) = v(k,j,i) + volume_flow_offset(2)
     792             DO  k = nzb+1, nzt
     793                u(k,j,i) = u(k,j,i) + volume_flow_offset(1)                    &
     794                                     * MERGE( 1.0_wp, 0.0_wp,                  &
     795                                              BTEST( wall_flags_0(k,j,i), 1 )  &
     796                                            )
     797             ENDDO
     798             DO  k = nzb+1, nzt
     799                v(k,j,i) = v(k,j,i) + volume_flow_offset(2)                    &
     800                                     * MERGE( 1.0_wp, 0.0_wp,                  &
     801                                              BTEST( wall_flags_0(k,j,i), 2 )  &
     802                                            )
    734803             ENDDO
    735804          ENDDO
     
    768837       DO  i = nxl, nxr
    769838          DO  j = nys, nyn
    770              DO  k = nzb_s_inner(j,i)+1, nzt
    771              d(k,j,i) = ( u(k,j,i+1) - u(k,j,i) ) * rho_air(k) * ddx +         &
    772                         ( v(k,j+1,i) - v(k,j,i) ) * rho_air(k) * ddy +         &
    773                         ( w(k,j,i)   * rho_air_zw(k) -                         &
    774                           w(k-1,j,i) * rho_air_zw(k-1) ) * ddzw(k)
     839             DO  k = nzb+1, nzt
     840             d(k,j,i) = ( ( u(k,j,i+1) - u(k,j,i) ) * rho_air(k) * ddx +       &
     841                          ( v(k,j+1,i) - v(k,j,i) ) * rho_air(k) * ddy +       &
     842                          ( w(k,j,i)   * rho_air_zw(k) -                       &
     843                            w(k-1,j,i) * rho_air_zw(k-1) ) * ddzw(k)           &
     844                        ) * MERGE( 1.0_wp, 0.0_wp,                             &
     845                                   BTEST( wall_flags_0(k,j,i), 0 )             &
     846                                 )
    775847             ENDDO
    776848             DO  k = nzb+1, nzt
     
    783855       DO  i = nxl, nxr
    784856          DO  j = nys, nyn
    785              DO  k = 1, nzt
     857             DO  k = nzb+1, nzt
    786858                d(k,j,i) = ( ( u(k,j,i+1) - u(k,j,i) ) * rho_air(k) * ddx +    &
    787859                             ( v(k,j+1,i) - v(k,j,i) ) * rho_air(k) * ddy +    &
    788860                             ( w(k,j,i)   * rho_air_zw(k) -                    &
    789861                               w(k-1,j,i) * rho_air_zw(k-1) ) * ddzw(k)        &
    790                            ) * rflags_s_inner(k,j,i)
     862                           ) * MERGE( 1.0_wp, 0.0_wp,                          &
     863                                   BTEST( wall_flags_0(k,j,i), 0 )             &
     864                                    )
    791865             ENDDO
    792866          ENDDO
Note: See TracChangeset for help on using the changeset viewer.