Changeset 1185 in lmdz_wrf


Ignore:
Timestamp:
Oct 14, 2016, 4:07:59 PM (9 years ago)
Author:
lfita
Message:

Working version of `reproject' up to 5D with 'npp' and 'dis'

Location:
trunk/tools
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/tools/module_ForInterpolate.F90

    r1184 r1185  
    867867END SUBROUTINE LlInterpolateProjection
    868868
    869 SUBROUTINE var2D_IntProj(var2Din, inlonv, inlatv, projlon, projlat, intkind, varout, idimx, idimy,    &
    870   pdimx, pdimy)
     869SUBROUTINE var2D_IntProj(var2Din, inlonv, inlatv, projlon, projlat, intkind, mask, varout, idimx,     &
     870  idimy, pdimx, pdimy)
    871871! Subroutine to interpolate a 2D variable
    872872
     
    875875  IMPLICIT NONE
    876876
    877 !  INTEGER, PARAMETER                                     :: r_k = KIND(1.d0)
    878877  INTEGER, INTENT(in)                                    :: idimx, idimy, pdimx, pdimy
    879878  REAL(r_k), DIMENSION(pdimx,pdimy), INTENT(in)          :: projlon, projlat
    880879  REAL(r_k), DIMENSION(idimx,idimy), INTENT(in)          :: inlonv, inlatv
    881880  CHARACTER(LEN=50), INTENT(in)                          :: intkind
    882   REAL(r_k), DIMENSION(pdimx,pdimy), INTENT(in)          :: var2Din
     881  REAL(r_k), DIMENSION(idimx,idimy), INTENT(in)          :: var2Din
     882  INTEGER, DIMENSION(idimx,idimy), INTENT(in)            :: mask
    883883  REAL(r_k), DIMENSION(pdimx,pdimy), INTENT(out)         :: varout
    884884
    885885! Local
    886   INTEGER                                                :: i, j, iv, ix, iy
     886  INTEGER                                                :: i, j, k, iv, ix, iy
    887887  REAL(r_k)                                              :: w
    888888  REAL(r_k), DIMENSION(3,16,pdimx,pdimy)                 :: outLlw
     
    903903!       3rd: weight for i-index, j-index to use for ponderation (0<1.)
    904904! var2Din: 2D variable to interpolate
     905! mask: mask of the intpu values (1: good, 0: none)
    905906! varout: variable interpolated on the target projection
    906907  fname = 'var2D_IntProj'
     
    913914      DO i=1, pdimx
    914915        DO j=1, pdimy
    915           varout(i,j) = 0.
    916           DO iv=1, 4
    917             ix = INT(outLlw(1,iv,i,j))
    918             iy = INT(outLlw(2,iv,i,j))
    919             w =  outLlw(3,iv,i,j)
    920             varout(i,j) = varout(i,j) + w*var2Din(ix,iy)
    921           END DO
     916          IF (outLlw(3,1,i,j) == -1.) THEN
     917            varout(i,j) = fillVal64
     918          ELSE
     919            varout(i,j) = 0.
     920            DO iv=1, 4
     921              ix = INT(outLlw(1,iv,i,j))
     922              iy = INT(outLlw(2,iv,i,j))
     923              IF (mask(ix,iy) == 1) THEN
     924                w =  outLlw(3,iv,i,j)
     925                varout(i,j) = varout(i,j) + w*var2Din(ix,iy)
     926              END IF
     927            END DO
     928          END IF
    922929        END DO
    923930      END DO
     
    927934          ix = INT(outLlw(1,1,i,j))
    928935          iy = INT(outLlw(2,1,i,j))
    929           varout(i,j) = var2Din(ix,iy)
     936          IF ( (outLlw(3,1,i,j) == -1.) .OR. (mask(ix,iy) == 0) ) THEN
     937            varout(i,j) = fillVal64
     938          ELSE
     939            varout(i,j) = var2Din(ix,iy)*outLlw(3,1,i,j)
     940          END IF
    930941        END DO
    931942      END DO
     
    933944
    934945END SUBROUTINE var2D_IntProj
     946
    935947
    936948SUBROUTINE var3D_IntProj(var3Din, inlonv, inlatv, projlon, projlat, intkind, mask, varout, idimx,     &
     
    9941006                  varout(i,j,k) = varout(i,j,k) + w*var3Din(ix,iy,k)
    9951007                END IF
    996 !                IF (MOD(i+j+k,150) == 0) PRINT *,iv,':',ix,iy,w,'<>',var3Din(ix,iy,k),'-->',varout(i,j,k)
    9971008              END DO
    998 !                IF (MOD(i+j+k,150) == 0) PRINT *,'vout:',varout(i,j,k)
    9991009            END DO
    10001010          END IF
     
    10191029END SUBROUTINE var3D_IntProj
    10201030
    1021 SUBROUTINE var4D_IntProj(var4Din, inlonv, inlatv, projlon, projlat, intkind, varout, idimx, idimy,    &
    1022   pdimx, pdimy, d3, d4)
     1031SUBROUTINE var4D_IntProj(var4Din, inlonv, inlatv, projlon, projlat, intkind, mask, varout, idimx,     &
     1032  idimy, pdimx, pdimy, d3, d4)
    10231033! Subroutine to interpolate a 4D variable
    10241034
     
    10331043  CHARACTER(LEN=50), INTENT(in)                          :: intkind
    10341044  REAL(r_k), DIMENSION(idimx,idimy,d3,d4), INTENT(in)    :: var4Din
     1045  INTEGER, DIMENSION(idimx,idimy,d3,d4), INTENT(in)      :: mask
    10351046  REAL(r_k), DIMENSION(pdimx,pdimy,d3,d4), INTENT(out)   :: varout
    10361047
     
    10551066!       3rd: weight for i-index, j-index to use for ponderation (0<1.)
    10561067! var4Din: 4D variable to interpolate
     1068! mask: mask of the intpu values (1: good, 0: none)
    10571069! varout: variable interpolated on the target projection
    10581070  fname = 'var4D_IntProj'
     
    10651077      DO i=1, pdimx
    10661078        DO j=1, pdimy
    1067           DO k=1, d3
    1068             DO l=1, d4
    1069               varout(i,j,k,l) = 0.
    1070               DO iv=1, 4
    1071                 ix = INT(outLlw(1,iv,i,j))
    1072                 iy = INT(outLlw(2,iv,i,j))
    1073                 w =  outLlw(3,iv,i,j)
    1074                 varout(i,j,k,l) = varout(i,j,k,l) + w*var4Din(ix,iy,k,l)
     1079          IF (ALL(outLlw(3,:,i,j) == -1.)) THEN
     1080            varout(i,j,:,:) = fillVal64
     1081          ELSE
     1082            DO k=1, d3
     1083              DO l=1, d4
     1084                varout(i,j,k,l) = 0.
     1085                DO iv=1, 4
     1086                  ix = INT(outLlw(1,iv,i,j))
     1087                  iy = INT(outLlw(2,iv,i,j))
     1088                  IF (mask(ix,iy,k,l) == 1) THEN
     1089                    w =  outLlw(3,iv,i,j)
     1090                    varout(i,j,k,l) = varout(i,j,k,l) + w*var4Din(ix,iy,k,l)
     1091                  END IF
     1092                END DO
    10751093              END DO
    10761094            END DO
    1077           END DO
     1095          END IF
    10781096        END DO
    10791097      END DO
     
    10831101          ix = INT(outLlw(1,1,i,j))
    10841102          iy = INT(outLlw(2,1,i,j))
    1085           DO k=1, d3
    1086             DO l=1, d4
    1087               varout(i,j,k,l) = var4Din(ix,iy,k,l)
     1103          IF ( (outLlw(3,1,i,j) == -1.) .OR. (mask(ix,iy,1,1) == 0) ) THEN
     1104            varout(i,j,:,:) = fillVal64
     1105          ELSE
     1106            DO k=1, d3
     1107              DO l=1, d4
     1108                varout(i,j,k,l) = var4Din(ix,iy,k,l)*outLlw(3,1,i,j)
     1109              END DO
    10881110            END DO
    1089           END DO
     1111          END IF
    10901112        END DO
    10911113      END DO
     
    10941116END SUBROUTINE var4D_IntProj
    10951117
    1096 
    1097 SUBROUTINE var5D_IntProj(var5Din, inlonv, inlatv, projlon, projlat, intkind, varout, idimx, idimy,    &
    1098   pdimx, pdimy, d3, d4, d5)
     1118SUBROUTINE var5D_IntProj(var5Din, inlonv, inlatv, projlon, projlat, intkind, mask, varout, idimx,     &
     1119  idimy, pdimx, pdimy, d3, d4, d5)
    10991120! Subroutine to interpolate a 5D variable
    11001121
     
    11081129  REAL(r_k), DIMENSION(idimx,idimy), INTENT(in)          :: inlonv, inlatv
    11091130  CHARACTER(LEN=50), INTENT(in)                          :: intkind
    1110   REAL(r_k), DIMENSION(pdimx,pdimy,d3,d4,d5), INTENT(in) :: var5Din
    1111   REAL(r_k), DIMENSION(pdimx,pdimy,d3,d4,d5), INTENT(out):: varout
     1131  REAL(r_k), DIMENSION(idimx,idimy,d3,d4,d5), INTENT(in) :: var5Din
     1132  INTEGER, DIMENSION(idimx,idimy,d3,d4,d5), INTENT(in)   :: mask
     1133  REAL(r_k), DIMENSION(pdimx,pdimy,d3,d4,d5), INTENT(out) :: varout
    11121134
    11131135! Local
     
    11311153!       3rd: weight for i-index, j-index to use for ponderation (0<1.)
    11321154! var5Din: 5D variable to interpolate
     1155! mask: mask of the intpu values (1: good, 0: none)
    11331156! varout: variable interpolated on the target projection
    11341157  fname = 'var5D_IntProj'
     
    11411164      DO i=1, pdimx
    11421165        DO j=1, pdimy
    1143           DO k=1, d3
    1144             DO l=1, d4
    1145               DO m=1, d5
    1146               varout(i,j,k,l,m) = 0.
    1147                 DO iv=1, 4
    1148                   ix = INT(outLlw(1,iv,i,j))
    1149                   iy = INT(outLlw(2,iv,i,j))
    1150                   w =  outLlw(3,iv,i,j)
    1151                   varout(i,j,k,l,m) = varout(i,j,k,l,m) + w*var5Din(ix,iy,k,l,m)
     1166          IF (ALL(outLlw(3,:,i,j) == -1.)) THEN
     1167            varout(i,j,:,:,:) = fillVal64
     1168          ELSE
     1169            DO k=1, d3
     1170              DO l=1, d4
     1171                DO m=1, d5
     1172                  varout(i,j,k,l,m) = 0.
     1173                  DO iv=1, 4
     1174                    ix = INT(outLlw(1,iv,i,j))
     1175                    iy = INT(outLlw(2,iv,i,j))
     1176                    IF (mask(ix,iy,k,l,m) == 1) THEN
     1177                      w =  outLlw(3,iv,i,j)
     1178                      varout(i,j,k,l,m) = varout(i,j,k,l,m) + w*var5Din(ix,iy,k,l,m)
     1179                    END IF
     1180                  END DO
    11521181                END DO
    11531182              END DO
    11541183            END DO
    1155           END DO
     1184          END IF
    11561185        END DO
    11571186      END DO
     
    11611190          ix = INT(outLlw(1,1,i,j))
    11621191          iy = INT(outLlw(2,1,i,j))
    1163           DO k=1, d3
    1164             DO l=1, d4
    1165               DO m=1, d5
    1166                 varout(i,j,k,l,m) = var5Din(ix,iy,k,l,m)
     1192          IF ( (outLlw(3,1,i,j) == -1.) .OR. (mask(ix,iy,1,1,1) == 0) ) THEN
     1193            varout(i,j,:,:,:) = fillVal64
     1194          ELSE
     1195            DO k=1, d3
     1196              DO l=1, d4
     1197                DO m=1, d5
     1198                  varout(i,j,k,l,m) = var5Din(ix,iy,k,l,m)*outLlw(3,1,i,j)
     1199                END DO
    11671200              END DO
    11681201            END DO
    1169           END DO
     1202          END IF
    11701203        END DO
    11711204      END DO
  • trunk/tools/nc_var_tools.py

    r1184 r1185  
    1630916309            varoutt = fin.module_forinterpolate.var2d_intproj(var2din=varint,        \
    1631016310              inlonv=ilont, inlatv=ilatt, projlon=rlont, projlat=rlatt, intkind=kind,\
    16311               idimx=idx, idimy=idy, pdimx=rdx, pdimy=rdy)
     16311              mask=inmaskt, idimx=idx, idimy=idy, pdimx=rdx, pdimy=rdy)
    1631216312        elif Nvarind == 3:
    1631316313            varoutt = fin.module_forinterpolate.var3d_intproj(var3din=varint,        \
     
    1631816318            varoutt = fin.module_forinterpolate.var4d_intproj(var4din=varint,        \
    1631916319              inlonv=ilont, inlatv=ilatt, projlon=rlont, projlat=rlatt, intkind=kind,\
    16320               idimx=idx, idimy=idy, pdimx=rdx, pdimy=rdy, d3=varin.shape[0],         \
    16321               d4=varin.shape[1])
     16320              mask=inmaskt, idimx=idx, idimy=idy, pdimx=rdx, pdimy=rdy,              \
     16321              d3=varin.shape[1], d4=varin.shape[0])
    1632216322        elif Nvarind == 5:
    1632316323            varoutt = fin.module_forinterpolate.var5d_intproj(var5din=varint,        \
    1632416324              inlonv=ilont, inlatv=ilatt, projlon=rlont, projlat=rlatt, intkind=kind,\
    16325               idimx=idx, idimy=idy, pdimx=rdx, pdimy=rdy, d3=varin.shape[0],         \
    16326               d4=varin.shape[1], d5=varin.shape[2])
     16325              mask=inmaskt, idimx=idx, idimy=idy, pdimx=rdx, pdimy=rdy,              \
     16326              d3=varin.shape[2], d4=varin.shape[1], d5=varin.shape[0])
    1632716327        else:
    1632816328            print errormsg
Note: See TracChangeset for help on using the changeset viewer.