Changeset 2328 in lmdz_wrf
- Timestamp:
- Feb 11, 2019, 5:21:51 PM (6 years ago)
- Location:
- trunk/tools
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/tools/module_generic.f90
r2235 r2328 18 18 ! RangeR_K: Function to provide a range of d1 from 'iniv' to 'endv', of real(r_k) values in a vector 19 19 ! 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 ! 20 22 21 23 USE module_definitions … … 438 440 END SUBROUTINE stoprun 439 441 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 440 541 END MODULE module_generic -
trunk/tools/module_scientific.f90
r2327 r2328 90 90 ! write_overlap_polys_ascii: Subroutine to write to an ASCII file the associated polygons at a given time-step 91 91 ! 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, but93 ! with different number assigned !94 92 95 93 !!! *Functions/Subroutines to sort values adpated. The method used is usually referred to as "selection" method. … … 6705 6703 END SUBROUTINE coincident_gridsin2D 6706 6704 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 zone6710 ! It might be, that within the same zone, might be lines which do not share the same integer6711 ! 0 0 0 0 0 0 0 0 0 06712 ! 0 1 1 0 0 0 1 1 0 06713 ! 0 2 0 0 1 == > 0 1 0 0 26714 ! 0 1 1 0 0 0 1 1 0 06715 6716 IMPLICIT NONE6717 6718 INTEGER, INTENT(in) :: dx, dy6719 INTEGER, DIMENSION(dx,dy), INTENT(in) :: inzones6720 INTEGER, DIMENSION(dx,dy), INTENT(out) :: outzones6721 6722 ! Local6723 INTEGER :: i,j,k6724 INTEGER :: Nmaxzones, TOTzones6725 LOGICAL :: assigned6726 INTEGER, DIMENSION(dy) :: prevline6727 INTEGER, DIMENSION(dx) :: Nyzones6728 INTEGER, DIMENSION(:,:,:), ALLOCATABLE :: zones6729 6730 !!!!!!! Variables6731 ! dx, dy: Shape of the 2D space6732 ! inzones: zones to homogenize6733 ! outzones: zones homogenized6734 6735 fname = 'zones_homogenization'6736 6737 ! Maximum possible number of zones6738 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 = 06745 Nyzones = 06746 ! Getting beginning/end of y-bands6747 DO i=1, dx6748 k = 06749 j = 16750 IF (inzones(i,j) /= 0) THEN6751 k = k + 16752 zones(i,k,1) = j6753 zones(i,k,3) = k6754 END IF6755 DO j=2, dy6756 IF ( (inzones(i,j) /= 0) .AND. (inzones(i,j-1) == 0)) THEN6757 k = k+16758 zones(i,k,1) = j6759 zones(i,k,3) = k6760 ELSE IF ( (inzones(i,j-1) /= 0) .AND. (inzones(i,j) == 0)) THEN6761 zones(i,k,2) = j-16762 zones(i,k,3) = k6763 END IF6764 END DO6765 IF (k > 0) THEN6766 IF (zones(i,k,2) == 0) zones(i,k,2) = dy6767 END IF6768 Nyzones(i) = k6769 END DO6770 6771 ! Homogenizing contigous zones6772 outzones = 06773 TOTzones = 06774 i = 16775 DO k = 1, Nyzones(i)6776 TOTzones = TOTzones + 16777 DO j=zones(i,k,1), zones(i,k,2)6778 outzones(i,j) = TOTzones6779 END DO6780 END DO6781 6782 DO i=2, dx6783 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) THEN6788 outzones(i,zones(i,k,1):zones(i,k,2)) = prevline(j)6789 assigned = .TRUE.6790 EXIT6791 END IF6792 END DO6793 IF (.NOT.assigned) THEN6794 TOTzones = TOTzones + 16795 DO j=zones(i,k,1), zones(i,k,2)6796 outzones(i,j) = TOTzones6797 END DO6798 END IF6799 END DO6800 END DO6801 6802 IF (ALLOCATED(zones)) DEALLOCATE(zones)6803 6804 END SUBROUTINE zones_homogenization6805 6806 6705 END MODULE module_scientific
Note: See TracChangeset
for help on using the changeset viewer.