Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merging latest master changes into the feature-hamocc_beyond-CMIP6 branch #246

Merged
merged 11 commits into from
Feb 22, 2023
Merged
6 changes: 3 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ jobs:
if: runner.os == 'Linux'

- name: Install dependencies - macOS
run: brew install netcdf open-mpi ninja
run: brew install netcdf-fortran open-mpi ninja
env:
HOMEBREW_NO_INSTALL_CLEANUP: 1
if: runner.os == 'macOS'
Expand All @@ -44,8 +44,8 @@ jobs:

- name: Build
env:
CC: gcc-10
FC: gfortran-10
CC: gcc-12
FC: gfortran-12
run: |
meson setup builddir -Dmpi=${{ matrix.mpi }} -Dopenmp=${{ matrix.openmp }} --buildtype=debugoptimized
meson compile -C builddir
Expand Down
121 changes: 92 additions & 29 deletions ben02/thermf_ben02.F
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
! ------------------------------------------------------------------------------
! Copyright (C) 2002-2022 Mats Bentsen, Mehmet Ilicak
! Copyright (C) 2002-2023 Mats Bentsen, Mehmet Ilicak
!
! This file is part of BLOM.
!
Expand Down Expand Up @@ -27,6 +27,7 @@ subroutine thermf_ben02(m,n,mm,nn,k1m,k1n)
. nstep_in_day, baclin,
. xmi, l1mi, l2mi, l3mi, l4mi, l5mi
use mod_xc
use mod_vcoord, only: vcoord_type_tag, isopyc_bulkml
use mod_grid, only: scp2, plat, area
use mod_state, only: dp, temp, saln, p
use mod_swtfrz, only: swtfrz
Expand All @@ -36,7 +37,8 @@ subroutine thermf_ben02(m,n,mm,nn,k1m,k1n)
. trxdpt, srxdpt, trxlim, srxlim, srxbal,
. swa, nsf, hmltfz, lip, sop, eva, rnf, rfi,
. fmltfz, sfl, ustarw, surflx, surrlx,
. sswflx, salflx, brnflx, salrlx, ustar
. sswflx, salflx, brnflx, salrlx, ustar,
. t_rs_nonloc, s_rs_nonloc
use mod_swabs, only: swbgal, swbgfc
use mod_ben02, only: tsi_tda, tml_tda, sml_tda, alb_tda, fice_tda,
. tsi, ntda, dfl, albw, alb,
Expand All @@ -53,7 +55,7 @@ subroutine thermf_ben02(m,n,mm,nn,k1m,k1n)
use mod_tracers, only: ntr, itrtke, itrgls, trc, trflx
# ifdef GLS
use mod_diffusion, only: difdia
use mod_tke, only: gls_cmu0, zos, gls_p, gls_m, gls_n, vonKar
use mod_tke, only: gls_cmu0, Zos, gls_p, gls_m, gls_n, vonKar
# endif
# else
use mod_tracers, only: ntr, trc, trflx
Expand All @@ -66,13 +68,13 @@ subroutine thermf_ben02(m,n,mm,nn,k1m,k1n)
c
real, dimension(1-nbdy:idm+nbdy,1-nbdy:jdm+nbdy) :: vrtsfl
c
integer i,j,k,l,m1,m2,m3,m4,m5
integer i,j,k,l,m1,m2,m3,m4,m5,ntld,kn,kl
real dt,cpsw,rnf_fac,sag_fac,y,
. dpotl,hotl,totl,sotl,dpmxl,hmxl,tmxl,smxl,tice_f,hice_min,
. fice,hice,hsnw,tsrf,fice0,hice0,hsnw0,qsww,qnsw,tice,albi,
. tsmlt,albi_h,qswi,dh,qsnwf,fcond,qdamp,qsmlt,qo2i,qbot,swfac,
. dtml,q,volice,df,dvi,dvs,fwflx,sstc,rice,trxflx,sssc,srxflx,
. totsfl,totwfl,sflxc,totsrp,totsrn,A_cgs2mks
. dpotl,hotl,totl,sotl,tice_f,hice_min,fice,hice,hsnw,tsrf,
. fice0,hice0,hsnw0,qsww,qnsw,tice,albi,tsmlt,albi_h,qswi,dh,
. qsnwf,fcond,qdamp,qsmlt,qo2i,qbot,swfac,dtml,q,volice,df,dvi,
. dvs,fwflx,sstc,rice,dpmxl,hmxl,tmxl,trxflx,pbot,dprsi,sssc,
. smxl,srxflx,totsfl,totwfl,sflxc,totsrp,totsrn,A_cgs2mks
#ifdef TRC
integer nt
real, dimension(ntr,1-nbdy:idm+nbdy,1-nbdy:jdm+nbdy) ::
Expand Down Expand Up @@ -116,15 +118,16 @@ subroutine thermf_ben02(m,n,mm,nn,k1m,k1n)
m5=mod(m3+ 1,48)+1
c
c --- Time level for diagnosing heat and salt relaxation fluxes
k=m3
ntld=m3
c
if (ditflx.or.disflx) nflxdi(k)=nflxdi(k)+1
if (ditflx.or.disflx) nflxdi(ntld)=nflxdi(ntld)+1
c
c$OMP PARALLEL DO PRIVATE(
c$OMP+ l,i,dpotl,hotl,totl,sotl,dpmxl,hmxl,tmxl,smxl,tice_f,hice_min,
c$OMP+ fice,hice,hsnw,tsrf,fice0,hice0,hsnw0,qsww,qnsw,tice,albi,tsmlt,
c$OMP+ albi_h,qswi,dh,qsnwf,fcond,qdamp,qsmlt,qo2i,qbot,swfac,dtml,q,
c$OMP+ volice,df,dvi,dvs,fwflx,sstc,rice,trxflx,sssc,srxflx
c$OMP+ l,i,dpotl,hotl,totl,sotl,tice_f,hice_min,fice,hice,hsnw,tsrf,
c$OMP+ fice0,hice0,hsnw0,qsww,qnsw,tice,albi,tsmlt,albi_h,qswi,dh,qsnwf,
c$OMP+ fcond,qdamp,qsmlt,qo2i,qbot,swfac,dtml,q,volice,df,dvi,dvs,fwflx,
c$OMP+ sstc,rice,dpmxl,hmxl,tmxl,trxflx,pbot,dprsi,kn,kl,sssc,smxl,
c$OMP+ srxflx
#ifdef TRC
c$OMP+ ,nt
#endif
Expand All @@ -139,13 +142,6 @@ subroutine thermf_ben02(m,n,mm,nn,k1m,k1n)
hotl=dpotl/onem
totl=temp(i,j,k1n)+t0deg
sotl=saln(i,j,k1n)
c
dpmxl=dp(i,j,1+nn)+dp(i,j,2+nn)
hmxl=dpmxl/onem
tmxl=(temp(i,j,1+nn)*dp(i,j,1+nn)
. +temp(i,j,2+nn)*dp(i,j,2+nn))/dpmxl+t0deg
smxl=(saln(i,j,1+nn)*dp(i,j,1+nn)
. +saln(i,j,2+nn)*dp(i,j,2+nn))/dpmxl
c
fice=ficem(i,j)
hice=hicem(i,j)
Expand Down Expand Up @@ -441,7 +437,7 @@ subroutine thermf_ben02(m,n,mm,nn,k1m,k1n)
if (nt.eq.itrgls) then
trflx(nt,i,j)=-gls_n*difdia(i,j,1)*(gls_cmu0**gls_p)
. *(trc(i,j,k1n,itrtke)**gls_m)
. *(vonKar**gls_n)*zos**(gls_n-1.)
. *(vonKar**gls_n)*Zos**(gls_n-1.)
ttrsf(nt,i,j)=0.
ttrav(nt,i,j)=0.
cycle
Expand Down Expand Up @@ -476,8 +472,39 @@ subroutine thermf_ben02(m,n,mm,nn,k1m,k1n)
. ricclm(i,j,l3mi),ricclm(i,j,l4mi),
. ricclm(i,j,l5mi),xmi)
sstc=(1.-rice)*max(sstc,tice_f)+rice*tice_f
trxflx=spcifh*L_mks2cgs*min(hmxl,trxdpt)/(trxday*86400.)
. *min(trxlim,max(-trxlim,sstc-tmxl))/alpha0
if (vcoord_type_tag == isopyc_bulkml) then
dpmxl=dp(i,j,1+nn)+dp(i,j,2+nn)
hmxl=dpmxl/onem
tmxl=(temp(i,j,1+nn)*dp(i,j,1+nn)
. +temp(i,j,2+nn)*dp(i,j,2+nn))/dpmxl+t0deg
trxflx=spcifh*L_mks2cgs*min(hmxl,trxdpt)/(trxday*86400.)
. *min(trxlim,max(-trxlim,sstc-tmxl))/alpha0
else
pbot=p(i,j,1)
do k=1,kk
kn=k+nn
pbot=pbot+dp(i,j,kn)
enddo
dprsi=1./min(trxdpt*onem,pbot-p(i,j,1))
t_rs_nonloc(i,j,1)=1.
tmxl=0.
do k=1,kk
kn=k+nn
t_rs_nonloc(i,j,k+1)=t_rs_nonloc(i,j,k)-dp(i,j,kn)*dprsi
if (t_rs_nonloc(i,j,k+1).lt.0.) then
tmxl=tmxl+temp(i,j,kn)*t_rs_nonloc(i,j,k)+t0deg
exit
else
tmxl=tmxl+temp(i,j,kn)*(t_rs_nonloc(i,j,k )
. -t_rs_nonloc(i,j,k+1))
endif
enddo
do kl=k,kk
t_rs_nonloc(i,j,kl+1)=0.
enddo
trxflx=spcifh*L_mks2cgs*trxdpt/(trxday*86400.)
. *min(trxlim,max(-trxlim,sstc-tmxl))/alpha0
endif
surrlx(i,j)=-trxflx
else
trxflx=0.
Expand All @@ -493,7 +520,7 @@ subroutine thermf_ben02(m,n,mm,nn,k1m,k1n)
c --- --- If ditflx=.true., diagnose relaxation flux by accumulating the
c --- --- relaxation flux
if (ditflx) then
tflxdi(i,j,k)=tflxdi(i,j,k)+trxflx
tflxdi(i,j,ntld)=tflxdi(i,j,ntld)+trxflx
endif
c
salrlx(i,j)=0.
Expand All @@ -503,8 +530,39 @@ subroutine thermf_ben02(m,n,mm,nn,k1m,k1n)
sssc=intp1d(sssclm(i,j,l1mi),sssclm(i,j,l2mi),
. sssclm(i,j,l3mi),sssclm(i,j,l4mi),
. sssclm(i,j,l5mi),xmi)
srxflx=L_mks2cgs*min(hmxl,srxdpt)/(srxday*86400.)
. *min(srxlim,max(-srxlim,sssc-smxl))/alpha0
if (vcoord_type_tag == isopyc_bulkml) then
dpmxl=dp(i,j,1+nn)+dp(i,j,2+nn)
hmxl=dpmxl/onem
smxl=(saln(i,j,1+nn)*dp(i,j,1+nn)
. +saln(i,j,2+nn)*dp(i,j,2+nn))/dpmxl
srxflx=L_mks2cgs*min(hmxl,srxdpt)/(srxday*86400.)
. *min(srxlim,max(-srxlim,sssc-smxl))/alpha0
else
pbot=p(i,j,1)
do k=1,kk
kn=k+nn
pbot=pbot+dp(i,j,kn)
enddo
dprsi=1./min(srxdpt*onem,pbot-p(i,j,1))
s_rs_nonloc(i,j,1)=1.
smxl=0.
do k=1,kk
kn=k+nn
s_rs_nonloc(i,j,k+1)=s_rs_nonloc(i,j,k)-dp(i,j,kn)*dprsi
if (s_rs_nonloc(i,j,k+1).lt.0.) then
smxl=smxl+saln(i,j,kn)*s_rs_nonloc(i,j,k)
exit
else
smxl=smxl+saln(i,j,kn)*(s_rs_nonloc(i,j,k )
. -s_rs_nonloc(i,j,k+1))
endif
enddo
do kl=k,kk
s_rs_nonloc(i,j,kl+1)=0.
enddo
srxflx=L_mks2cgs*srxdpt/(srxday*86400.)
. *min(srxlim,max(-srxlim,sssc-smxl))/alpha0
endif
salrlx(i,j)=-srxflx
util3(i,j)=max(0.,salrlx(i,j))*scp2(i,j)
util4(i,j)=min(0.,salrlx(i,j))*scp2(i,j)
Expand All @@ -522,7 +580,7 @@ subroutine thermf_ben02(m,n,mm,nn,k1m,k1n)
c --- --- If disflx=.true., diagnose relaxation flux by accumulating the
c --- --- relaxation flux
if (disflx) then
sflxdi(i,j,k)=sflxdi(i,j,k)+srxflx
sflxdi(i,j,ntld)=sflxdi(i,j,ntld)+srxflx
endif
c
c --- ------------------------------------------------------------------
Expand Down Expand Up @@ -678,10 +736,15 @@ subroutine thermf_ben02(m,n,mm,nn,k1m,k1n)
call chksummsk(surflx,ip,1,'surflx')
call chksummsk(sswflx,ip,1,'sswflx')
call chksummsk(salflx,ip,1,'salflx')
call chksummsk(brnflx,ip,1,'brnflx')
call chksummsk(surrlx,ip,1,'surrlx')
call chksummsk(salrlx,ip,1,'salrlx')
call chksummsk(iagem,ip,1,'iagem')
call chksummsk(ustar,ip,1,'ustar')
if (vcoord_type_tag /= isopyc_bulkml) then
call chksummsk(t_rs_nonloc, ip, kk+1, 't_rs_nonloc')
call chksummsk(s_rs_nonloc, ip, kk+1, 's_rs_nonloc')
endif
endif
c
return
Expand Down
Loading