37 PUBLIC :: solrad,shortrad,evapo,leap,daynum
55 &(ray_sol,nebu,mardat,martim,at,latitude,longitude)
108 INTEGER,
INTENT(IN) :: MARDAT(3),MARTIM(3)
109 DOUBLE PRECISION,
INTENT(IN) :: AT,NEBU
110 DOUBLE PRECISION,
INTENT(IN) :: LATITUDE,LONGITUDE
111 DOUBLE PRECISION,
INTENT(OUT) :: RAY_SOL
115 INTEGER IYEAR,IMONTH,IDAY,IHOUR,IMIN,ISEC
117 DOUBLE PRECISION DTR,PI,ALB
118 DOUBLE PRECISION DAY,DAYREEL,NDAYS
125 DOUBLE PRECISION HA,HR,RDEC,RLAT,SING,TE
127 DOUBLE PRECISION AA,BB
162 day = daynum(iyear,imonth,iday,ihour,imin,isec)
163 & + floor(at/86400.d0)
164 ndays = 365.d0 +
REAL(leap(iyear))
165 dayreel = modulo(day, ndays)
168 IF(dayreel.GE.0.d0.AND.dayreel.LE.31.d0)
THEN 170 ELSEIF(dayreel.GT.31.d0.AND.dayreel.LE.59.d0)
THEN 172 ELSEIF(dayreel.GT.59.d0.AND.dayreel.LE.90.d0)
THEN 174 ELSEIF(dayreel.GT.90.d0.AND.dayreel.LE.120.d0)
THEN 176 ELSEIF(dayreel.GT.120.d0.AND.dayreel.LE.151.d0)
THEN 178 ELSEIF(dayreel.GT.151.d0.AND.dayreel.LE.181.d0)
THEN 180 ELSEIF(dayreel.GT.181.d0.AND.dayreel.LE.212.d0)
THEN 182 ELSEIF(dayreel.GT.212.d0.AND.dayreel.LE.243.d0)
THEN 184 ELSEIF(dayreel.GT.243.d0.AND.dayreel.LE.273.d0)
THEN 186 ELSEIF(dayreel.GT.273.d0.AND.dayreel.LE.304.d0)
THEN 188 ELSEIF(dayreel.GT.304.d0.AND.dayreel.LE.334.d0)
THEN 190 ELSEIF(dayreel.GT.334.d0.AND.dayreel.LE.365.d0)
THEN 196 rdec = (23.45d0*cos(2.d0*pi*(172.d0-dayreel)/ndays))*dtr
199 te = ( 450.68d0*sin(2.d0*pi*dayreel/ndays-0.026903d0)
200 & +595.40d0*sin(4.d0*pi*dayreel/ndays+0.352835d0))/3600.d0
202 hr = ihour+modulo(at,86400.d0)/3600.d0
205 ha = (hr-te-12.d0 + longitude/15.d0)*pi/12.d0
206 sing = sin(rlat)*sin(rdec) + cos(rlat)*cos(rdec)*cos(ha)
208 IF(sing.LE.0.d0)
THEN 212 ray_sol = aa*(sing**bb)*(1.d0-0.65d0*(nebu/8.d0)**2)
219 END SUBROUTINE solrad
222 INTEGER FUNCTION leap
254 INTEGER,
INTENT(IN) :: IYEAR
258 IF( mod(iyear,4).EQ.0.AND.
259 & (mod(iyear,100).NE.0.OR.mod(iyear,400).EQ.0))
THEN 271 DOUBLE PRECISION FUNCTION daynum
274 &(iyear,imonth,iday,ihour,imin,isec)
309 INTEGER,
INTENT(IN) :: IYEAR,IMONTH,IDAY,IHOUR,IMIN,ISEC
318 parameter( month=(/0,31,59,90,120,151,181,212,243,273,304,334/) )
322 daynum =
REAL(month(imonth)+iday)
323 & +
REAL(ihour)/24.d0+
REAL(imin)/1440.d0+
REAL(isec)/86400.d0
324 IF(imonth.GT.2) daynum = daynum +
REAL(leap(iyear))
335 &(treel,tair,nebu,hrel,ray_atm,ray_eau)
380 DOUBLE PRECISION,
INTENT(IN) :: TREEL,TAIR,NEBU,HREL
381 DOUBLE PRECISION,
INTENT(OUT) :: RAY_ATM,RAY_EAU
390 DOUBLE PRECISION EPS_STAR
391 DOUBLE PRECISION QSAT_AIR
398 eps_star = (1.d0+0.275d0*(nebu/8.d0))
399 & *(1.d0-0.261d0*exp(-7.77d-8*tair**2))
403 eps_star = (1.d0+
coef_k*(nebu/8.d0)**2)*0.937d-5
404 & *(tair+273.15d0)**2
407 qsat_air = 10.d0**(9.28603523d0-(2322.37885d0/(tair+273.15d0)))
408 eps_star = (1.d0+0.275d0*(nebu/8.d0))*0.642d0
409 & *((hrel/100.d0)*qsat_air/(tair+273.15d0))**(1.d0/7.d0)
412 qsat_air = 10.d0**(9.28603523d0-(2322.37885d0/(tair+273.15d0)))
413 eps_star = (1.d0-(nebu/8.d0)**2.796d0)*1.24d0
414 & *((hrel/100.d0)*qsat_air/(tair+273.15d0))**(1.d0/7.d0)
415 & + 0.955d0*(nebu/8.d0)**2.796d0
417 WRITE(
lu,*)
'FORMULA OF ATMOSPHERIC RADIATION NOT POSSIBLE' 421 ray_atm =
ema*eps_star*
boltz*(tair+273.15d0)**4
429 END SUBROUTINE shortrad
435 &(treel,tair,w2,patm,hrel,ro,flux_evap,flux_sens,debevap,c_atmos,
495 DOUBLE PRECISION,
INTENT(IN) :: TREEL,TAIR,W2,PATM,HREL,RO
496 DOUBLE PRECISION,
INTENT(IN) :: C_ATMOS,C1_ATMOS,C2_ATMOS
497 DOUBLE PRECISION,
INTENT(OUT) :: FLUX_EVAP,FLUX_SENS,DEBEVAP
501 DOUBLE PRECISION Q_SAT_EAU,Q_SAT_AIR,HUMI_EAU,HUMI_AIR,FWW,ROAIR
506 q_sat_eau = exp(2.3026d0*(7.5d0*treel/(treel+237.3d0)+0.7858d0))
507 q_sat_air = exp(2.3026d0*(7.5d0*tair/(tair+237.3d0)+0.7858d0))
510 roair = patm*100.d0/(287.d0*(tair+273.15d0))
511 & - 1.32d-5*hrel*q_sat_air/(tair+273.15d0)
515 humi_eau = 0.622d0*q_sat_eau/(patm-0.378d0*q_sat_eau)
516 humi_air = 0.622d0*(hrel/100.d0)*q_sat_air
517 & / (patm-(0.378d0*(hrel/100.d0)*q_sat_air))
521 fww = c1_atmos+c2_atmos*w2
524 fww = c_atmos*(1.d0+w2)
527 flux_evap = roair*(2500.9d3-treel*2.365d3)*fww
528 & *(humi_eau-humi_air)
529 flux_evap = max(flux_evap,0.d0)
531 flux_sens =
cp_air*roair*fww*(treel-tair)
533 debevap = roair*fww/ro*(humi_eau-humi_air)
534 debevap = max(debevap,0.d0)
double precision, parameter boltz