- Timestamp:
- 2020-09-14T17:40:34+02:00 (4 years ago)
- Location:
- NEMO/branches/2019/dev_r11351_fldread_with_XIOS
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2019/dev_r11351_fldread_with_XIOS
- Property svn:externals
-
old new 3 3 ^/utils/build/mk@HEAD mk 4 4 ^/utils/tools@HEAD tools 5 ^/vendors/AGRIF/dev @HEADext/AGRIF5 ^/vendors/AGRIF/dev_r12970_AGRIF_CMEMS ext/AGRIF 6 6 ^/vendors/FCM@HEAD ext/FCM 7 7 ^/vendors/IOIPSL@HEAD ext/IOIPSL 8 9 # SETTE 10 ^/utils/CI/sette@13382 sette
-
- Property svn:externals
-
NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/LBC/mpp_loc_generic.h90
r10716 r13463 1 1 !== IN: ptab is an array ==! 2 # define ARRAY_TYPE(i,j,k) REAL(wp) , INTENT(in ) :: ARRAY_IN(i,j,k) 3 # define MASK_TYPE(i,j,k) REAL(wp) , INTENT(in ) :: MASK_IN(i,j,k) 2 # if defined SINGLE_PRECISION 3 # define ARRAY_TYPE(i,j,k) REAL(sp) , INTENT(in ) :: ARRAY_IN(i,j,k) 4 #if defined key_mpp_mpi 5 # define MPI_TYPE MPI_2REAL 6 #endif 7 # define PRECISION sp 8 # else 9 # define ARRAY_TYPE(i,j,k) REAL(dp) , INTENT(in ) :: ARRAY_IN(i,j,k) 10 #if defined key_mpp_mpi 11 # define MPI_TYPE MPI_2DOUBLE_PRECISION 12 #endif 13 # define PRECISION dp 14 # endif 15 4 16 # if defined DIM_2d 5 17 # define ARRAY_IN(i,j,k) ptab(i,j) 6 # define MASK_IN(i,j,k) pmask(i,j)18 # define MASK_IN(i,j,k) ldmsk(i,j) 7 19 # define INDEX_TYPE(k) INTEGER , INTENT( out) :: kindex(2) 8 20 # define K_SIZE(ptab) 1 … … 10 22 # if defined DIM_3d 11 23 # define ARRAY_IN(i,j,k) ptab(i,j,k) 12 # define MASK_IN(i,j,k) pmask(i,j,k)24 # define MASK_IN(i,j,k) ldmsk(i,j,k) 13 25 # define INDEX_TYPE(k) INTEGER , INTENT( out) :: kindex(3) 14 26 # define K_SIZE(ptab) SIZE(ptab,3) 15 27 # endif 16 28 # if defined OPERATION_MAXLOC 17 # define MPI_OPERATION mpi_maxloc29 # define MPI_OPERATION MPI_MAXLOC 18 30 # define LOC_OPERATION MAXLOC 19 31 # define ERRVAL -HUGE 20 32 # endif 21 33 # if defined OPERATION_MINLOC 22 # define MPI_OPERATION mpi_minloc34 # define MPI_OPERATION MPI_MINLOC 23 35 # define LOC_OPERATION MINLOC 24 36 # define ERRVAL HUGE 25 37 # endif 26 38 27 SUBROUTINE ROUTINE_LOC( cdname, ptab, pmask, pmin, kindex)39 SUBROUTINE ROUTINE_LOC( cdname, ptab, ldmsk, pmin, kindex, ldhalo ) 28 40 !!---------------------------------------------------------------------- 29 CHARACTER(len=*), INTENT(in ) :: cdname ! name of the calling subroutine41 CHARACTER(len=*), INTENT(in ) :: cdname ! name of the calling subroutine 30 42 ARRAY_TYPE(:,:,:) ! array on which loctrans operation is applied 31 MASK_TYPE(:,:,:)! local mask32 REAL( wp), INTENT( out) :: pmin ! Global minimum of ptab43 LOGICAL , INTENT(in ) :: MASK_IN(:,:,:) ! local mask 44 REAL(PRECISION) , INTENT( out) :: pmin ! Global minimum of ptab 33 45 INDEX_TYPE(:) ! index of minimum in global frame 34 # if defined key_mpp_mpi 46 LOGICAL, OPTIONAL, INTENT(in ) :: ldhalo ! If .false. (default) excludes halos in kindex 35 47 ! 36 48 INTEGER :: ierror, ii, idim 37 49 INTEGER :: index0 38 REAL(wp) :: zmin ! local minimum39 50 INTEGER , DIMENSION(:), ALLOCATABLE :: ilocs 40 REAL(wp), DIMENSION(2,1) :: zain, zaout 51 REAL(PRECISION) :: zmin ! local minimum 52 REAL(PRECISION), DIMENSION(2,1) :: zain, zaout 53 LOGICAL :: llhalo 41 54 !!----------------------------------------------------------------------- 42 55 ! 43 56 IF( narea == 1 .AND. numcom == -1 ) CALL mpp_report( cdname, ld_glb = .TRUE. ) 44 57 ! 58 IF( PRESENT(ldhalo) ) THEN ; llhalo = ldhalo 59 ELSE ; llhalo = .FALSE. 60 ENDIF 61 ! 45 62 idim = SIZE(kindex) 46 63 ! 47 IF ( ALL(MASK_IN(:,:,:) /= 1._wp) ) THEN 48 ! special case for land processors 49 zmin = ERRVAL(zmin) 50 index0 = 0 51 ELSE 64 IF ( ANY( MASK_IN(:,:,:) ) ) THEN ! there is at least 1 valid point... 65 ! 52 66 ALLOCATE ( ilocs(idim) ) 53 67 ! 54 ilocs = LOC_OPERATION( ARRAY_IN(:,:,:) , mask= MASK_IN(:,:,:) == 1._wp)68 ilocs = LOC_OPERATION( ARRAY_IN(:,:,:) , mask= MASK_IN(:,:,:) ) 55 69 zmin = ARRAY_IN(ilocs(1),ilocs(2),ilocs(3)) 56 70 ! 57 71 kindex(1) = mig( ilocs(1) ) 58 # 72 #if defined DIM_2d || defined DIM_3d /* avoid warning when kindex has 1 element */ 59 73 kindex(2) = mjg( ilocs(2) ) 60 # 61 # 74 #endif 75 #if defined DIM_3d /* avoid warning when kindex has 2 elements */ 62 76 kindex(3) = ilocs(3) 63 # 77 #endif 64 78 ! 65 79 DEALLOCATE (ilocs) 66 80 ! 67 81 index0 = kindex(1)-1 ! 1d index starting at 0 68 # 82 #if defined DIM_2d || defined DIM_3d /* avoid warning when kindex has 1 element */ 69 83 index0 = index0 + jpiglo * (kindex(2)-1) 70 # 71 # 84 #endif 85 #if defined DIM_3d /* avoid warning when kindex has 2 elements */ 72 86 index0 = index0 + jpiglo * jpjglo * (kindex(3)-1) 73 # endif 87 #endif 88 ELSE 89 ! special case for land processors 90 zmin = ERRVAL(zmin) 91 index0 = 0 74 92 END IF 93 ! 75 94 zain(1,:) = zmin 76 zain(2,:) = REAL(index0, wp)95 zain(2,:) = REAL(index0, PRECISION) 77 96 ! 97 #if defined key_mpp_mpi 78 98 IF( ln_timing ) CALL tic_tac(.TRUE., ld_global = .TRUE.) 79 CALL MPI_ALLREDUCE( zain, zaout, 1, MPI_ 2DOUBLE_PRECISION, MPI_OPERATION ,MPI_COMM_OCE, ierror)99 CALL MPI_ALLREDUCE( zain, zaout, 1, MPI_TYPE, MPI_OPERATION ,MPI_COMM_OCE, ierror) 80 100 IF( ln_timing ) CALL tic_tac(.FALSE., ld_global = .TRUE.) 101 #else 102 zaout(:,:) = zain(:,:) 103 #endif 81 104 ! 82 105 pmin = zaout(1,1) 83 106 index0 = NINT( zaout(2,1) ) 84 # 107 #if defined DIM_3d /* avoid warning when kindex has 2 elements */ 85 108 kindex(3) = index0 / (jpiglo*jpjglo) 86 109 index0 = index0 - kindex(3) * (jpiglo*jpjglo) 87 # 88 # 110 #endif 111 #if defined DIM_2d || defined DIM_3d /* avoid warning when kindex has 1 element */ 89 112 kindex(2) = index0 / jpiglo 90 113 index0 = index0 - kindex(2) * jpiglo 91 # 114 #endif 92 115 kindex(1) = index0 93 116 kindex(:) = kindex(:) + 1 ! start indices at 1 94 #else 95 kindex = 0 ; pmin = 0. 96 WRITE(*,*) 'ROUTINE_LOC: You should not have seen this print! error?' 117 118 IF( .NOT. llhalo ) THEN 119 kindex(1) = kindex(1) - nn_hls 120 #if defined DIM_2d || defined DIM_3d /* avoid warning when kindex has 1 element */ 121 kindex(2) = kindex(2) - nn_hls 97 122 #endif 98 123 ENDIF 124 99 125 END SUBROUTINE ROUTINE_LOC 100 126 127 128 #undef PRECISION 101 129 #undef ARRAY_TYPE 102 #undef MAX_TYPE103 130 #undef ARRAY_IN 104 131 #undef MASK_IN 105 132 #undef K_SIZE 133 #if defined key_mpp_mpi 134 # undef MPI_TYPE 135 #endif 106 136 #undef MPI_OPERATION 107 137 #undef LOC_OPERATION
Note: See TracChangeset
for help on using the changeset viewer.