laiini.f90
来自「CLM集合卡曼滤波数据同化算法」· F90 代码 · 共 205 行
F90
205 行
subroutine laiini(kpt,ivt,dlat,calday,glai,gsai,green,fveg,lai,sai)!======================================================================= implicit none integer, INTENT(in) :: & kpt ! total number of clm land points, including subgrid points integer, INTENT(in) :: & ivt(kpt) ! index for land cover type [-] real, INTENT(in) :: & dlat(kpt), &! latitude in radians: + = NH calday, &! current julian day including fraction glai(18,18,12), &! LAI gsai(18,18,12) ! SAI real, INTENT(out) :: & green(kpt), &! fveg(kpt), &! fraction of vegetation cover lai(kpt), &! LAI sai(kpt) ! SAI integer & i, &! k, &! ireg ! regional index real pie ! pie real frad ! converts degrees to radians. real ldoy ! intermediate variable real ndoy ! intermediate variable real cday ! intermediate variable real fact ! intermediate variable real rmon(12) ! data rmon/31.,59.,90.,120.,151.,181., & 212.,243.,273.,304.,334.,365./ logical observation real glai_obs(12), gsai_obs(12),fveg_obs(12)!-----------------------------------------------------------------------! (1) Valdai! data glai_obs/.00,0.00,0.60,0.70,2.11,4.18,4.07,2.54,0.80,0.60,0.50,0.00/! data gsai_obs /12*0.8/! data fveg_obs /12*1.0/! (2) Cabauw! data glai_obs/0.456, 0.62, 0.726, 0.91, 1.296, 1.638, 1.458, 0.624, 0.66, 0.594, 0.55, 0.45/! data gsai_obs /12*4./! data fveg_obs /0.92, 0.93, 0.94, 0.95, 0.97, 0.98, 0.99, 0.98, 0.97, 0.96, 0.95, 0.93/! (3) Hapex! data glai_obs/4*0.0, 1.0, 4*3.0, 3*0.0/! data gsai_obs /4*0.0, 5*0.5, 3*0.0/! data fveg_obs /4*0.0, 0.5, 4*0.9, 3*0.0/! (4) Abracos forest! data glai_obs/4.48, 4.09, 3.74, 6*3.68, 3.85, 4.36, 4.60/! data gsai_obs /12*1./! data fveg_obs /12*1.0/! (5) Abracos pasture! data glai_obs/1.42, 2.42, 3.00, 3.90, 3.22, 2.55, 1.86, 1.75, 1.66, 0.88, 0.72, 0.57/! data gsai_obs /12*0.5/! data fveg_obs /12*1.0/! (6) Fife! data glai_obs/4*0.008, 1.105, 2.6, 2.7, 2.36, 1.3, 0.7, 0.1, 0.01/! data gsai_obs /12*0.8/! data fveg_obs /12*1.0/! (7) Tucson! data glai_obs/1.55, 1.31, 1.20, 0.89, 0.808, 0.777, 0.806, 0.947, 1.085, 1.437, 1.679, 1.739/! data gsai_obs /12*2.0/! data fveg_obs /12*1.0/! (8) Fort Peck data glai_obs/12*0.0/ data gsai_obs /12*0.0/ data fveg_obs /12*0.0/!----------------------------------------------------------------------- observation = .true. !======================================================================= pie = 4.*atan(1.) frad = pie/180. ! converts degrees to radians.if(.not.observation)then do k = 1, kpt do i = 1, 18 if((dlat(k)> -90.*frad + 10.*float(i-1)*frad) .AND. & (dlat(k)<=-90.*frad + 10.*float(i)*frad))then ireg = i exit endif enddo green(k) = 1. if((calday < 31./2.) .OR. (calday >= 365 - 31./2.) ) then ndoy = 365. + 31./2. ldoy = 365. - 31./2. if(calday < 31./2.) then cday = 365. + calday else cday = calday endif fact = (cday - ldoy)/(ndoy - ldoy) lai(k) = glai(ivt(k),ireg,12) & + fact*(glai(ivt(k),ireg,1) - glai(ivt(k),ireg,12)) if(ivt(k)/=15 .and. ivt(k)/=17 .and. ivt(k)/=18)then lai(k) = max(lai(k), 1.e-6) endif sai(k) = gsai(ivt(k),ireg,12) & + fact*(gsai(ivt(k),ireg,1) - gsai(ivt(k),ireg,12)) else do i = 1, 11 if(i == 1)then ldoy = 31./2 else ldoy = rmon(i) - (rmon(i)-rmon(i-1))/2. endif if(i == 11)then ndoy = 365. - 31./2. else ndoy = rmon(i) + (rmon(i+1)-rmon(i))/2. endif if((calday >= ldoy) .AND. (calday < ndoy))then fact = (calday - ldoy)/(ndoy - ldoy) lai(k) = glai(ivt(k),ireg,i) & + fact*(glai(ivt(k),ireg,i+1) - glai(ivt(k),ireg,i)) if(ivt(k)/=15 .and. ivt(k)/=17 .and. ivt(k)/=18)then lai(k) = max(lai(k), 1.e-6) endif sai(k) = gsai(ivt(k),ireg,i) & + fact*(gsai(ivt(k),ireg,i+1) - gsai(ivt(k),ireg,i)) exit endif enddo endif fveg(k)=1. ! mosaic scheme use only green(k) = 1. print*,'fveg',fveg if(ivt(k)==15 .or. ivt(k)>=17)then fveg(k)=0.; green(k)=0. print*,'fveg',fveg endif enddoelse do k = 1,kpt green(k) = 1. if(k == 1)then if((calday < 31./2.) .OR. (calday >= 365 - 31./2.) ) then ndoy = 365. + 31./2. ldoy = 365. - 31./2. if(calday < 31./2.) then cday = 365. + calday else cday = calday endif fact = (cday - ldoy)/(ndoy - ldoy) lai(k) = glai_obs(12) + fact*(glai_obs(1) - glai_obs(12)) if(ivt(k)/=15 .and. ivt(k)/=17 .and. ivt(k)/=18)then lai(k) = max(lai(k), 1.e-6) endif sai(k) = gsai_obs(12) + fact*(gsai_obs(1) - gsai_obs(12)) fveg(k) = fveg_obs(12) + fact*(fveg_obs(1) - fveg_obs(12)) else do i = 1, 11 if(i == 1)then ldoy = 31./2 else ldoy = rmon(i) - (rmon(i)-rmon(i-1))/2. endif if(i == 11)then ndoy = 365. - 31./2. else ndoy = rmon(i) + (rmon(i+1)-rmon(i))/2. endif if((calday >= ldoy) .AND. (calday < ndoy))then fact = (calday - ldoy)/(ndoy - ldoy) lai(k) = glai_obs(i) + fact*(glai_obs(i+1) - glai_obs(i)) if(ivt(k)/=15 .and. ivt(k)/=17 .and. ivt(k)/=18)then lai(k) = max(lai(k), 1.e-6) endif sai(k) = gsai_obs(i) + fact*(gsai_obs(i+1) - gsai_obs(i)) fveg(k) = fveg_obs(i) + fact*(fveg_obs(i+1) - fveg_obs(i)) exit endif enddo endif else lai(k)=0.;sai(k)=0.;fveg(k)=0.;green(k)=0. endif enddoendif end subroutine laiini
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?