59 integer,
intent(in) :: ng, tile, model
63 character (len=*),
parameter :: myfile = &
69 CALL wclock_on (ng, model, 14, __line__, myfile)
72 & lbi, ubi, lbj, ubj, &
73 & imins, imaxs, jmins, jmaxs, &
91# if defined LMD_SKPP || defined LMD_BKPP || \
92 defined bulk_fluxes || defined balance_operator
96 &
mixing(ng) % alfaobeta, &
102 CALL wclock_off (ng, model, 14, __line__, myfile)
112 & LBi, UBi, LBj, UBj, &
113 & IminS, ImaxS, JminS, JmaxS, &
128# if defined LMD_SKPP || defined LMD_BKPP || \
129 defined BULK_FLUXES || defined BALANCE_OPERATOR
154 integer,
intent(in) :: ng, tile, model
155 integer,
intent(in) :: LBi, UBi, LBj, UBj
156 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
157 integer,
intent(in) :: nrhs
161 real(r8),
intent(in) :: rmask(LBi:,LBj:)
164 real(r8),
intent(in) :: Hz(LBi:,LBj:,:)
166 real(r8),
intent(in) :: z_r(LBi:,LBj:,:)
167 real(r8),
intent(in) :: z_w(LBi:,LBj:,0:)
168 real(r8),
intent(in) :: t(LBi:,LBj:,:,:,:)
170 real(r8),
intent(out) :: rhoA(LBi:,LBj:)
171 real(r8),
intent(out) :: rhoS(LBi:,LBj:)
174 real(r8),
intent(out) :: bvf(LBi:,LBj:,0:)
176# if defined LMD_SKPP || defined LMD_BKPP || \
177 defined bulk_fluxes || defined balance_operator
178 real(r8),
intent(out) :: alpha(LBi:,LBj:)
179 real(r8),
intent(out) :: beta(LBi:,LBj:)
181 real(r8),
intent(out) :: alfaobeta(LBi:,LBj:,0:)
184 real(r8),
intent(out) :: pden(LBi:,LBj:,:)
185 real(r8),
intent(out) :: rho(LBi:,LBj:,:)
188 real(r8),
intent(in) :: rmask(LBi:UBi,LBj:UBj)
191 real(r8),
intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
193 real(r8),
intent(in) :: z_r(LBi:UBi,LBj:UBj,N(ng))
194 real(r8),
intent(in) :: z_w(LBi:UBi,LBj:UBj,0:N(ng))
195 real(r8),
intent(in) :: t(LBi:UBi,LBj:UBj,N(ng),3,NT(ng))
197 real(r8),
intent(out) :: rhoA(LBi:UBi,LBj:UBj)
198 real(r8),
intent(out) :: rhoS(LBi:UBi,LBj:UBj)
201 real(r8),
intent(out) :: bvf(LBi:UBi,LBj:UBj,0:N(ng))
203# if defined LMD_SKPP || defined LMD_BKPP || \
204 defined bulk_fluxes || defined balance_operator
205 real(r8),
intent(out) :: alpha(LBi:UBi,LBj:UBj)
206 real(r8),
intent(out) :: beta(LBi:UBi,LBj:UBj)
208 real(r8),
intent(out) :: alfaobeta(LBi:UBi,LBj:UBj,0:N(ng))
211 real(r8),
intent(out) :: pden(LBi:UBi,LBj:UBj,N(ng))
212 real(r8),
intent(out) :: rho(LBi:UBi,LBj:UBj,N(ng))
217 integer :: i, ised, itrc, j, k
219 real(r8) :: SedDen, Tp, Tpr10, Ts, Tt, sqrtTs
221 real(r8) :: bulk_dn, bulk_up, den_dn, den_up
223 real(r8) :: cff, cff1, cff2
225 real(r8),
dimension(0:9) :: C
226# ifdef EOS_TDERIVATIVE
227 real(r8),
dimension(0:9) :: dCdT(0:9)
229 real(r8),
dimension(IminS:ImaxS,N(ng)) :: DbulkDS
230 real(r8),
dimension(IminS:ImaxS,N(ng)) :: DbulkDT
231 real(r8),
dimension(IminS:ImaxS,N(ng)) :: Dden1DS
232 real(r8),
dimension(IminS:ImaxS,N(ng)) :: Dden1DT
233 real(r8),
dimension(IminS:ImaxS,N(ng)) :: Scof
234 real(r8),
dimension(IminS:ImaxS,N(ng)) :: Tcof
235 real(r8),
dimension(IminS:ImaxS,N(ng)) :: wrk
237 real(r8),
dimension(IminS:ImaxS,N(ng)) :: bulk
238 real(r8),
dimension(IminS:ImaxS,N(ng)) :: bulk0
239 real(r8),
dimension(IminS:ImaxS,N(ng)) :: bulk1
240 real(r8),
dimension(IminS:ImaxS,N(ng)) :: bulk2
241 real(r8),
dimension(IminS:ImaxS,N(ng)) :: den
242 real(r8),
dimension(IminS:ImaxS,N(ng)) :: den1
244# include "set_bounds.h"
259 tt=max(-2.0_r8,t(i,j,k,nrhs,
itemp))
261 ts=max(0.0_r8,t(i,j,k,nrhs,
isalt))
277# ifdef EOS_TDERIVATIVE
279 dcdt(0)=
q01+tt*(2.0_r8*
q02+tt*(3.0_r8*
q03+tt*(4.0_r8*
q04+ &
281 dcdt(1)=
u01+tt*(2.0_r8*
u02+tt*(3.0_r8*
u03+tt*4.0_r8*
u04))
285 den1(i,k)=c(0)+ts*(c(1)+sqrtts*c(2)+ts*
w00)
287# ifdef EOS_TDERIVATIVE
293 dden1ds(i,k)=c(1)+1.5_r8*c(2)*sqrtts+2.0_r8*
w00*ts
294 dden1dt(i,k)=dcdt(0)+ts*(dcdt(1)+sqrtts*dcdt(2))
308# ifdef EOS_TDERIVATIVE
310 dcdt(3)=
a01+tt*(2.0_r8*
a02+tt*(3.0_r8*
a03+tt*4.0_r8*
a04))
311 dcdt(4)=
b01+tt*(2.0_r8*
b02+tt*3.0_r8*
b03)
313 dcdt(6)=
e01+tt*(2.0_r8*
e02+tt*3.0_r8*
e03)
319 bulk0(i,k)=c(3)+ts*(c(4)+sqrtts*c(5))
320 bulk1(i,k)=c(6)+ts*(c(7)+sqrtts*
g00)
321 bulk2(i,k)=c(8)+ts*c(9)
322 bulk(i,k)=bulk0(i,k)-tp*(bulk1(i,k)-tp*bulk2(i,k))
324# if defined LMD_SKPP || defined LMD_BKPP || \
325 defined bulk_fluxes || defined balance_operator
331 dbulkds(i,k)=c(4)+sqrtts*1.5_r8*c(5)- &
332 & tp*(c(7)+sqrtts*1.5_r8*
g00-tp*c(9))
333 dbulkdt(i,k)=dcdt(3)+ts*(dcdt(4)+sqrtts*dcdt(5))- &
334 & tp*(dcdt(6)+ts*dcdt(7)- &
335 & tp*(dcdt(8)+ts*dcdt(9)))
342 cff=1.0_r8/(bulk(i,k)+tpr10)
343 den(i,k)=den1(i,k)*bulk(i,k)*cff
344# if defined SEDIMENT && defined SED_DENS
348 cff1=1.0_r8/
srho(ised,ng)
350 & t(i,j,k,nrhs,itrc)* &
351 & (
srho(ised,ng)-den(i,k))*cff1
353 den(i,k)=den(i,k)+sedden
355 den(i,k)=den(i,k)-1000.0_r8
357 den(i,k)=den(i,k)*rmask(i,j)
371 cff1=den(i,n(ng))*hz(i,j,n(ng))
372 rhos(i,j)=0.5_r8*cff1*hz(i,j,n(ng))
377 cff1=den(i,k)*hz(i,j,k)
378 rhos(i,j)=rhos(i,j)+hz(i,j,k)*(rhoa(i,j)+0.5_r8*cff1)
379 rhoa(i,j)=rhoa(i,j)+cff1
384 cff1=1.0_r8/(z_w(i,j,n(ng))-z_w(i,j,0))
385 rhoa(i,j)=cff2*cff1*rhoa(i,j)
386 rhos(i,j)=2.0_r8*cff1*cff1*cff2*rhos(i,j)
390# if defined BV_FREQUENCY
404 bulk_up=bulk0(i,k+1)- &
405 & z_w(i,j,k)*(bulk1(i,k+1)- &
406 & bulk2(i,k+1)*z_w(i,j,k))
407 bulk_dn=bulk0(i,k )- &
408 & z_w(i,j,k)*(bulk1(i,k )- &
409 & bulk2(i,k )*z_w(i,j,k))
410 cff1=1.0_r8/(bulk_up+0.1_r8*z_w(i,j,k))
411 cff2=1.0_r8/(bulk_dn+0.1_r8*z_w(i,j,k))
412 den_up=cff1*(den1(i,k+1)*bulk_up)
413 den_dn=cff2*(den1(i,k )*bulk_dn)
414 bvf(i,j,k)=-
g*(den_up-den_dn)/ &
415 & (0.5_r8*(den_up+den_dn)* &
416 & (z_r(i,j,k+1)-z_r(i,j,k)))
423 bvf(i,j,n(ng))=0.0_r8
427# if defined LMD_SKPP || defined LMD_BKPP || \
428 defined bulk_fluxes || defined balance_operator
441 tpr10=0.1_r8*z_r(i,j,k)
448 wrk(i,k)=(den(i,k)+1000.0_r8)*cff*cff
449 tcof(i,k)=-(dbulkdt(i,k)*cff1+ &
451 scof(i,k)= (dbulkds(i,k)*cff1+ &
454 alfaobeta(i,j,k)=tcof(i,k)/scof(i,k)
459 cff=1.0_r8/wrk(i,n(ng))
460 alpha(i,j)=cff*tcof(i,n(ng))
461 beta(i,j)=cff*scof(i,n(ng))
477 pden(i,j,k)=(den1(i,k)-1000.0_r8)
479 pden(i,j,k)=pden(i,j,k)*rmask(i,j)
491 & lbi, ubi, lbj, ubj, 1, n(ng), &
494 & lbi, ubi, lbj, ubj, 1, n(ng), &
497# if defined LMD_SKPP || defined LMD_BKPP || \
498 defined bulk_fluxes || defined balance_operator
501 & lbi, ubi, lbj, ubj, 0, n(ng), &
505 & lbi, ubi, lbj, ubj, &
508 & lbi, ubi, lbj, ubj, &
514 & lbi, ubi, lbj, ubj, &
517 & lbi, ubi, lbj, ubj, &
523 & lbi, ubi, lbj, ubj, 0, n(ng), &
531 & lbi, ubi, lbj, ubj, 1, n(ng), &
536# if defined LMD_SKPP || defined LMD_BKPP || \
537 defined bulk_fluxes || defined balance_operator
540 & lbi, ubi, lbj, ubj, 0, n(ng), &
546 & lbi, ubi, lbj, ubj, &
554 & lbi, ubi, lbj, ubj, &
562 & lbi, ubi, lbj, ubj, 0, n(ng), &
577 & LBi, UBi, LBj, UBj, &
578 & IminS, ImaxS, JminS, JmaxS, &
593# if defined LMD_SKPP || defined LMD_BKPP || \
594 defined BULK_FLUXES || defined BALANCE_OPERATOR
618 integer,
intent(in) :: ng, tile, model
619 integer,
intent(in) :: LBi, UBi, LBj, UBj
620 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
621 integer,
intent(in) :: nrhs
625 real(r8),
intent(in) :: rmask(LBi:,LBj:)
628 real(r8),
intent(in) :: Hz(LBi:,LBj:,:)
630 real(r8),
intent(in) :: z_r(LBi:,LBj:,:)
631 real(r8),
intent(in) :: z_w(LBi:,LBj:,0:)
632 real(r8),
intent(in) :: t(LBi:,LBj:,:,:,:)
635 real(r8),
intent(out) :: rhoA(LBi:,LBj:)
636 real(r8),
intent(out) :: rhoS(LBi:,LBj:)
639 real(r8),
intent(out) :: bvf(LBi:,LBj:,0:)
641# if defined LMD_SKPP || defined LMD_BKPP || \
642 defined bulk_fluxes || defined balance_operator
643 real(r8),
intent(out) :: alpha(LBi:,LBj:)
644 real(r8),
intent(out) :: beta(LBi:,LBj:)
646 real(r8),
intent(out) :: alfaobeta(LBi:,LBj:,0:)
649 real(r8),
intent(out) :: pden(LBi:,LBj:,:)
650 real(r8),
intent(out) :: rho(LBi:,LBj:,:)
653 real(r8),
intent(in) :: rmask(LBi:UBi,LBj:UBj)
656 real(r8),
intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
658 real(r8),
intent(in) :: z_r(LBi:UBi,LBj:UBj,N(ng))
659 real(r8),
intent(in) :: z_w(LBi:UBi,LBj:UBj,0:N(ng))
660 real(r8),
intent(in) :: t(LBi:UBi,LBj:UBj,N(ng),3,NT(ng))
662 real(r8),
intent(out) :: rhoA(LBi:UBi,LBj:UBj)
663 real(r8),
intent(out) :: rhoS(LBi:UBi,LBj:UBj)
666 real(r8),
intent(out) :: bvf(LBi:UBi,LBj:UBj,0:N(ng))
668# if defined LMD_SKPP || defined LMD_BKPP || \
669 defined bulk_fluxes || defined balance_operator
670 real(r8),
intent(out) :: alpha(LBi:UBi,LBj:UBj)
671 real(r8),
intent(out) :: beta(LBi:UBi,LBj:UBj)
673 real(r8),
intent(out) :: alfaobeta(LBi:UBi,LBj:UBj,0:N(ng))
676 real(r8),
intent(out) :: pden(LBi:UBi,LBj:UBj,N(ng))
677 real(r8),
intent(out) :: rho(LBi:UBi,LBj:UBj,N(ng))
682 integer :: i, ised, itrc, j, k
683 real(r8) :: SedDen, cff, cff1, cff2
685# include "set_bounds.h"
702 rho(i,j,k)=rho(i,j,k)+ &
705# if defined SEDIMENT && defined SED_DENS
709 cff1=1.0_r8/
srho(ised,ng)
711 & t(i,j,k,nrhs,itrc)* &
712 & (
srho(ised,ng)-rho(i,j,k))*cff1
714 rho(i,j,k)=rho(i,j,k)+sedden
716 rho(i,j,k)=rho(i,j,k)-1000.0_r8
718 rho(i,j,k)=rho(i,j,k)*rmask(i,j)
720 pden(i,j,k)=rho(i,j,k)
732 cff1=rho(i,j,n(ng))*hz(i,j,n(ng))
733 rhos(i,j)=0.5_r8*cff1*hz(i,j,n(ng))
738 cff1=rho(i,j,k)*hz(i,j,k)
739 rhos(i,j)=rhos(i,j)+hz(i,j,k)*(rhoa(i,j)+0.5_r8*cff1)
740 rhoa(i,j)=rhoa(i,j)+cff1
745 cff1=1.0_r8/(z_w(i,j,n(ng))-z_w(i,j,0))
746 rhoa(i,j)=cff2*cff1*rhoa(i,j)
747 rhos(i,j)=2.0_r8*cff1*cff1*cff2*rhos(i,j)
760 bvf(i,j,k)=-
gorho0*(rho(i,j,k+1)-rho(i,j,k))/ &
761 & (z_r(i,j,k+1)-z_r(i,j,k))
766# if defined LMD_SKPP || defined LMD_BKPP || \
767 defined bulk_fluxes || defined balance_operator
775 alpha(i,j)=abs(
tcoef(ng))
777 beta(i,j)=abs(
scoef(ng))
787 IF (
scoef(ng).eq.0.0_r8)
THEN
794 alfaobeta(i,j,k)=cff*
tcoef(ng)
807 & lbi, ubi, lbj, ubj, 1, n(ng), &
810 & lbi, ubi, lbj, ubj, 1, n(ng), &
813# if defined LMD_SKPP || defined LMD_BKPP || \
814 defined bulk_fluxes || defined balance_operator
817 & lbi, ubi, lbj, ubj, 0, n(ng), &
821 & lbi, ubi, lbj, ubj, &
824 & lbi, ubi, lbj, ubj, &
830 & lbi, ubi, lbj, ubj, &
833 & lbi, ubi, lbj, ubj, &
839 & lbi, ubi, lbj, ubj, 0, n(ng), &
847 & lbi, ubi, lbj, ubj, 1, n(ng), &
852# if defined LMD_SKPP || defined LMD_BKPP || \
853 defined bulk_fluxes || defined balance_operator
856 & lbi, ubi, lbj, ubj, 0, n(ng), &
862 & lbi, ubi, lbj, ubj, &
870 & lbi, ubi, lbj, ubj, &
878 & lbi, ubi, lbj, ubj, 0, n(ng), &
subroutine exchange_r2d_tile(ng, tile, lbi, ubi, lbj, ubj, a)
subroutine exchange_r3d_tile(ng, tile, lbi, ubi, lbj, ubj, lbk, ubk, a)
subroutine exchange_w3d_tile(ng, tile, lbi, ubi, lbj, ubj, lbk, ubk, a)
type(t_coupling), dimension(:), allocatable coupling
type(t_grid), dimension(:), allocatable grid
type(t_mixing), dimension(:), allocatable mixing
type(t_ocean), dimension(:), allocatable ocean
real(r8), dimension(:), allocatable t0
logical, dimension(:), allocatable ewperiodic
logical, dimension(:), allocatable nsperiodic
real(r8), dimension(:), allocatable s0
real(r8), dimension(:), allocatable tcoef
real(r8), dimension(:), allocatable r0
real(r8), dimension(:), allocatable scoef
real(r8), dimension(:,:), allocatable srho
integer, dimension(:), allocatable idsed
integer, dimension(:), allocatable nrhs
subroutine mp_exchange2d(ng, tile, model, nvar, lbi, ubi, lbj, ubj, nghost, ew_periodic, ns_periodic, a, b, c, d)
subroutine mp_exchange3d(ng, tile, model, nvar, lbi, ubi, lbj, ubj, lbk, ubk, nghost, ew_periodic, ns_periodic, a, b, c, d)
subroutine, public rho_eos(ng, tile, model)
subroutine rho_eos_tile(ng, tile, model, lbi, ubi, lbj, ubj, imins, imaxs, jmins, jmaxs, nrhs, rmask, hz, z_r, z_w, t, rhoa, rhos, alpha, beta, alfaobeta, pden, rho)
recursive subroutine wclock_off(ng, model, region, line, routine)
recursive subroutine wclock_on(ng, model, region, line, routine)