Changeset 2328 in lmdz_wrf


Ignore:
Timestamp:
Feb 11, 2019, 5:21:51 PM (6 years ago)
Author:
lfita
Message:

Moving:

  • `zones_homogenization' from 'module_scientific' to 'module_geeric'
Location:
trunk/tools
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/tools/module_generic.f90

    r2235 r2328  
    1818! RangeR_K: Function to provide a range of d1 from 'iniv' to 'endv', of real(r_k) values in a vector
    1919! stoprun: Subroutine to stop running and print a message
     20! zones_homogenization: Subroutine to homogenize 2D contiguous zones, zones might be contiguous, but
     21!   with different number assigned !
    2022
    2123  USE module_definitions
     
    438440  END SUBROUTINE stoprun
    439441
     442  SUBROUTINE zones_homogenization(dx, dy, inzones, outzones)
     443! Subroutine to homogenize 2D contiguous zones, zones might be contiguous, but with different number assigned !
     444!   Here we have a 2D matrix of integers, with contiguous integer filled zones, zero outside any zone
     445!   It might be, that within the same zone, might be lines which do not share the same integer
     446!     0 0 0 0 0          0 0 0 0 0
     447!     0 1 1 0 0          0 1 1 0 0
     448!     0 2 0 0 1    == >  0 1 0 0 2
     449!     0 1 1 0 0          0 1 1 0 0
     450
     451    IMPLICIT NONE
     452
     453    INTEGER, INTENT(in)                                  :: dx, dy
     454    INTEGER, DIMENSION(dx,dy), INTENT(in)                :: inzones
     455    INTEGER, DIMENSION(dx,dy), INTENT(out)               :: outzones
     456
     457! Local
     458    INTEGER                                              :: i,j,k
     459    INTEGER                                              :: Nmaxzones, TOTzones
     460    LOGICAL                                              :: assigned
     461    INTEGER, DIMENSION(dy)                               :: prevline
     462    INTEGER, DIMENSION(dx)                               :: Nyzones
     463    INTEGER, DIMENSION(:,:,:), ALLOCATABLE               :: zones
     464
     465!!!!!!! Variables
     466! dx, dy: Shape of the 2D space
     467! inzones: zones to homogenize
     468! outzones: zones homogenized
     469
     470    fname = 'zones_homogenization'
     471
     472    ! Maximum possible number of zones
     473    Nmaxzones = INT((dx/2)*(dy/2))
     474
     475    ! Matrix with [i,j,Nzone,izone/ezone]
     476    IF (ALLOCATED(zones)) DEALLOCATE(zones)
     477    ALLOCATE(zones(dx,Nmaxzones,3))
     478
     479    zones = 0
     480    Nyzones = 0
     481    ! Getting beginning/end of y-bands
     482    DO i=1, dx
     483      k = 0
     484      j = 1
     485      IF (inzones(i,j) /= 0) THEN
     486        k = k + 1
     487        zones(i,k,1) = j
     488        zones(i,k,3) = k
     489      END IF
     490      DO j=2, dy
     491        IF ( (inzones(i,j) /= 0) .AND. (inzones(i,j-1) == 0)) THEN
     492          k = k+1
     493          zones(i,k,1) = j
     494          zones(i,k,3) = k
     495        ELSE IF ( (inzones(i,j-1) /= 0) .AND. (inzones(i,j) == 0)) THEN
     496          zones(i,k,2) = j-1
     497          zones(i,k,3) = k
     498        END IF
     499      END DO
     500      IF (k > 0) THEN
     501        IF (zones(i,k,2) == 0) zones(i,k,2) = dy
     502      END IF
     503      Nyzones(i) = k
     504    END DO
     505
     506    ! Homogenizing contigous zones
     507    outzones = 0
     508    TOTzones = 0
     509    i = 1
     510    DO k = 1, Nyzones(i)
     511      TOTzones = TOTzones + 1
     512      DO j=zones(i,k,1), zones(i,k,2)
     513        outzones(i,j) = TOTzones
     514      END DO
     515    END DO
     516
     517    DO i=2, dx
     518      prevline = outzones(i-1,:)
     519      DO k = 1, Nyzones(i)
     520        assigned = .FALSE.
     521        DO j=zones(i,k,1), zones(i,k,2)
     522          IF (prevline(j) /= 0) THEN
     523            outzones(i,zones(i,k,1):zones(i,k,2)) = prevline(j)
     524            assigned = .TRUE.
     525            EXIT
     526          END IF
     527        END DO
     528        IF (.NOT.assigned) THEN
     529          TOTzones = TOTzones + 1
     530          DO j=zones(i,k,1), zones(i,k,2)
     531            outzones(i,j) = TOTzones
     532          END DO
     533        END IF
     534      END DO
     535    END DO
     536
     537    IF (ALLOCATED(zones)) DEALLOCATE(zones)
     538
     539  END SUBROUTINE zones_homogenization
     540
    440541END MODULE module_generic
  • trunk/tools/module_scientific.f90

    r2327 r2328  
    9090! write_overlap_polys_ascii: Subroutine to write to an ASCII file the associated polygons at a given time-step
    9191! write_overlap_tracks_ascii: Subroutine to write to an ASCII the polygons associated to a trajectory at a given time step
    92 ! zones_homogenization: Subroutine to homogenize 2D contiguous zones, zones might be contiguous, but
    93 !   with different number assigned !
    9492
    9593!!! *Functions/Subroutines to sort values adpated. The method used is usually referred to as "selection" method.
     
    67056703  END SUBROUTINE coincident_gridsin2D
    67066704
    6707   SUBROUTINE zones_homogenization(dx, dy, inzones, outzones)
    6708 ! Subroutine to homogenize 2D contiguous zones, zones might be contiguous, but with different number assigned !
    6709 !   Here we have a 2D matrix of integers, with contiguous integer filled zones, zero outside any zone
    6710 !   It might be, that within the same zone, might be lines which do not share the same integer
    6711 !     0 0 0 0 0          0 0 0 0 0
    6712 !     0 1 1 0 0          0 1 1 0 0
    6713 !     0 2 0 0 1    == >  0 1 0 0 2
    6714 !     0 1 1 0 0          0 1 1 0 0
    6715 
    6716     IMPLICIT NONE
    6717 
    6718     INTEGER, INTENT(in)                                  :: dx, dy
    6719     INTEGER, DIMENSION(dx,dy), INTENT(in)                :: inzones
    6720     INTEGER, DIMENSION(dx,dy), INTENT(out)               :: outzones
    6721 
    6722 ! Local
    6723     INTEGER                                              :: i,j,k
    6724     INTEGER                                              :: Nmaxzones, TOTzones
    6725     LOGICAL                                              :: assigned
    6726     INTEGER, DIMENSION(dy)                               :: prevline
    6727     INTEGER, DIMENSION(dx)                               :: Nyzones
    6728     INTEGER, DIMENSION(:,:,:), ALLOCATABLE               :: zones
    6729 
    6730 !!!!!!! Variables
    6731 ! dx, dy: Shape of the 2D space
    6732 ! inzones: zones to homogenize
    6733 ! outzones: zones homogenized
    6734 
    6735     fname = 'zones_homogenization'
    6736 
    6737     ! Maximum possible number of zones
    6738     Nmaxzones = INT((dx/2)*(dy/2))
    6739 
    6740     ! Matrix with [i,j,Nzone,izone/ezone]
    6741     IF (ALLOCATED(zones)) DEALLOCATE(zones)
    6742     ALLOCATE(zones(dx,Nmaxzones,3))
    6743 
    6744     zones = 0
    6745     Nyzones = 0
    6746     ! Getting beginning/end of y-bands
    6747     DO i=1, dx
    6748       k = 0
    6749       j = 1
    6750       IF (inzones(i,j) /= 0) THEN
    6751         k = k + 1
    6752         zones(i,k,1) = j
    6753         zones(i,k,3) = k
    6754       END IF
    6755       DO j=2, dy
    6756         IF ( (inzones(i,j) /= 0) .AND. (inzones(i,j-1) == 0)) THEN
    6757           k = k+1
    6758           zones(i,k,1) = j
    6759           zones(i,k,3) = k
    6760         ELSE IF ( (inzones(i,j-1) /= 0) .AND. (inzones(i,j) == 0)) THEN
    6761           zones(i,k,2) = j-1
    6762           zones(i,k,3) = k
    6763         END IF
    6764       END DO
    6765       IF (k > 0) THEN
    6766         IF (zones(i,k,2) == 0) zones(i,k,2) = dy
    6767       END IF
    6768       Nyzones(i) = k
    6769     END DO
    6770 
    6771     ! Homogenizing contigous zones
    6772     outzones = 0
    6773     TOTzones = 0
    6774     i = 1
    6775     DO k = 1, Nyzones(i)
    6776       TOTzones = TOTzones + 1
    6777       DO j=zones(i,k,1), zones(i,k,2)
    6778         outzones(i,j) = TOTzones
    6779       END DO
    6780     END DO
    6781 
    6782     DO i=2, dx
    6783       prevline = outzones(i-1,:)
    6784       DO k = 1, Nyzones(i)
    6785         assigned = .FALSE.
    6786         DO j=zones(i,k,1), zones(i,k,2)
    6787           IF (prevline(j) /= 0) THEN
    6788             outzones(i,zones(i,k,1):zones(i,k,2)) = prevline(j)
    6789             assigned = .TRUE.
    6790             EXIT
    6791           END IF
    6792         END DO
    6793         IF (.NOT.assigned) THEN
    6794           TOTzones = TOTzones + 1
    6795           DO j=zones(i,k,1), zones(i,k,2)
    6796             outzones(i,j) = TOTzones
    6797           END DO
    6798         END IF
    6799       END DO
    6800     END DO
    6801 
    6802     IF (ALLOCATED(zones)) DEALLOCATE(zones)
    6803 
    6804   END SUBROUTINE zones_homogenization
    6805 
    68066705END MODULE module_scientific
Note: See TracChangeset for help on using the changeset viewer.