program pentad2gldas C===================================================================== C DISAGGREGATTE CPC/CMAP PENTAD (2.5 DEG, 5 DAY, MM/DAY) C BASED ON EMC/GDAS PRATE (T62 1.9 DEG, 6 HR, KG/M2/S) C (T170 0.7 DEG, 6 HR, KG/M2/S) C (T254 0.5 DEG, 6 HR, KG/M2/S) C (T382 0.3 DEG, 6 HR, KG/M2/S) C (1 KG/M2/S = 86400 MM/DAY) C C COMPILE: makefile C INPUT : pentad2gldas.in C OUTPUT: AS DESCRIBED IN output.files C C METHOD: C 1. GET A PENTAD CMAP
(2.5 DEG, 5 DAYS ACCUMULATE)
C 2. GET THE CORRESPONDING 5 DAYS GDAS , CREATE NEW POINTER ARRAYS
C = 0 | != 0 |
C |----------+-----------+------------------------------|
C | = 0 | TO 2.5 DEG, 6 HR, -> IN 5 DAYS ACCUMULATE
C
C 7. IPOLATE(NEIGHBOR)
C ----------------------------------------------------------------
print*,"1. GET A PENTAD CMAP "
call getPentad( mxP, myP, pentadFile, p250_5dy )
if( options(2) .EQ. 1 ) then
ioUnit = 21
call output( outpath, ioUnit, mxP, myP, 1, p250_5dy )
end if
C ----------------------------------------------------------------
C 2. GET 5 DAYS GDAS_PRATE -> TO 2.5 DEG, 6HR, ->
C Q(I,J) = P(I,J) * A(WI,WJ) / B(WI,WJ)
C WHICH AGREE WITH IN TIME PHASE
C AND AGREE WITH
TO 0.7 DEG, 6 HR, ->
, 2.5 DEG, 6HR
C Q(i,j) = P(i,j) * A(wi,wj) / B(wi,wj)
C 7. IPOLATES(NEIGHBOR)
2.5 DEG -->
"
C ----------------------------------------------------------------
C 6.1. INITIALIZE INPUT GDS (GLOBAL LAT/LON 2.5 DEG)
C ----------------------------------------------------------------
kgdsi(1) = 0
kgdsi(2) = mxP
kgdsi(3) = myP
kgdsi(4) = -88750
kgdsi(5) = 1250
kgdsi(6) = 128
kgdsi(7) = 88750
kgdsi(8) = -1250
kgdsi(9) = 2500
kgdsi(10)= 2500
kgdsi(11)= 64
kgdsi(12)= 0
kgdsi(13)= 0
kgdsi(14)= 0
kgdsi(15)= 0
kgdsi(16)= 0
kgdsi(17)= 0
kgdsi(18)= 0
kgdsi(19)= 0
kgdsi(20)= 255
kgdsi(21)= 0
kgdsi(22)= 0
C ----------------------------------------------------------------
C 6.2. INITIALIZE OUTPUT GDS (GLOBAL GAUSSIAN 0.7 DEG)
C ----------------------------------------------------------------
kgdso(1) = 4
kgdso(2) = mxR
kgdso(3) = myR
kgdso(4) = 89761
kgdso(5) = 0
kgdso(6) = 128
kgdso(7) = -89761
kgdso(8) = -3125
kgdso(9) = 3125
kgdso(10)= 288
kgdso(11)= 0
kgdso(12)= 0
kgdso(13)= 0
kgdso(14)= 0
kgdso(15)= 0
kgdso(16)= 0
kgdso(17)= 0
kgdso(18)= 0
kgdso(19)= 0
kgdso(20)= 255
kgdso(21)= 0
kgdso(22)= 0
C ----------------------------------------------------------------
C 6.3. ALLOCATE MEMORY
C ----------------------------------------------------------------
mi = mxP * myP
allocate ( li(mi) )
allocate ( hi(mi) )
mo = mxR * myR
allocate ( rlat(mo) )
allocate ( rlon(mo) )
allocate ( lo(mo) )
allocate ( ho(mo) )
ip = 3
ipopt(1) = -1
ipopt(2) = -1
ibi = 1
li = .FALSE.
do 900 h = 1, mt
C ----------------------------------------------------------------
C 6.4. CALCULATE
C ----------------------------------------------------------------
print*
print*,"6.4.",h," CALCULATE
"
k = 0
do j = 1, myP
do i = 1, mxP
i2 = wi(i,j)
j2 = wj(i,j)
if ( p250_5dy(i,j) .GT. 0. ) then
q250_6hr(i,j) = p250_5dy(i,j) *
& a250_6hr(i2,j2,h) / b250_5dy(i2,j2)
else
q250_6hr(i,j) = p250_5dy(i,j)
end if
if ( a250_6hr(i2,j2,h) .LT. 0 ) then
q250_6hr(i,j) = undef
endif
k = k + 1
hi(k) = q250_6hr(i,j)
li(k) = ( hi(k) .GE. 0. )
end do
end do
if( options(2) .EQ. 1 ) then
ioUnit = 3000 + h
call output( outpath, ioUnit, mxP, myP, 1, q250_6hr )
endif
C ----------------------------------------------------------------
C 7.1. IPOLATES(NEIGHBOR)
2.5 DEG -->
TO 1.9 DEG ->