SUBROUTINE solcor(britin,i4time,satlon,rlat,rlon,britout),7 IMPLICIT NONE ! INTEGER :: britin INTEGER :: i4time REAL :: satlon REAL :: rlat REAL :: rlon INTEGER :: britout ! ! Satellite and sun position variables ! REAL :: latsat,lonsat,rangesat REAL :: pi,halfpi,dtr,rtd REAL :: solx,soly,solz REAL :: satx,saty,satz SAVE pi,halfpi,dtr,rtd SAVE solx,soly,solz SAVE satx,saty,satz ! ! Constants used in photometric correction ! REAL :: s1,s2 SAVE s1,s2 ! REAL :: wfactor PARAMETER (wfactor=18.) REAL :: r01,rinf1,da1,r02,rinf2,da2,r31,r41,r32,r42 PARAMETER (da1=12., & r01=0., & rinf1=71., & da2=0., & r02=80., & rinf2=230., & r31=68., & r41=220., & r32=272., & r42=880.) REAL :: r41mr31,r42mr32,a1,a2 PARAMETER (r41mr31=r41-r31, & r42mr32=r42-r32, & a1=rinf1-r01, & a2=rinf2-r02) ! ! Physical constants ! ! au mean earth to sun distance (m) ! eradius mean earth radius (m) ! aunor earth-to-sun distance normalized by earth radius ! REAL :: au,eradius,aunor PARAMETER (au = 1.4956E11, & eradius = 6.371E06, & aunor = au/eradius) ! ! Misc local variables ! REAL :: alt,dec,hrangle REAL :: decrad,hrangrad,latrad,lonrad,altrad REAL :: pixx,pixy,pixz REAL :: rnor,delta,emiss,phase,ph2,phcor REAL :: r1,r2,rin11,rin12,rin21,rin22,rout1,rout2 ! ! Statement function ! REAL :: arctanh,x arctanh(x) = 0.5*LOG((1.+x)/(1.-x)) ! CALL solar_pos(rlat,rlon,i4time,alt,dec,hrangle) IF(alt > 0.) THEN ! ! Find position of pixel in cartesian coordinate ! centered at center of earth, x axis to lat=0., lon=0., ! and zaxis to the north pole. ! Earth's radius is used as unit length ! so distance is unity for this calculation. ! latrad=dtr*rlat lonrad=dtr*rlon pixx=COS(lonrad)*COS(latrad) pixy=SIN(lonrad)*COS(latrad) pixz=SIN(latrad) ! ! Find angle between vectors ! satellite-to-pixel and center-of-earth-to-pixel ! CALL deltaang((satx-pixx),(saty-pixy),(satz-pixz), & pixx,pixy,pixz,delta) emiss=halfpi-delta ! ! Find angle between vectors ! pixel-to-satellite and pixel-to-sun ! CALL deltaang((pixx-satx),(pixy-saty),(pixz-satz), & (pixx-solx),(pixy-soly),(pixz-solz),delta) phase=AMAX1(AMIN1(halfpi,delta),0.) ! ! Phase angle correction term ! altrad=dtr*alt ph2=COS(phase) ph2=ph2*ph2 phcor=20.*(ph2*ph2*ph2)*SQRT(COS(emiss))*(SIN(altrad))**0.25 ! ! Stretching parameters ! r1=r01+a1*TANH(s1*dtr*(alt+da1))+phcor r2=r02+a2*TANH(s2*dtr*(alt+da2))+phcor ! ! Apply stretching ! britout=nint(r1+(FLOAT(britin)-r1)*r41mr31/(r2-r1)) britout=MIN(britout,255) britout=MAX(britout,0) ELSE britout=britin END IF ! RETURN ! ENTRY solr1r2(i4time,satlon,rlat,rlon,rout1,rout2) CALL solar_pos(rlat,rlon,i4time,alt,dec,hrangle) IF(alt > 0.) THEN ! ! Find position of pixel in cartesian coordinate ! centered at center of earth, x axis to lat=0., lon=0., ! and zaxis to the north pole. ! Earth's radius is used as unit length ! so distance is unity for this calculation. ! latrad=dtr*rlat lonrad=dtr*rlon pixx=COS(lonrad)*COS(latrad) pixy=SIN(lonrad)*COS(latrad) pixz=SIN(latrad) ! ! Find angle between vectors ! satellite-to-pixel and center-of-earth-to-pixel ! CALL deltaang((satx-pixx),(saty-pixy),(satz-pixz), & pixx,pixy,pixz,delta) emiss=halfpi-delta ! ! Find angle between vectors ! pixel-to-satellite and pixel-to-sun ! CALL deltaang((pixx-satx),(pixy-saty),(pixz-satz), & (pixx-solx),(pixy-soly),(pixz-solz),delta) phase=AMAX1(AMIN1(halfpi,delta),0.) ! ! Phase angle correction term ! altrad=dtr*alt ph2=COS(phase) ph2=ph2*ph2 phcor=20.*(ph2*ph2*ph2)*SQRT(COS(emiss))*(SIN(altrad))**0.25 ! ! Stretching parameters ! rout1=r01+a1*TANH(s1*dtr*(alt+da1))+phcor rout2=r02+a2*TANH(s2*dtr*(alt+da2))+phcor ELSE rout1=r31 rout2=r41 END IF RETURN ENTRY solrsc1(britin,rin11,rin21,britout) britout=nint(r31+(FLOAT(britin)-rin11)*r41mr31/(rin21-rin11)) britout=MIN(britout,255) britout=MAX(britout,0) RETURN ENTRY solrsc2(britin,rin12,rin22,britout) britout= & nint(r32+(FLOAT(britin)-4*rin12)*r42mr32/(4*(rin22-rin12))) britout=MIN(britout,1023) britout=MAX(britout,0) RETURN ! ENTRY solcorset(i4time,latsat,lonsat,rangesat) ! pi=4.*ATAN(1.) dtr=pi/180. rtd=180./pi halfpi=0.5*pi s1=arctanh((r31-r01)/a1)/(dtr*(58.+da1)) s2=arctanh((r41-r02)/a2)/(dtr*(58.+da2)) PRINT *, ' Solcorset s1= ',s1,' s2= ',s2 ! CALL solar_pos(0.,0.,i4time,alt,dec,hrangle) decrad=dtr*dec hrangrad=dtr*hrangle solx=COS(-hrangrad)*COS(decrad)*aunor soly=SIN(-hrangrad)*COS(decrad)*aunor solz=SIN(decrad)*aunor ! latrad=dtr*latsat lonrad=dtr*lonsat rnor=rangesat/eradius satx=COS(lonrad)*COS(latrad)*rnor saty=SIN(lonrad)*COS(latrad)*rnor satz=SIN(latrad)*rnor RETURN END SUBROUTINE solcor ! SUBROUTINE deltaang(x1,y1,z1,x2,y2,z2,delta) 4 IMPLICIT NONE REAL :: x1,y1,z1,x2,y2,z2,delta ! REAL :: vmag1,vmag2,vmag3,x3,y3,z3 REAL :: dotp,sindel,cosdel ! vmag1=x1*x1+y1*y1+z1*z1 vmag2=x2*x2+y2*y2+z2*z2 x3=y1*z2 - z1*y2 y3=z1*x2 - x1*z2 z3=x1*y2 - y1*x2 vmag3=x3*x3+y3*y3+z3*z3 dotp=x1*x2+y1*y2+z1*z2 sindel=vmag3/(vmag1*vmag2) cosdel=dotp/(vmag1*vmag2) delta=ATAN2(sindel,cosdel) RETURN END SUBROUTINE deltaang