00001
00002 subroutine sibdrv_interp(sib, time)
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 use kinds
00017 use sibtype
00018 use timetype
00019 use sib_const_module, only: &
00020 rgfac, &
00021 subcount, &
00022 cosz_min
00023 use physical_parameters, only: kappa
00024
00025 implicit none
00026
00027
00028 type(sib_t), dimension(subcount), intent(inout) :: sib
00029 type(time_struct), intent(in) :: time
00030
00031
00032 real(kind=dbl_kind):: facsibdrv
00033 real(kind=dbl_kind):: temp
00034 integer(kind=int_kind) :: i
00035
00036
00037 do i = 1,subcount
00038 sib(i)%prog%pco2m = 35.0
00039 sib(i)%prog%psb = 50.0
00040
00041
00042 sib(i)%prog%pcosm = 4.5E-5
00043
00044
00045
00046 enddo
00047
00048
00049 call zenith_angle( time%hour, sib(:)%stat%cosz )
00050
00051
00052 do i = 1,subcount
00053
00054
00055 if((sib(i)%stat%cosz>cosz_min).and.(sib(i)%stat%coszbar.ne.0.0_dbl_kind))then
00056 sib(i)%prog%sw_dwn = sib(i)%prog%sw_dwn2 * max(sib(i)%stat%cosz-cosz_min,0.0_dbl_kind )/sib(i)%stat%coszbar
00057 else
00058 sib(i)%prog%sw_dwn=0.
00059 endif
00060
00061
00062
00063 if(sib(i)%prog%sw_dwn<0.) sib(i)%prog%sw_dwn = 0.
00064 enddo
00065
00066
00067 call raddrv(subcount,sib(:)%prog%sw_dwn,sib(:)%stat%cosz,sib%prog%radvbc, &
00068 sib%prog%radvdc,sib%prog%radnbc,sib%prog%radndc)
00069
00070
00071 facsibdrv = 1. -float(mod(time%sec_day,time%driver_step)) / float(time%driver_step)
00072
00073
00074 do i = 1,subcount
00075
00076
00077 sib(i)%prog%tm = facsibdrv*sib(i)%prog%tm1 + (1. - facsibdrv) * &
00078 sib(i)%prog%tm2
00079
00080
00081 sib(i)%prog%sh = facsibdrv*sib(i)%prog%sh1 + (1. - facsibdrv) * &
00082 sib(i)%prog%sh2
00083
00084
00085 sib(i)%prog%ps = facsibdrv*sib(i)%prog%ps1 + &
00086 (1. - facsibdrv) * sib(i)%prog%ps2
00087
00088
00089 sib(i)%prog%spdm = facsibdrv*sib(i)%prog%spdm1 + &
00090 (1. - facsibdrv) * sib(i)%prog%spdm2
00091 sib(i)%prog%spdm = MAX(sib(i)%prog%spdm,1.0_dbl_kind)
00092
00093
00094 sib(i)%prog%lspr = sib(i)%prog%lspr1 / time%driver_step
00095
00096
00097 sib(i)%prog%cupr = sib(i)%prog%cupr1 / time%driver_step
00098
00099
00100 sib(i)%prog%dlwbot = facsibdrv*sib(i)%prog%dlwbot1 + &
00101 (1. - facsibdrv) * sib(i)%prog%dlwbot2
00102
00103
00104 sib(i)%prog%bps(1) = (0.001*sib(i)%prog%ps)**kappa
00105 sib(i)%prog%bps(2) = (0.001*(sib(i)%prog%ps-sib(i)%prog%psb))**kappa
00106 sib(i)%prog%thm = sib(i)%prog%tm / sib(i)%prog%bps(1)
00107
00108
00109 sib(i)%prog%ros = rgfac * sib(i)%prog%ps / sib(i)%prog%tm
00110
00111 enddo
00112
00113
00114
00115 if( time%sec_tot == time%init_second ) then
00116 print*, 'sibdrv_interp: init CAS humidity'
00117 do i=1,subcount
00118 sib(i)%prog%sha = sib(i)%prog%sh
00119 enddo
00120 endif
00121
00122 end subroutine sibdrv_interp
00123
00124
00125 subroutine raddrv(nsib,swdown,sunang,radvbc,radvdc,radnbc,radndc)
00126
00127
00128
00129
00130
00131
00132 use kinds
00133 implicit none
00134
00135 integer(kind=int_kind) :: nsib, i
00136 real(kind=real_kind) ::
00137 cloud,
00138 difrat,
00139 vnrat
00140 real(kind=dbl_kind) ::
00141 swdown(nsib),
00142 sunang(nsib),
00143 stemp,
00144 localcosz
00145 real(kind=dbl_kind) ::
00146 radvbc(nsib),
00147 radvdc(nsib),
00148 radnbc(nsib),
00149 radndc(nsib)
00150
00151 real(kind=dbl_kind),parameter :: c1 = 580.
00152 real(kind=dbl_kind),parameter :: c2 = 464.
00153 real(kind=dbl_kind),parameter :: c3 = 499.
00154 real(kind=dbl_kind),parameter :: c4 = 963.
00155 real(kind=dbl_kind),parameter :: c5 = 1160.
00156
00157 do i=1,nsib
00158 localcosz = max( 0.001_dbl_kind, sunang(i) )
00159 stemp = swdown(i)
00160 stemp = MAX(stemp,0.01_dbl_kind)
00161
00162 cloud = (c5 * localcosz - stemp) / (c4 * localcosz)
00163 cloud = max(cloud,0.)
00164 cloud = min(cloud,1.)
00165
00166 difrat = 0.0604 / ( sunang(i)-0.0223 + 1.0e-10 ) + 0.0683
00167 if ( difrat < 0. ) difrat = 0.
00168 if ( difrat > 1. ) difrat = 1.
00169 difrat = difrat + ( 1. - difrat ) * cloud
00170
00171 vnrat = ( c1 - cloud*c2 ) / ( ( c1 - cloud*c3 ) + ( c1 - cloud*c2 ) )
00172
00173 radvbc(i) = (1.-difrat)*vnrat*stemp
00174 radvdc(i) = difrat*vnrat*stemp
00175 radnbc(i) = (1.-difrat)*(1.-vnrat)*stemp
00176 radndc(i) = difrat*(1.-vnrat)*stemp
00177 enddo
00178
00179 end subroutine raddrv