Kondo, J. 1975: Air-sea bulk transfer coefficients in diabatic conditions. Boundary-Layer Meteorology, 9 (1), 91-112.
subroutine flux_kondo(prs, sat, rh, u10, v10, sstk, qh, qe, ev)
!
! Description: Surface heat flux by Kondo
!
! Author: am
!
! Host: aofd165.fish.nagasaki-u.ac.jp
! Directory: /work1/am/Sato.Kodama.Manda2015/MSM.MGDSST.FLUX.Trajectory
!
real,intent(in):: prs, sat, rh, u10, v10, sstk
real,intent(out)::qh, qe, ev
! slp [Pa]
! sstk [K]
! sat [K]
! rh [%]
! u10 [m/s]
! v10 [m/s]
! q specific humidity [kg/kg]
! qh SHF [W/m2]
! qe: LHF [W/m2]
! ev: Evapolation [mm/h]
real ae(5)/0., 0.969, 1.18, 1.196, 1.68/
real ah(5)/0., 0.927, 1.15, 1.17, 1.652/
real be(5)/1.23, 0.0521, 0.01, 0.008, -0.016/
real bh(5)/1.185, 0.0546, 0.01, 0.0075, -0.017/
real ce(5)/0., 0, 0, -0.0004, 0./
real ch(5)/0., 0, 0, -0.00045, 0./
real pe(5)/-0.16, 1., 1., 1., 1./
real ph(5)/-0.157, 1., 1., 1., 1./
real es,essea,qs,dens
real chn,cln,chg,clg,s0,s
parameter(LH=2500,cp=1004)
slp=prs/100.0 !Pa -> hPa
sst=sstk-273.15 !K -> degC
t=sat-273.15
v=sqrt(u10**2+v10**2)
if (v.le.2.2) l=1
if (v.gt.2.2 .and. v.le.5.0) l=2
if (v.gt.5.0 .and. v.le.8.0) l=3
if (v.gt.8.0 .and. v.le.25.0) l=4
if (v.gt.25.0 .and. v.le.50.0) l=5
chn=0.001*(ah(l) + bh(l)*v**ph(l) + ch(l)*(v-8)**2)
cln=0.001*(ae(l) + be(l)*v**pe(l) + ce(l)*(v-8)**2)
s0=(sst-t)/(v**2)
s=s0*abs(s0)/(abs(s0)+0.01)
if(s.lt. -3.3) then
chg=0.0
clg=0.0
else if(s .lt. 0.0) then
chg=chn*(0.1+0.03*s+0.9*exp(4.8*s))
clg=cln*(0.1+0.03*s+0.9*exp(4.8*s))
else
chg=chn*(1.0+0.63*sqrt(s))
clg=cln*(1.0+0.63*sqrt(s))
endif
es=6.11*exp((LH/0.4615)*(1.0/273.2-1.0/(t+273.15)))
essea=6.11*exp((LH/0.4615)*(1.0/273.2-1.0/(sst+273.15)))*100/rh
q=0.622*es/slp
qs=0.622*essea/slp
dens=slp/(2.87*(1+0.61*q)*(t+273.15))
! write(6,*) 'dens,s,chg,clg,es,essea,q,qs'
! write(6,*) dens,q,qs
qh=dens*cp*chg*v*(sst-t)
qe=dens*LH*1000*clg*v*(qs-q)
ev=qe/(LH*1000.0)*3600.0 !mm/h
end subroutine
program flux_calculator
! Description:
!
! Author: am
!
! Host: aofd165.fish.nagasaki-u.ac.jp
! Directory: /work2/kunoki/to_manda_sensei/Tools/Flux.Calculator
!
! Revision history:
! This file is created by /usr/local/mybin/nff.sh at 16:25 on 10-17-2014.
character(len=500)::ofle
real prs, sat, rh, u10, v10, sst
real ae(5)/0., 0.969, 1.18, 1.196, 1.68/
real ah(5)/0., 0.927, 1.15, 1.17, 1.652/
real be(5)/1.23, 0.0521, 0.01, 0.008, -0.016/
real bh(5)/1.185, 0.0546, 0.01, 0.0075, -0.017/
real ce(5)/0., 0, 0, -0.0004, 0./
real ch(5)/0., 0, 0, -0.00045, 0./
real pe(5)/-0.16, 1., 1., 1., 1./
real ph(5)/-0.157, 1., 1., 1., 1./
real es,essea,qs,dens
real chn,cln,chg,clg,s0,s
real ev ! Evapolation in mm/h
parameter(LH=2500,cp=1004)
real MOL !Monin-Obukov Length [m]
namelist /para/ofle,prs, sat, rh, u10, v10, sst
read(*,nml=para)
! slp [hPa]
! sst [degC]
! t [degC]
! rh [%]
! v [m/s]
! q [kg/kg]
! qh [W/m2]
! qe [W/ms]
! taux [W/s2] !Eastward wind stress
! tauy [W/s2] !
! fv [m/s] !frictional velocity [m/s]
! MOL [m] !Monin-Obukov Length
slp=prs
sst=sst
t=sat
v=sqrt(u10**2+v10**2)
if (v.le.2.2) l=1
if (v.gt.2.2 .and. v.le.5.0) l=2
if (v.gt.5.0 .and. v.le.8.0) l=3
if (v.gt.8.0 .and. v.le.25.0) l=4
if (v.gt.25.0 .and. v.le.50.0) l=5
chn=0.001*(ah(l) + bh(l)*v**ph(l) + ch(l)*(v-8)**2)
cln=0.001*(ae(l) + be(l)*v**pe(l) + ce(l)*(v-8)**2)
s0=(sst-t)/(v**2)
s=s0*abs(s0)/(abs(s0)+0.01)
if(s.lt. -3.3) then
chg=0.0
clg=0.0
else if(s .lt. 0.0) then
chg=chn*(0.1+0.03*s+0.9*exp(4.8*s))
clg=cln*(0.1+0.03*s+0.9*exp(4.8*s))
else
chg=chn*(1.0+0.63*sqrt(s))
clg=cln*(1.0+0.63*sqrt(s))
endif
es=6.11*exp((LH/0.4615)*(1.0/273.2-1.0/(t+273.15)))
essea=6.11*exp((LH/0.4615)*(1.0/273.2-1.0/(sst+273.15)))*100/rh
q=0.622*es/slp
qs=0.622*essea/slp
dens=slp/(2.87*(1+0.61*q)*(t+273.15))
! write(6,*) 'dens,s,chg,clg,es,essea,q,qs'
! write(6,*) dens,q,qs
!
qh=dens*cp*chg*v*(sst-t)
qe=dens*LH*1000*clg*v*(qs-q)
ev=qe/(LH*1000.0)*3600.0 !mm/h
cd=0.001
taux=cd*dens*u10*v
tauy=cd*dens*v10*v
tau=sqrt(taux**2+tauy**2)
fv=sqrt(tau/dens)
tflux=(qh+qe)/(cp*dens)
MOL=-fv**3*(sat+273.15)/(0.4*9.8*tflux)
open(21,file=ofle)
write(21,'(A,f10.2)')'prs[Pa] = ',prs
write(21,'(A,f10.2)')'sst[degC] = ',sst
write(21,'(A,f10.2)')'sat[degC] = ',sat
write(21,'(A,f10.2)')'u10[m/2] = ',u10
write(21,'(A,f10.2)')'v10[m/2] = ',v10
write(21,'(A,f10.2)')'rh[%] = ',rh
write(21,'(A,f10.2)')'qh[W/m2] = ',qh
write(21,'(A,f10.2)')'qe[W/m2] = ',qe
write(21,'(A,f10.5)')'ev[mm/h] = ',ev
write(21,'(A,f10.5)')'tau[W/m2] = ',tau
write(21,'(A,f10.5)')'fv[m/s] = ',fv
write(21,'(A,f10.5)')'MOL[m] = ',MOL
write(*,'(A,f10.2)')'prs[Pa] = ',prs
write(*,'(A,f10.2)')'sst[degC] = ',sst
write(*,'(A,f10.2)')'sat[degC] = ',sat
write(*,'(A,f10.2)')'u10[m/2] = ',u10
write(*,'(A,f10.2)')'v10[m/2] = ',v10
write(*,'(A,f10.2)')'rh[%] = ',rh
write(*,'(A,f10.2)')'qh[W/m2] = ',qh
write(*,'(A,f10.2)')'qe[W/m2] = ',qe
write(*,'(A,f10.5)')'ev[mm/h] = ',ev
write(*,'(A,f10.5)')'tau[W/m2] = ',tau
write(*,'(A,f10.5)')'fv[m/s] = ',fv
write(*,'(A,f10.5)')'tflux[K/m2/s]= ',tflux
write(*,'(A,f10.5)')'MOL[m] = ',MOL
print *
write(*,'(A,A)')'Output file: ',trim(ofle)
print *
end program flux_calculator
#j Fortran77とFortran90/95の混成プログラムのコンパイル用makefile
#
#j 参考文献
#j makefile の書き方
#j http://www.eis.osakafu-u.ac.jp/~yabu/soft/makefile.html
#j Makefile小技と新バージョンのDelFEM(FEMとUIの日記@New York)
#j http://d.hatena.ne.jp/etopirika5/20091207/1260207955
#
#-----------------------------------------
#j マクロの定義
#-----------------------------------------
#j コンパイラの指定
FC=ifort
#FC=gfortran
#FC=g77
#FC=f77
#j OBJDIR (オブジェクトファイルをおくディレクトリ)
OBJDIR=../obj
#-----------------------------------------
#j コンパイルオプション(ifort)
#-----------------------------------------
#j デバッグ用オプション(はじめて実行するときには必ずこのオプションをつけてコンパイルする)
FDFLAGS= #-CB -traceback -fpe0
#j コンパイルオプション
FFLAGS=-module ${OBJDIR}
#j -module : モジュールファイル(.mod)を置く場所を指定する
#j 最適化用(他にも何種類かある. ifort -helpかマニュアルを見て調べる)
#FFLAGS = -O3 -module ${OBJDIR}
#j 倍精度
#FFLAGS = -r8 -module ${OBJDIR}
#j 入力データのバイト・スワップ(大型計算機のバイナリデータを読む時などにつかう)
#FFLAGS = #-convert big_endian -module ${OBJDIR}
#-----------------------------------------
#j リンク用のオプション
#-----------------------------------------
LDFLAGS=-module ${OBJDIR}
#j ターゲット名(最終的に作りたい実行ファイル名)
TARGET1=flux.calculator
TARGET2=
TARGETS=$(TARGET1) $(TARGET2)
#j MOD (Fortran90以降のモジュールファイル)
MOD=
#j SRC7 (Fortran77のソースファイル)
SRC7=
#j SRC9 (Fortran90のソースファイル)
SRC9=flux.calculator.f90
#j OBJ1 (ターゲットを作るのに必要なオブジェクトファイル名)
OBJM=$(MOD:.f90=.o)
OBJ7=$(SRC7:.f=.o)
OBJ9=$(SRC9:.f90=.o)
OBJTMP=$(OBJM) $(OBJ7) $(OBJ9)
OBJ1=$(OBJTMP:%=${OBJDIR}/%)
MOD2=
#j SRC7 (Fortran77のソースファイル)
SRC72=
#j SRC9 (Fortran90のソースファイル)
SRC92=
#j OBJ (ターゲットを作るのに必要なオブジェクトファイル名)
OBJM2=$(MOD2:.f90=.o)
OBJ72=$(SRC72:.f=.o)
OBJ92=$(SRC92:.f90=.o)
OBJTMP2=$(OBJM2) $(OBJ72) $(OBJ92)
OBJ2=$(OBJTMP2:%=${OBJDIR}/%)
OBJ=$(OBJ1) $(OBJ2)
#-----------------------------------------
#j ここからコンパイルのルールの記述
#-----------------------------------------
all: mkobjd $(TARGETS)
$(TARGET1): $(OBJ1)
$(FC) -o $@ $(OBJ1) ${LDFLAGS}
$(TARGET2): $(OBJ2)
$(FC) -o $@ $(OBJ2) ${LDFLAGS}
#j 暗黙のサフィックスルールを無効にする
.SUFFIXES:
#j サフィックスの追加
.SUFFIXES: .o .f .f90
#j f77のソースファイルのコンパイル(.f用のサフィックスルール)
${OBJDIR}/%.o : %.f
$(FC) -c ${FDFLAGS} ${FFLAGS} -c -o $@ $<
#j f90のソースファイルのコンパイル(.f90用のサフィックスルール)
${OBJDIR}/%.o : %.f90
$(FC) -c ${FDFLAGS} ${FFLAGS} -c -o $@ $<
#j オブジェクトファイルを削除
clean:
rm -rf $(OBJ) ${OBJDIR}/*.mod
#j オブジェクトファイルと実行ファイルを削除
distclean:
rm -rf $(OBJ) ${OBJDIR}/*.mod $(TARGETS) \
rm -rf ${OBJDIR}
#j オブジェクトファイルを置くディレクトリを作成
mkobjd:
if [ ! -d ${OBJDIR} ]; then \
mkdir -p ${OBJDIR} ; \
fi
run:
cd .. ; \
./run.sh 2>&1 > log.txt ; \
cd src
#j tarファイルを作る
tar:
tar cvf $(TARGET1).tar ./*.f90 ./*.f ./*.c ./*.h ./*.txt makefile
#!/bin/bash
# Description:
#
# Author: am
#
# Host: aofd165.fish.nagasaki-u.ac.jp
# Directory: /work2/kunoki/to_manda_sensei/Tools/Flux.Calculator
#
# Revision history:
# This file is created by /usr/local/mybin/nbscr.sh at 16:26 on 10-17-2014.
exe=flux.calculator
namelist=${exe}.namelist.txt
cat << EOF >$namelist
¶
ofle=MandA2013.Leg3.Flux.Stn03flux.txt
sat=22.3 !degC
sst=22.5 !degC
u10=-0.482 !m/s
v10=-14.167!m/s
prs=1005.6!hPa
rh=98.2 !%
&end
EOF
${exe} < $namelist
echo "Done $0"
echo