6 SUBROUTINE sso (UG, USS, &
37 USE modi_get_adjacent_meshes
44 USE yomhook
,ONLY : lhook, dr_hook
45 USE parkind1
,ONLY : jprb
56 LOGICAL,
DIMENSION(:),
INTENT(OUT) :: osso
61 LOGICAL,
DIMENSION(:),
INTENT(OUT) :: osso_anis
66 REAL,
DIMENSION(:),
INTENT(IN) :: psea
85 INTEGER,
DIMENSION(NL) :: ileft
86 INTEGER,
DIMENSION(NL) :: iright
87 INTEGER,
DIMENSION(NL) :: itop
88 INTEGER,
DIMENSION(NL) :: ibottom
93 REAL,
DIMENSION(NSSO,NSSO) :: zdzsdx
94 REAL,
DIMENSION(NSSO,NSSO) :: zdzsdy
95 LOGICAL,
DIMENSION(NSSO,NSSO) :: gdzsdx
96 LOGICAL,
DIMENSION(NSSO,NSSO) :: gdzsdy
105 REAL,
DIMENSION(NL) :: zdx
106 REAL,
DIMENSION(NL) :: zdy
107 REAL,
DIMENSION(NL) :: zhxx
108 REAL,
DIMENSION(NL) :: zhxy
109 REAL,
DIMENSION(NL) :: zhyy
110 REAL,
DIMENSION(NL) :: zk, zl, zm
111 REAL(KIND=JPRB) :: zhook_handle
118 IF (lhook) CALL dr_hook(
'SSO',0,zhook_handle)
133 CALL
get_mesh_dim(cgrid,ngrid_par,nl,xgrid_par,zdx,zdy,ug%XMESH_SIZE)
156 IF (psea(jl)==1.) cycle
158 zdxeff=zdx(jl)/float(nsso)
159 zdyeff=zdy(jl)/float(nsso)
166 IF ( count( lssqo(:,:,jl)) == 0 ) cycle
196 IF (.NOT. lssqo(jiss,jjss,jl) ) cycle
201 IF (jiss+jnext>nsso)
THEN
203 inext = jiss+jnext-nsso
211 IF (lssqo(inext,jjss,il))
EXIT
217 IF (jnext>=nsso+1)
EXIT
227 imaxi = min(jiss+jnext-1,nsso)
229 zdzsdx(jiss:imaxi,jjss) = ( xssqo(inext,jjss,il) - xssqo(jiss,jjss,jl)) &
230 / float(jnext) / zdxeff
232 gdzsdx(jiss:imaxi,jjss) = .true.
238 IF (gbound .AND. jiss/=1)
THEN
240 IF (jiss-jprev<1)
THEN
242 iprev = jiss-jprev+nsso
250 IF (lssqo(iprev,jjss,il))
EXIT
253 IF (.NOT. (jprev>=nsso+1 .OR. il==0))
THEN
254 zdzsdx(1:jiss,jjss) = ( xssqo(jiss,jjss,jl) - xssqo(iprev,jjss,il)) &
255 / float(jprev) / zdxeff
257 gdzsdx(1:jiss,jjss) = .true.
303 IF (.NOT. lssqo(jiss,jjss,jl) ) cycle
308 IF (jjss+jnext>nsso)
THEN
310 inext = jjss+jnext-nsso
318 IF (lssqo(jiss,inext,il))
EXIT
324 IF (jnext>=nsso+1)
EXIT
334 imaxj = min(jjss+jnext-1,nsso)
336 zdzsdy(jiss,jjss:imaxj) = ( xssqo(jiss,inext,il) - xssqo(jiss,jjss,jl)) &
337 / float(jnext) / zdyeff
339 gdzsdy(jiss,jjss:imaxj) = .true.
345 IF (gbound .AND. jjss/=1)
THEN
347 IF (jjss-jprev<1)
THEN
349 iprev = jjss-jprev+nsso
357 IF (lssqo(jiss,iprev,il))
EXIT
360 IF (.NOT. (jprev>=nsso+1 .OR. il==0))
THEN
361 zdzsdy(jiss,1:jjss) = ( xssqo(jiss,jjss,jl) - xssqo(jiss,iprev,il)) &
362 / float(jprev) / zdyeff
364 gdzsdy(jiss,1:jjss) = .true.
393 IF ( count(gdzsdx(:,:).AND.gdzsdy(:,:)) ==0 ) cycle
400 osso_anis(jl)=count(gdzsdx(:,:).AND.gdzsdy(:,:))>1
406 zhxx(jl) = sum(zdzsdx(:,:)*zdzsdx(:,:),mask=gdzsdx(:,:).AND.gdzsdy(:,:))&
407 /count(gdzsdx(:,:).AND.gdzsdy(:,:))
412 zhyy(jl) = sum(zdzsdy(:,:)*zdzsdy(:,:),mask=gdzsdx(:,:).AND.gdzsdy(:,:))&
413 /count(gdzsdx(:,:).AND.gdzsdy(:,:))
418 zhxy(jl) = sum(zdzsdx(:,:)*zdzsdy(:,:),mask=gdzsdx(:,:).AND.gdzsdy(:,:))&
419 /count(gdzsdx(:,:).AND.gdzsdy(:,:))
434 zk(:)=0.5*(zhxx(:)+zhyy(:))
435 zl(:)=0.5*(zhxx(:)-zhyy(:))
447 WHERE (osso(:) .AND. zl(:)>1.e-30 )
448 uss%XSSO_DIR(:) = 0.5* atan(zm/zl) * (180./xpi)
451 WHERE (osso(:) .AND. zl(:)<-1.e-30 )
452 uss%XSSO_DIR(:) = 0.5* atan(zm/zl) * (180./xpi) + 90.
455 WHERE (osso(:) .AND. abs(zl(:))<=1.e-30 )
456 uss%XSSO_DIR(:) = 45.
459 WHERE (osso(:) .AND. uss%XSSO_DIR(:)>90. )
460 uss%XSSO_DIR(:) = uss%XSSO_DIR(:) - 180.
467 uss%XSSO_SLOPE(:) = sqrt( zk+sqrt(zl*zl+zm*zm) )
473 WHERE (osso_anis(:) .AND. (zk+sqrt(zl*zl+zm*zm)) >0. )
474 uss%XSSO_ANIS(:)=sqrt( max(zk-sqrt(zl*zl+zm*zm),0.) / (zk+sqrt(zl*zl+zm*zm)))
477 WHERE (osso_anis(:) .AND. (zk+sqrt(zl*zl+zm*zm))==0. )
480 IF (lhook) CALL dr_hook(
'SSO',1,zhook_handle)
subroutine sso(UG, USS, OSSO, OSSO_ANIS, PSEA)
subroutine get_adjacent_meshes(HGRID, KGRID_PAR, KL, PGRID_PAR, KLEFT, KRIGHT, KTOP, KBOTTOM)
subroutine get_mesh_dim(HGRID, KGRID_PAR, KL, PGRID_PAR, PDX, PDY, PMESHSIZE)