7 psea,puref,prhoa,pu,pv,ppew_a_coef,ppew_b_coef,psfu,psfv)
48 USE yomhook
,ONLY : lhook, dr_hook
49 USE parkind1
,ONLY : jprb
58 REAL,
DIMENSION(:),
INTENT(IN) :: psea
59 REAL,
DIMENSION(:),
INTENT(IN) :: puref
60 REAL,
DIMENSION(:),
INTENT(IN) :: prhoa
61 REAL,
DIMENSION(:),
INTENT(IN) :: pu
62 REAL,
DIMENSION(:),
INTENT(IN) :: pv
63 REAL,
DIMENSION(:),
INTENT(IN) :: ppew_a_coef
64 REAL,
DIMENSION(:),
INTENT(IN) :: ppew_b_coef
65 REAL,
DIMENSION(:),
INTENT(INOUT) :: psfu
66 REAL,
DIMENSION(:),
INTENT(INOUT) :: psfv
70 REAL,
DIMENSION(SIZE(PU)) :: zwind
71 REAL,
DIMENSION(SIZE(PU)) :: zwork
72 REAL,
DIMENSION(SIZE(PU)) :: zdir
73 REAL,
DIMENSION(SIZE(PU)) :: zalfa
74 REAL,
DIMENSION(SIZE(PU)) :: zcos2, zsin2
75 REAL,
DIMENSION(SIZE(PU)) :: zz0eff
76 REAL,
DIMENSION(SIZE(PU)) :: zcd
77 REAL,
DIMENSION(SIZE(PU)) :: zustar2
78 REAL,
DIMENSION(SIZE(PU)) :: zsso_sfu
79 REAL,
DIMENSION(SIZE(PU)) :: zsso_sfv
80 LOGICAL,
DIMENSION(SIZE(PU)) :: gmask
82 REAL(KIND=JPRB) :: zhook_handle
86 IF (lhook) CALL dr_hook(
'SSO_Z0_FRICTION_N',0,zhook_handle)
95 zwind(:) = sqrt(pu(:)**2+pv(:)**2)
100 WHERE (zwind(:)>0.) zdir(:)=atan2(pu(:),pv(:))
104 gmask(:)=(psea(:)/=1..AND. uss%XZ0REL(:)/=0.)
110 IF (uss%CROUGH==
"Z01D") zz0eff(:) = uss%XZ0REL(:)
115 IF (uss%CROUGH==
"Z04D")
THEN
119 zalfa(ii) = zdir(ii) - uss%XZ0EFFJPDIR(ii) * xpi/180.
121 IF (zalfa(ii)<=-xpi)
THEN
122 zalfa(ii) = zalfa(ii) + 2.*xpi
123 ELSEIF(zalfa(ii)> xpi)
THEN
124 zalfa(ii) = zalfa(ii) - 2.*xpi
127 IF (zalfa(ii)>=-xpi.AND.zalfa(ii)<=xpi)
THEN
129 zsin2(ii) = sin(zalfa(ii))**2
130 zcos2(ii) = cos(zalfa(ii))**2
132 IF (zalfa(ii)<0.)
THEN
133 zz0eff(ii)=uss%XZ0EFFIM(ii)*zsin2(ii)
135 zz0eff(ii)=uss%XZ0EFFIP(ii)*zsin2(ii)
138 IF (zalfa(ii)>=-xpi/2. .AND. zalfa(ii)<xpi/2.)
THEN
139 zz0eff(ii) = zz0eff(ii) + uss%XZ0EFFJP(ii)*zcos2(ii)
141 zz0eff(ii) = zz0eff(ii) + uss%XZ0EFFJM(ii)*zcos2(ii)
156 gmask(:)=(gmask(:).AND.zz0eff(:)>xsurf_epsilon)
163 zz0eff(ii) = min(zz0eff(ii),puref(ii)/uss%XFRACZ0)
166 zcd(ii) = (xkarman/log(puref(ii)/zz0eff(ii)))**2
176 IF(cimplicit_wind==
'OLD')
THEN
178 zustar2(:) = zcd(:)*zwind(:)*ppew_b_coef(:) &
179 / (1.0-prhoa(:)*zcd(:)*zwind(:)*ppew_a_coef(:))
182 zustar2(:) = (zcd(:)*zwind(:)*(2.*ppew_b_coef(:)-zwind(:)) ) &
183 / (1.0-2.0*prhoa(:)*zcd(:)*zwind(:)*ppew_a_coef(:))
188 zwork(:) = prhoa(:)*ppew_a_coef(:)*zustar2(:) + ppew_b_coef(:)
189 zwork(:) = max(zwork(:),0.)
191 WHERE(ppew_a_coef(:)/= 0.)
192 zustar2(:) = max( ( zwork(:) - ppew_b_coef(:) ) / (prhoa(:)*ppew_a_coef(:)), 0.)
203 zsso_sfu(:) = - pu(:)/zwind(:) * zustar2(:) * prhoa(:)
204 zsso_sfv(:) = - pv(:)/zwind(:) * zustar2(:) * prhoa(:)
210 psfu(:) = psfu(:) + zsso_sfu(:) * (1.0-psea(:))
211 psfv(:) = psfv(:) + zsso_sfv(:) * (1.0-psea(:))
213 IF (lhook) CALL dr_hook(
'SSO_Z0_FRICTION_N',1,zhook_handle)
subroutine sso_z0_friction_n(USS, PSEA, PUREF, PRHOA, PU, PV, PPEW_A_COEF, PPEW_B_COEF, PSFU, PSFV)