Ignore:
Timestamp:
Sep 14, 2012 2:35:53 PM (9 years ago)
Author:
raasch
Message:

subdomains must have identical size, i.e. grid_matching = "match" not allowed any more
parameter grid_matching removed
some obsolete variables removed

File:
1 edited

Legend:

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

    r1002 r1003  
    11 SUBROUTINE init_pegrid
    2 
    32!------------------------------------------------------------------------------!
    43! Current revisions:
    54! -----------------
    6 !
     5! subdomains must have identical size (grid matching = "match" removed)
    76!
    87! Former revisions:
     
    255254
    256255!
    257 !-- Find a grid (used for array d) which will match the transposition demands
    258     IF ( grid_matching == 'strict' )  THEN
    259 
    260        nxa = nx;  nya = ny;  nza = nz
    261 
    262     ELSE
    263 
    264        found = .FALSE.
    265    xn: DO  nxa = nx, 2*nx
    266 !
    267 !--       Meet conditions for nx
    268           IF ( MOD( nxa+1, pdims(1) ) /= 0 .OR. &
    269                MOD( nxa+1, pdims(2) ) /= 0 )  CYCLE xn
    270 
    271       yn: DO  nya = ny, 2*ny
    272 !
    273 !--          Meet conditions for ny
    274              IF ( MOD( nya+1, pdims(2) ) /= 0 .OR. &
    275                   MOD( nya+1, pdims(1) ) /= 0 )  CYCLE yn
    276 
    277 
    278          zn: DO  nza = nz, 2*nz
    279 !
    280 !--             Meet conditions for nz
    281                 IF ( ( MOD( nza, pdims(1) ) /= 0  .AND.  pdims(1) /= 1  .AND. &
    282                        pdims(2) /= 1 )  .OR.                                  &
    283                      ( MOD( nza, pdims(2) ) /= 0  .AND.  dt_dosp /= 9999999.9 &
    284                      ) )  THEN
    285                    CYCLE zn
    286                 ELSE
    287                    found = .TRUE.
    288                    EXIT xn
    289                 ENDIF
    290 
    291              ENDDO zn
    292 
    293           ENDDO yn
    294 
    295        ENDDO xn
    296 
    297        IF ( .NOT. found )  THEN
    298           message_string = 'no matching grid for transpositions found'
    299           CALL message( 'init_pegrid', 'PA0224', 1, 2, 0, 6, 0 )
    300        ENDIF
    301 
    302     ENDIF
    303 
    304 !
    305 !-- Calculate array bounds in x-direction for every PE.
    306 !-- The last PE along x may get less grid points than the others
     256!-- Calculate array bounds along x-direction for every PE.
    307257    ALLOCATE( nxlf(0:pdims(1)-1), nxrf(0:pdims(1)-1), nynf(0:pdims(2)-1), &
    308               nysf(0:pdims(2)-1), nnx_pe(0:pdims(1)-1), nny_pe(0:pdims(2)-1) )
    309 
    310     IF ( MOD( nxa+1 , pdims(1) ) /= 0 )  THEN
     258              nysf(0:pdims(2)-1) )
     259
     260    IF ( MOD( nx+1 , pdims(1) ) /= 0 )  THEN
    311261       WRITE( message_string, * ) 'x-direction: gridpoint number (',nx+1,') ',&
    312262                               'is not an& integral divisor of the number ',  &
     
    314264       CALL message( 'init_pegrid', 'PA0225', 1, 2, 0, 6, 0 )
    315265    ELSE
    316        nnx  = ( nxa + 1 ) / pdims(1)
     266       nnx  = ( nx + 1 ) / pdims(1)
    317267       IF ( nnx*pdims(1) - ( nx + 1) > nnx )  THEN
    318268          WRITE( message_string, * ) 'x-direction: nx does not match the',    &
     
    329279       nxlf(i)   = i * nnx
    330280       nxrf(i)   = ( i + 1 ) * nnx - 1
    331        nnx_pe(i) = MIN( nx, nxrf(i) ) - nxlf(i) + 1
    332281    ENDDO
    333282
    334283!
    335284!-- Calculate array bounds in y-direction for every PE.
    336     IF ( MOD( nya+1 , pdims(2) ) /= 0 )  THEN
     285    IF ( MOD( ny+1 , pdims(2) ) /= 0 )  THEN
    337286       WRITE( message_string, * ) 'y-direction: gridpoint number (',ny+1,') ', &
    338287                           'is not an& integral divisor of the number of',     &
     
    340289       CALL message( 'init_pegrid', 'PA0227', 1, 2, 0, 6, 0 )
    341290    ELSE
    342        nny  = ( nya + 1 ) / pdims(2)
     291       nny  = ( ny + 1 ) / pdims(2)
    343292       IF ( nny*pdims(2) - ( ny + 1) > nny )  THEN
    344293          WRITE( message_string, * ) 'y-direction: ny does not match the',    &
     
    355304       nysf(j)   = j * nny
    356305       nynf(j)   = ( j + 1 ) * nny - 1
    357        nny_pe(j) = MIN( ny, nynf(j) ) - nysf(j) + 1
    358306    ENDDO
    359307
    360308!
    361309!-- Local array bounds of the respective PEs
    362     nxl  = nxlf(pcoord(1))
    363     nxra = nxrf(pcoord(1))
    364     nxr  = MIN( nx, nxra )
    365     nys  = nysf(pcoord(2))
    366     nyna = nynf(pcoord(2))
    367     nyn  = MIN( ny, nyna )
    368     nzb  = 0
    369     nzta = nza
    370     nzt  = MIN( nz, nzta )
    371     nnz  = nza
     310    nxl = nxlf(pcoord(1))
     311    nxr = nxrf(pcoord(1))
     312    nys = nysf(pcoord(2))
     313    nyn = nynf(pcoord(2))
     314    nzb = 0
     315    nzt = nz
     316    nnz = nz
    372317
    373318!
     
    390335    IF ( pdims(2) /= 1 )  THEN
    391336
    392        nys_x  = nys
    393        nyn_xa = nyna
    394        nyn_x  = nyn
    395        nny_x  = nny
    396        IF ( MOD( nza , pdims(1) ) /= 0 )  THEN
     337       nys_x = nys
     338       nyn_x = nyn
     339       nny_x = nny
     340       IF ( MOD( nz , pdims(1) ) /= 0 )  THEN
    397341          WRITE( message_string, * ) 'transposition z --> x:',                &
    398342                       '&nz=',nz,' is not an integral divisior of pdims(1)=', &
     
    400344          CALL message( 'init_pegrid', 'PA0230', 1, 2, 0, 6, 0 )
    401345       ENDIF
    402        nnz_x  = nza / pdims(1)
    403        nzb_x  = 1 + myidx * nnz_x
    404        nzt_xa = ( myidx + 1 ) * nnz_x
    405        nzt_x  = MIN( nzt, nzt_xa )
    406 
     346       nnz_x = nz / pdims(1)
     347       nzb_x = 1 + myidx * nnz_x
     348       nzt_x = ( myidx + 1 ) * nnz_x
    407349       sendrecvcount_zx = nnx * nny * nnz_x
    408350
     
    412354!---   the next step  x --> y
    413355!---   WARNING: This case has still to be clarified!!!!!!!!!!!!
    414        nnz_x  = 1
    415        nzb_x  = 1
    416        nzt_xa = 1
    417        nzt_x  = 1
    418        nny_x  = nny
     356       nnz_x = 1
     357       nzb_x = 1
     358       nzt_x = 1
     359       nny_x = nny
    419360
    420361    ENDIF
     
    422363!
    423364!-- 2. transposition  x --> y
    424     nnz_y  = nnz_x
    425     nzb_y  = nzb_x
    426     nzt_ya = nzt_xa
    427     nzt_y  = nzt_x
    428     IF ( MOD( nxa+1 , pdims(2) ) /= 0 )  THEN
     365    nnz_y = nnz_x
     366    nzb_y = nzb_x
     367    nzt_y = nzt_x
     368    IF ( MOD( nx+1 , pdims(2) ) /= 0 )  THEN
    429369       WRITE( message_string, * ) 'transposition x --> y:',                &
    430370                         '&nx+1=',nx+1,' is not an integral divisor of ',&
     
    432372       CALL message( 'init_pegrid', 'PA0231', 1, 2, 0, 6, 0 )
    433373    ENDIF
    434     nnx_y = (nxa+1) / pdims(2)
     374    nnx_y = (nx+1) / pdims(2)
    435375    nxl_y = myidy * nnx_y
    436     nxr_ya = ( myidy + 1 ) * nnx_y - 1
    437     nxr_y  = MIN( nx, nxr_ya )
    438 
     376    nxr_y = ( myidy + 1 ) * nnx_y - 1
    439377    sendrecvcount_xy = nnx_y * nny_x * nnz_y
    440378
     
    447385!--    This transposition is not neccessary in case of a 1d-decomposition
    448386!--    along x, except that the uptream-spline method is switched on
    449        nnx_z  = nnx_y
    450        nxl_z  = nxl_y
    451        nxr_za = nxr_ya
    452        nxr_z  = nxr_y
    453        IF ( MOD( nya+1 , pdims(1) ) /= 0 )  THEN
     387       nnx_z = nnx_y
     388       nxl_z = nxl_y
     389       nxr_z = nxr_y
     390       IF ( MOD( ny+1 , pdims(1) ) /= 0 )  THEN
    454391          WRITE( message_string, * ) 'transposition y --> z:',            &
    455392                            '& ny+1=',ny+1,' is not an integral divisor of ',&
     
    457394          CALL message( 'init_pegrid', 'PA0232', 1, 2, 0, 6, 0 )
    458395       ENDIF
    459        nny_z  = (nya+1) / pdims(1)
    460        nys_z  = myidx * nny_z
    461        nyn_za = ( myidx + 1 ) * nny_z - 1
    462        nyn_z  = MIN( ny, nyn_za )
    463 
     396       nny_z = (ny+1) / pdims(1)
     397       nys_z = myidx * nny_z
     398       nyn_z = ( myidx + 1 ) * nny_z - 1
    464399       sendrecvcount_yz = nnx_y * nny_z * nnz_y
    465400
     
    467402!
    468403!--    x --> y. This condition must be fulfilled for a 1D-decomposition along x
    469        IF ( MOD( nya+1 , pdims(1) ) /= 0 )  THEN
     404       IF ( MOD( ny+1 , pdims(1) ) /= 0 )  THEN
    470405          WRITE( message_string, * ) 'transposition x --> y:',               &
    471406                            '& ny+1=',ny+1,' is not an integral divisor of ',&
     
    479414!-- Indices for direct transpositions z --> y (used for calculating spectra)
    480415    IF ( dt_dosp /= 9999999.9 )  THEN
    481        IF ( MOD( nza, pdims(2) ) /= 0 )  THEN
     416       IF ( MOD( nz, pdims(2) ) /= 0 )  THEN
    482417          WRITE( message_string, * ) 'direct transposition z --> y (needed ', &
    483418                    'for spectra):& nz=',nz,' is not an integral divisor of ',&
     
    485420          CALL message( 'init_pegrid', 'PA0234', 1, 2, 0, 6, 0 )
    486421       ELSE
    487           nxl_yd  = nxl
    488           nxr_yda = nxra
    489           nxr_yd  = nxr
    490           nzb_yd  = 1 + myidy * ( nza / pdims(2) )
    491           nzt_yda = ( myidy + 1 ) * ( nza / pdims(2) )
    492           nzt_yd  = MIN( nzt, nzt_yda )
    493 
    494           sendrecvcount_zyd = nnx * nny * ( nza / pdims(2) )
     422          nxl_yd = nxl
     423          nxr_yd = nxr
     424          nzb_yd = 1 + myidy * ( nz / pdims(2) )
     425          nzt_yd = ( myidy + 1 ) * ( nz / pdims(2) )
     426          sendrecvcount_zyd = nnx * nny * ( nz / pdims(2) )
    495427       ENDIF
    496428    ENDIF
     
    500432!-- of a 1d-decomposition along x)
    501433    IF ( pdims(2) == 1 )  THEN
    502        nny_x  = nny / pdims(1)
    503        nys_x  = myid * nny_x
    504        nyn_xa = ( myid + 1 ) * nny_x - 1
    505        nyn_x  = MIN( ny, nyn_xa )
    506        nzb_x  = 1
    507        nzt_xa = nza
    508        nzt_x  = nz
    509        sendrecvcount_xy = nnx * nny_x * nza
     434       nny_x = nny / pdims(1)
     435       nys_x = myid * nny_x
     436       nyn_x = ( myid + 1 ) * nny_x - 1
     437       nzb_x = 1
     438       nzt_x = nz
     439       sendrecvcount_xy = nnx * nny_x * nz
    510440    ENDIF
    511441
     
    514444!-- of a 1d-decomposition along y)
    515445    IF ( pdims(1) == 1 )  THEN
    516        nnx_y  = nnx / pdims(2)
    517        nxl_y  = myid * nnx_y
    518        nxr_ya = ( myid + 1 ) * nnx_y - 1
    519        nxr_y  = MIN( nx, nxr_ya )
    520        nzb_y  = 1
    521        nzt_ya = nza
    522        nzt_y  = nz
    523        sendrecvcount_xy = nnx_y * nny * nza
     446       nnx_y = nnx / pdims(2)
     447       nxl_y = myid * nnx_y
     448       nxr_y = ( myid + 1 ) * nnx_y - 1
     449       nzb_y = 1
     450       nzt_y = nz
     451       sendrecvcount_xy = nnx_y * nny * nz
    524452    ENDIF
    525453
     
    782710!-- Array bounds when running on a single PE (respectively a non-parallel
    783711!-- machine)
    784     nxl  = 0
    785     nxr  = nx
    786     nxra = nx
    787     nnx  = nxr - nxl + 1
    788     nys  = 0
    789     nyn  = ny
    790     nyna = ny
    791     nny  = nyn - nys + 1
    792     nzb  = 0
    793     nzt  = nz
    794     nzta = nz
    795     nnz  = nz
     712    nxl = 0
     713    nxr = nx
     714    nnx = nxr - nxl + 1
     715    nys = 0
     716    nyn = ny
     717    nny = nyn - nys + 1
     718    nzb = 0
     719    nzt = nz
     720    nnz = nz
    796721
    797722    ALLOCATE( hor_index_bounds(4,0:0) )
     
    804729!-- Array bounds for the pressure solver (in the parallel code, these bounds
    805730!-- are the ones for the transposed arrays)
    806     nys_x  = nys
    807     nyn_x  = nyn
    808     nyn_xa = nyn
    809     nzb_x  = nzb + 1
    810     nzt_x  = nzt
    811     nzt_xa = nzt
    812 
    813     nxl_y  = nxl
    814     nxr_y  = nxr
    815     nxr_ya = nxr
    816     nzb_y  = nzb + 1
    817     nzt_y  = nzt
    818     nzt_ya = nzt
    819 
    820     nxl_z  = nxl
    821     nxr_z  = nxr
    822     nxr_za = nxr
    823     nys_z  = nys
    824     nyn_z  = nyn
    825     nyn_za = nyn
     731    nys_x = nys
     732    nyn_x = nyn
     733    nzb_x = nzb + 1
     734    nzt_x = nzt
     735
     736    nxl_y = nxl
     737    nxr_y = nxr
     738    nzb_y = nzb + 1
     739    nzt_y = nzt
     740
     741    nxl_z = nxl
     742    nxr_z = nxr
     743    nys_z = nys
     744    nyn_z = nyn
    826745
    827746#endif
Note: See TracChangeset for help on using the changeset viewer.