Changeset 1651 in lmdz_wrf for trunk/tools


Ignore:
Timestamp:
Sep 19, 2017, 6:10:56 PM (8 years ago)
Author:
lfita
Message:

Re-aranging dimensions to be more 'Fortran'-like (time as last dimension)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tools/module_scientific.f90

    r1650 r1651  
    3737  CONTAINS
    3838
     39
    3940  SUBROUTINE poly_overlap_tracks(dbg, dx, dy, dt, Nallpolys, allpolys, ctrpolys, areapolys, Nmaxpoly, &
    4041    Nmaxtracks, tracks, finaltracks)
     
    4647    INTEGER, INTENT(in)                                  :: dx, dy, dt, Nmaxpoly, Nmaxtracks
    4748    INTEGER, DIMENSION(dt), INTENT(in)                   :: Nallpolys
    48     INTEGER, DIMENSION(dt,dx,dy), INTENT(in)             :: allpolys
    49     REAL(r_k), DIMENSION(dt,Nmaxpoly,2), INTENT(in)      :: ctrpolys
    50     REAL(r_k), DIMENSION(dt,Nmaxpoly), INTENT(in)        :: areapolys
    51     REAL(r_k), DIMENSION(dt,Nmaxtracks,Nmaxpoly,5),                                                   &
     49    INTEGER, DIMENSION(dx,dy,dt), INTENT(in)             :: allpolys
     50    REAL(r_k), DIMENSION(2,Nmaxpoly,dt), INTENT(in)      :: ctrpolys
     51    REAL(r_k), DIMENSION(Nmaxpoly,dt), INTENT(in)        :: areapolys
     52    REAL(r_k), DIMENSION(5,Nmaxpoly,Nmaxtracks,dt),                                                   &
    5253      INTENT(out)                                        :: tracks
    53     REAL(r_k), DIMENSION(dt,Nmaxtracks,4), INTENT(out)   :: finaltracks
     54    REAL(r_k), DIMENSION(4,Nmaxtracks,dt), INTENT(out)   :: finaltracks
    5455
    5556! Local
    5657    INTEGER                                              :: i, j, ip, it, iip, itt
    5758    INTEGER                                              :: ierr
    58     INTEGER, DIMENSION(dt,Nmaxpoly)                      :: coincidencies, NOcoincidencies,           &
    59       MULTIcoincidencies
     59    INTEGER, DIMENSION(Nmaxpoly,dt)                      :: coincidencies, NOcoincidencies
    6060    INTEGER, DIMENSION(:), ALLOCATABLE                   :: coins
    6161    INTEGER, DIMENSION(:,:), ALLOCATABLE                 :: coinsNpts
    62     INTEGER, DIMENSION(dt,Nmaxpoly)                      :: polycoincidencies
    63     INTEGER, DIMENSION(dt,Nmaxpoly,Nmaxpoly)             :: coincidenciesNpts
     62    INTEGER, DIMENSION(Nmaxpoly,dt)                      :: polycoincidencies
     63    INTEGER, DIMENSION(Nmaxpoly,Nmaxpoly,dt)             :: coincidenciesNpts
    6464    INTEGER                                              :: Nmeet, Nsearch, Nindep
    6565    INTEGER, DIMENSION(dt)                               :: Nindeppolys
    6666    CHARACTER(len=5)                                     :: NcoinS
    67     INTEGER, DIMENSION(dt,Nmaxpoly,Nmaxpoly)             :: polysIndep
    68     INTEGER, DIMENSION(dt,Nmaxpoly)                      :: NpolysIndep
    69     INTEGER, DIMENSION(dt,Nmaxpoly)                      :: SpolysIndep
     67    INTEGER, DIMENSION(Nmaxpoly,Nmaxpoly,dt)             :: polysIndep
     68    INTEGER, DIMENSION(Nmaxpoly,dt)                      :: NpolysIndep
     69    INTEGER, DIMENSION(Nmaxpoly,dt)                      :: SpolysIndep
    7070    INTEGER                                              :: iindep, iiprev
    71     INTEGER, DIMENSION(dt,Nmaxpoly,Nmaxpoly)             :: polysIndepchains
    72     INTEGER                                              :: Nprev, polyprev, Nnotchained, Nprevchained
    73     INTEGER                                              :: NNprev, Ntprev
    74     LOGICAL                                              :: Indeppolychained, prevchained
    75     INTEGER, DIMENSION(Nmaxpoly,Nmaxpoly)                :: polysIndepNotchained
    76     INTEGER, DIMENSION(2)                                :: trackperiod
     71    INTEGER                                              :: Nprev, NNprev, Ntprev
     72    LOGICAL                                              :: Indeppolychained
    7773    INTEGER                                              :: itrack, ictrack
    7874    INTEGER                                              :: ixp, iyp, ttrack
    79     INTEGER                                              :: Nnew
    80     LOGICAL, DIMENSION(Nmaxpoly)                         :: chained
    8175    INTEGER, DIMENSION(dt)                               :: Ntracks
    8276    INTEGER                                              :: idtrack, maxtrack
    83     INTEGER, DIMENSION(dt,Nmaxpoly)                      :: tracks_it
    8477
    8578!!!!!!! Variables
     
    10497    ! Polygons without a coincidence
    10598    NOcoincidencies = 0
    106     ! Polygons with multiple coincidences
    107     MULTIcoincidencies = 0
    10899    ! Number of independent polygons by time step
    109100    Nindeppolys = 0
     
    120111    Nindeppolys(it) = Nmeet
    121112    DO i=1, Nmeet
    122       SpolysIndep(it,i) = i
    123       NpolysIndep(it,1:Nmeet) = 1
    124       polysIndep(it,i,1) = i
     113      SpolysIndep(i,it) = i
     114      NpolysIndep(1:Nmeet,it) = 1
     115      polysIndep(1,i,it) = i
    125116    END DO
    126117
     
    140131      CALL ErrMsg(msg,fname,ierr)
    141132
    142       CALL coincidence_all_polys(dbg, dx, dy, Nmeet, allpolys(it+1,:,:), ctrpolys(it+1,1:Nmeet,:),    &
    143         Nsearch, allpolys(it,:,:), ctrpolys(it,1:Nsearch,:), areapolys(it,1:Nsearch), coins, coinsNpts)
    144 
    145       polycoincidencies(it+1,1:Nmeet) = coins
    146       coincidenciesNpts(it+1,1:Nmeet,1:Nsearch) = coinsNpts
     133      CALL coincidence_all_polys(dbg, dx, dy, Nmeet, allpolys(:,:,it+1), ctrpolys(:,1:Nmeet,it+1),    &
     134        Nsearch, allpolys(:,:,it), ctrpolys(:,1:Nsearch,it), areapolys(1:Nsearch,it), coins, coinsNpts)
     135
     136      polycoincidencies(1:Nmeet,it+1) = coins
     137      coincidenciesNpts(1:Nmeet,1:Nsearch,it+1) = coinsNpts
    147138
    148139      ! Counting the number of times that a polygon has a coincidency
     
    158149        IF (coins(i) == -1) THEN
    159150          Nindep = Nindep + 1
    160           NOcoincidencies(it+1,i) = 1
    161           SpolysIndep(it+1,Nindep) = -1
    162           NpolysIndep(it+1,Nindep) = NpolysIndep(it+1,Nindep) + 1
    163           polysIndep(it+1,Nindep,NpolysIndep(it+1,Nindep)) = i
     151          NOcoincidencies(i,it+1) = 1
     152          SpolysIndep(Nindep,it+1) = -1
     153          NpolysIndep(Nindep,it+1) = NpolysIndep(Nindep,it+1) + 1
     154          polysIndep(Nindep,NpolysIndep(Nindep,it+1),it+1) = i
    164155        ELSE IF (coins(i) == -9) THEN
    165156          WRITE(NcoinS,'(I5)')coins(i)
     
    170161          DO ip=1, Nsearch
    171162            IF (coins(i) == ip) THEN
    172               IF (coincidencies(it+1,ip) == 0) THEN
     163              IF (coincidencies(ip,it+1) == 0) THEN
    173164                Nindep = Nindep + 1
    174                 SpolysIndep(it+1,Nindep) = ip
     165                SpolysIndep(Nindep,it+1) = ip
    175166              END IF
    176               coincidencies(it+1,ip) = coincidencies(it+1,ip) + 1
     167              coincidencies(ip,it+1) = coincidencies(ip,it+1) + 1
    177168              DO iindep=1, Nindep
    178                 IF (SpolysIndep(it+1,iindep) == coins(i)) THEN
    179                   NpolysIndep(it+1,iindep) = NpolysIndep(it+1,iindep) + 1
    180                   polysIndep(it+1,iindep,NpolysIndep(it+1,iindep)) = i
     169                IF (SpolysIndep(iindep,it+1) == coins(i)) THEN
     170                  NpolysIndep(iindep,it+1) = NpolysIndep(iindep,it+1) + 1
     171                  polysIndep(iindep,NpolysIndep(iindep,it+1),it+1) = i
    181172                END IF
    182173              END DO
     
    192183        PRINT *,'    indep_polygon prev_step_polygon Nassociated_polygons curr_ass_polygons _______'
    193184        DO i=1, Nindeppolys(it+1)
    194           PRINT *,i, SpolysIndep(it+1,i), NpolysIndep(it+1,i), ':',                                   &
    195             polysIndep(it+1,i,1:NpolysIndep(it+1,i))
     185          PRINT *,i, SpolysIndep(i,it+1), NpolysIndep(i,it+1), ':',                                   &
     186            polysIndep(i,1:NpolysIndep(i,it+1),it+1)
    196187        END DO
    197188      END IF
     
    204195        PRINT '(4x,3(A6,1x))','Nindep', 'PrevID', 'IDs'
    205196        DO ip=1, Nindeppolys(it)
    206           PRINT '(4x,I6,A1,I6,A1,100(I6))', ip, ',', SpolysIndep(it,ip), ':',                         &
    207             polysIndep(it,ip,1:NpolysIndep(it,ip))
     197          PRINT '(4x,I6,A1,I6,A1,100(I6))', ip, ',', SpolysIndep(ip,it), ':',                         &
     198            polysIndep(ip,1:NpolysIndep(ip,it),it)
    208199        END DO
    209200      END DO
     
    221212    DO ip=1, Nindeppolys(1)
    222213      itrack = itrack + 1
    223       tracks(1,itrack,1,1) = itrack*1.
    224       tracks(1,itrack,1,2) = SpolysIndep(1,ip)
    225       tracks(1,itrack,1,3) = ctrpolys(1,ip,1)
    226       tracks(1,itrack,1,4) = ctrpolys(1,ip,2)
    227       tracks(1,itrack,1,5) = 1
    228       tracks_it(1,itrack) = itrack
     214      tracks(1,1,itrack,1) = itrack*1.
     215      tracks(2,1,itrack,1) = SpolysIndep(ip,1)
     216      tracks(3,1,itrack,1) = ctrpolys(1,ip,1)
     217      tracks(4,1,itrack,1) = ctrpolys(2,ip,1)
     218      tracks(5,1,itrack,1) = 1
    229219      Ntracks(1) = Ntracks(1) + 1
    230220    END DO
     
    235225      ! Indep polygons current time-step
    236226      current_poly: DO i=1, Nindeppolys(it)
    237         IF (dbg) PRINT *,'  curent poly:', i, 'Prev poly:', SpolysIndep(it,i), ' N ass. polygons:',   &
    238           NpolysIndep(it,i), 'ass. poly:', polysIndep(it,i,1:NpolysIndep(it,i))
     227        IF (dbg) PRINT *,'  curent poly:', i, 'Prev poly:', SpolysIndep(i,it), ' N ass. polygons:',   &
     228          NpolysIndep(i,it), 'ass. poly:', polysIndep(i,1:NpolysIndep(i,it),it)
    239229        Indeppolychained = .FALSE.
    240230
     
    242232        ! Looping overall
    243233        it1_tracks: DO itt=1, Ntracks(it-1)
    244           itrack = tracks(it-1,itt,1,1)
     234          itrack = tracks(1,1,itt,it-1)
    245235          ! Number polygons ID assigned
    246           Ntprev = COUNT(tracks(it-1,itt,:,2) /= 0)
    247           IF (dbg) PRINT *,itt,'  track:', itrack, 'assigned:', tracks(it-1,itt,1:Ntprev,2)
     236          Ntprev = COUNT(tracks(2,:,itt,it-1) /= 0)
     237          IF (dbg) PRINT *,itt,'  track:', itrack, 'assigned:', tracks(2,1:Ntprev,itt,it-1)
    248238
    249239          ! Looking for coincidencies
    250240          DO iip=1, Ntprev
    251             IF (tracks(it-1,itt,iip,2) == SpolysIndep(it,i)) THEN
     241            IF (tracks(2,iip,itt,it-1) == SpolysIndep(i,it)) THEN
    252242              Indeppolychained = .TRUE.
    253               IF (dbg) PRINT *,'    coincidence found by polygon:', tracks(it-1,itt,iip,2)
     243              IF (dbg) PRINT *,'    coincidence found by polygon:', tracks(2,iip,itt,it-1)
    254244              EXIT
    255245            END IF
     
    259249            ictrack = Ntracks(it)
    260250            ! Assigning all the IDs to the next step of the track
    261             DO iip=1, NpolysIndep(it,i)
    262               iiprev = polysIndep(it,i,iip)
    263               tracks(it,ictrack,iip,1) = itrack
    264               tracks(it,ictrack,iip,2) = iiprev
    265               ixp = ctrpolys(it,iiprev,1)
    266               iyp = ctrpolys(it,iiprev,2)
    267               tracks(it,ictrack,iip,3) = ixp
    268               tracks(it,ictrack,iip,4) = iyp
    269               tracks(it,ictrack,iip,5) = it
     251            DO iip=1, NpolysIndep(i,it)
     252              iiprev = polysIndep(i,iip,it)
     253              tracks(1,iip,ictrack,it) = itrack
     254              tracks(2,iip,ictrack,it) = iiprev
     255              ixp = ctrpolys(1,iiprev,it)
     256              iyp = ctrpolys(2,iiprev,it)
     257              tracks(3,iip,ictrack,it) = ixp
     258              tracks(4,iip,ictrack,it) = iyp
     259              tracks(5,iip,ictrack,it) = it
    270260            END DO
    271             tracks_it(it,ictrack) = itrack
    272261            EXIT
    273262          END IF
     
    279268          ictrack = Ntracks(it)
    280269          ! ID of new track
    281           maxtrack = INT(MAXVAL(tracks(:,:,:,1)*1.))
     270          maxtrack = INT(MAXVAL(tracks(1,:,:,:)*1.))
    282271          IF (dbg) PRINT *,'  New track!', maxtrack+1
    283272
    284273          ! Assigning all the IDs to the next step of the track
    285           DO j=1, NpolysIndep(it,i)
    286             iiprev = polysIndep(it,i,j)
    287             tracks(it,ictrack,j,1) = maxtrack+1
    288             tracks(it,ictrack,j,2) = iiprev
    289             ixp = ctrpolys(it,iiprev,1)
    290             iyp = ctrpolys(it,iiprev,2)
    291             tracks(it,ictrack,j,3) = ixp
    292             tracks(it,ictrack,j,4) = iyp
    293             tracks(it,ictrack,j,5) = it
     274          DO j=1, NpolysIndep(i,it)
     275            iiprev = polysIndep(i,j,it)
     276            tracks(1,j,ictrack,it) = maxtrack+1
     277            tracks(2,j,ictrack,it) = iiprev
     278            ixp = ctrpolys(1,iiprev,it)
     279            iyp = ctrpolys(2,iiprev,it)
     280            tracks(3,j,ictrack,it) = ixp
     281            tracks(4,j,ictrack,it) = iyp
     282            tracks(5,j,ictrack,it) = it
    294283          END DO
    295           tracks_it(it,Ntracks(it)) = maxtrack+1
    296284        END IF
    297285
     
    300288      IF (dbg) PRINT *,'  At this time-step:', it, ' N trajectories:', Ntracks(it)
    301289      DO i=1, Ntracks(it)
    302         Nprev = COUNT(INT(tracks(it,i,:,2)) /= 0)
    303         PRINT *,i,'tracks:', tracks(it,i,1:Nprev,2)
     290        Nprev = COUNT(INT(tracks(2,:,i,it)) /= 0)
     291        PRINT *,i,'tracks:', tracks(2,1:Nprev,i,it)
    304292      END DO
    305293
     
    310298
    311299    finaltracks = 0.
    312     maxtrack = MAXVAL(tracks(:,:,:,1))
     300    maxtrack = MAXVAL(tracks(1,:,:,:))
    313301
    314302    DO it=1, dt
    315303      DO itt=1, Ntracks(it)
    316         itrack = INT(tracks(it,itt,1,1))
    317         Nprev = COUNT(INT(tracks(it,itt,:,2)) /= 0)
     304        itrack = INT(tracks(1,1,itt,it))
     305        Nprev = COUNT(INT(tracks(2,:,itt,it)) /= 0)
    318306        PRINT *,'it:', it,'itrack:', itrack, 'Nprev:', Nprev
    319         finaltracks(it,itrack,1) = itrack*1.
    320         finaltracks(it,itrack,2) = SUM(tracks(it,itt,:,3))/Nprev
    321         finaltracks(it,itrack,3) = SUM(tracks(it,itt,:,4))/Nprev
    322         finaltracks(it,itrack,4) = it*1.
    323         PRINT *,'  finaltrack:', finaltracks(it,itrack,:)
     307        finaltracks(1,itrack,it) = itrack*1.
     308        finaltracks(2,itrack,it) = SUM(tracks(3,:,itt,it))/Nprev
     309        finaltracks(3,itrack,it) = SUM(tracks(4,:,itt,it))/Nprev
     310        finaltracks(4,itrack,it) = it*1.
     311        PRINT *,'  finaltrack:', finaltracks(:,itrack,it)
    324312      END DO
    325313    END DO
     
    339327    INTEGER, INTENT(in)                                  :: dx, dy, Nallpoly, Npoly
    340328    INTEGER, DIMENSION(dx,dy), INTENT(in)                :: allpoly, polys
    341     REAL(r_k), DIMENSION(Nallpoly,2), INTENT(in)         :: icpolys
    342     REAL(r_k), DIMENSION(Npoly,2), INTENT(in)            :: cpolys
     329    REAL(r_k), DIMENSION(2,Nallpoly), INTENT(in)         :: icpolys
     330    REAL(r_k), DIMENSION(2,Npoly), INTENT(in)            :: cpolys
    343331    REAL(r_k), DIMENSION(Npoly), INTENT(in)              :: apolys
    344332    INTEGER, DIMENSION(Nallpoly), INTENT(out)            :: polycoins
     
    383371        DO j=1, Npoly
    384372          IF (coinNptss(ip,j) == maxcoin) THEN
    385             dist = SQRT( (icpolys(ip,1)*1.-cpolys(j,1)*1.)**2 + (icpolys(ip,2)*1.-cpolys(j,2)*1.)**2 )
     373            dist = SQRT( (icpolys(1,ip)*1.-cpolys(1,j)*1.)**2 + (icpolys(2,ip)*1.-cpolys(2,j)*1.)**2 )
    386374            IF ( dist > maxcoindist) THEN
    387375              maxcoindist = dist
     
    481469
    482470END SUBROUTINE coincidence_poly
    483 
    484471
    485472  SUBROUTINE all_polygons_properties(dbg, dx, dy, Npoly, polys, lon, lat, values, xres, yres, projN,  &
Note: See TracChangeset for help on using the changeset viewer.