depth of assimilated data

Discussion about tangent linear and adjoint models, variational data assimilation, and other related issues.

Moderators: arango, robertson

Post Reply
Message
Author
xavierC
Posts: 10
Joined: Thu Jul 16, 2009 5:17 pm
Location: Madeira University

depth of assimilated data

#1 Post by xavierC » Thu Jun 20, 2019 8:30 am

Hi all,
I am assimilating near surface current data with I4DVAR capability of ROMS. I noticed that the rejection of my data is strongly dependent from the depth i put them:
i.e
-pure surface (obs_depth=0) i get 100% data rejected
-obs_depth=-7 i get almost 100% of data accepted
-obs_depth=-1 i get around 30% of data rejected

My data are not particularly littoral with minimum depth of few 100 meters and 35 vertical levels.

I understood more or less the 0 case, but why such a difference between 7m and 1m ?

Thanks
Xavier

xavierC
Posts: 10
Joined: Thu Jul 16, 2009 5:17 pm
Location: Madeira University

Re: depth of assimilated data

#2 Post by xavierC » Thu Jun 20, 2019 9:58 am

I guess it is zeta related and that obs_depth is absolute and not relative to zeta.

User avatar
jivica
Posts: 122
Joined: Mon May 05, 2003 2:41 pm
Location: The University of Western Australia, Perth, Australia

Re: depth of assimilated data

#3 Post by jivica » Fri Jun 21, 2019 4:51 am

ROMS is not black box model, and it is very well documented. In that sense you should dig into the source and, for example, have a look at the Utility/extract_obs.F

There you will find relevant part of the code:

Code: Select all

          p2=REAL(i2-i1,r8)*(Xobs(iobs)-REAL(i1,r8))
          q2=REAL(j2-j1,r8)*(Yobs(iobs)-REAL(j1,r8))
          p1=1.0_r8-p2
          q1=1.0_r8-q2
          w11=p1*q1
          w21=p2*q1
          w22=p2*q2
          w12=p1*q2
          IF (Zobs(iobs).gt.0.0_r8) THEN
            k1=MAX(1,INT(Zobs(iobs)))          ! Positions in fractional
            k2=MIN(INT(Zobs(iobs))+1,N(ng))    ! levels
            r2=REAL(k2-k1,r8)*(Zobs(iobs)-REAL(k1,r8))
            r1=1.0_r8-r2
          ELSE
            Ztop=Adepth(i1,j1,N(ng))
            Zbot=Adepth(i1,j1,1    )
            IF (Zobs(iobs).ge.Ztop) THEN
              r1=0.0_r8                        ! If shallower, ignore.
              r2=0.0_r8
              ObsScale(iobs)=0.0_r8
            ELSE IF (Zbot.ge.Zobs(iobs)) THEN
              r1=0.0_r8                        ! If deeper, ignore.
              r2=0.0_r8
              ObsScale(iobs)=0.0_r8
            ELSE
              DO k=N(ng),2,-1                  ! Otherwise, interpolate
                Ztop=Adepth(i1,j1,k  )         ! to fractional level
                Zbot=Adepth(i1,j1,k-1)
                IF ((Ztop.gt.Zobs(iobs)).and.(Zobs(iobs).ge.Zbot)) THEN
                  k1=k-1
                  k2=k
                END IF
              END DO
              dz=Adepth(i1,j1,k2)-Adepth(i1,j1,k1)
              r2=(Zobs(iobs)-Adepth(i1,j1,k1))/dz
              r1=1.0_r8-r2
              Zobs(iobs)=REAL(k1,r8)+r2        ! overwrite
            END IF
          END IF


And for example, if you have really huge range of tides and don't want ROMS to reject obs then simply change the part of code or compute zlev (model level fraction) of your obs and feed that into assimilation...

Good luck
Ivica

Post Reply