subroutine derive_xbvar_mpi(cgrid)
!***********************************************************************
! abstract: derive bckg error estimates for non-observed variables (eg.*
!           streamfunction and velocity potential)                     *
!                                                                      *
! program history log:                                                 *
!   2005-10-08  pondeca                                                *
!***********************************************************************

       use mpi

       use mpitaskmod, only: mype,npe
       use mpitaskmod, only: nx => nlon
       use mpitaskmod, only: ny => nlat
       use controlvars, only: igust,ivis,ipblh,idist, & 
                              iwspd10m,itd2m,imxtm,imitm, &
                              ipmsl,ihowv,itcamt,ilcbas, & 
                              iuwnd10m,ivwnd10m

       implicit none

!Declare passed variables
       character(60),intent(in):: cgrid

!Declare local variables
       real(4),allocatable,dimension(:,:)::aux
       real(4),allocatable,dimension(:,:)::var_u,var_v
       real(4),allocatable,dimension(:,:)::field1,field2

       real(4) dxx,dyy,qs0
       real(4) rinflu,rinflv,rinflt,rinflq,rinflp 
       real(4) rinflgust,rinflvis,rinflpblh,rinfldist, & 
               rinflwspd10m,rinfltd2m,rinflmxtm,rinflmitm, &
               rinflpmsl,rinflhowv,rinfltcamt,rinfllcbas, &
               rinfluwnd10m,rinflvwnd10m
       real(4) efold,growthfact
       logical fexist

       integer(4) i,j,ierror

       integer(4) itdiff
       namelist/bckgerr_infl/rinflu,rinflv,rinflt,rinflq,rinflp, & 
               rinflgust,rinflvis,rinflpblh,rinfldist, & 
               rinflwspd10m,rinfltd2m,rinflmxtm,rinflmitm, &
               rinflpmsl,rinflhowv,rinfltcamt,rinfllcbas, &
               rinfluwnd10m,rinflvwnd10m, &
               itdiff,efold

       data rinflu/0.29/
       data rinflv/0.29/
       data rinflt/1.25/
       data rinflq/1.25/
       data rinflp/2.0/
       data rinflgust/1.0/
       data rinflvis/1.0/
       data rinflpblh/1.0/
       data rinfldist/1.0/
       data rinflwspd10m/1.0/
       data rinfltd2m/1.0/
       data rinflmxtm/1.0/
       data rinflmitm/1.0/
       data rinflpmsl/1.0/
       data rinflhowv/1.0/
       data rinfltcamt/1.0/
       data rinfllcbas/1.0/
       data rinfluwnd10m/1.0/
       data rinflvwnd10m/1.0/
       data itdiff/1/  !hours
       data efold/1.5/  !day-1

       if (mype==0) print*,'in derive_xbvar: cgrid is =',trim(cgrid)
       if (mype==0) print*,'in derive_xbvar,nx,ny=',nx,ny

!=================================================================
! read in inflation factors for the sqrt of the variances
!=================================================================
       inquire(file='bckgerr_infl_input',exist=fexist)

       if (fexist) then
          open (55,file='bckgerr_infl_input',form='formatted')
          read(55,bckgerr_infl)
          close(55)
       endif

       if (mype==0) then
          print*,'in derive_xbvar /initial: rinflu,rinflv,rinflt,rinflq,rinflp=',&
                                  rinflu,rinflv,rinflt,rinflq,rinflp

          print*,'in derive_xbvar /initial: rinflgust,rinflvis,rinflpblh,rinfldist=', &
                                  rinflgust,rinflvis,rinflpblh,rinfldist

          print*,'in derive_xbvar /initial: rinflwspd10m,rinfltd2m,rinflmxtm,rinflmitm=', &
                                   rinflwspd10m,rinfltd2m,rinflmxtm,rinflmitm  

          print*,'in derive_xbvar /initial: rinflpmsl,rinflhowv,rinfltcamt,rinfllcbas=', &
                                   rinflpmsl,rinflhowv,rinfltcamt,rinfllcbas

          print*,'in derive_xbvar /initial: rinfluwnd10m,rinflvwnd10m=',rinfluwnd10m,rinflvwnd10m

          print*,'in derive_xbvar: itdiff,efold=',itdiff,efold
       endif

       if (itdiff .lt. 1) then 
          growthfact=1.0
         else
          growthfact=exp((float(itdiff)-1.0)/(efold*24.))
       endif
       if (mype==0) print*,'in derive_xbvar: growthfact=',growthfact

       rinflu=rinflu*growthfact
       rinflv=rinflv*growthfact
       rinflt=rinflt*growthfact
       rinflq=rinflq*growthfact
       rinflp=rinflp*growthfact
       rinflgust=rinflgust*growthfact
       rinflvis=rinflvis*growthfact
       rinflpblh=rinflpblh*growthfact
       rinfldist=rinfldist*growthfact
       rinflwspd10m=rinflwspd10m*growthfact
       rinfltd2m=rinfltd2m*growthfact
       rinflmxtm=rinflmxtm*growthfact
       rinflmitm=rinflmitm*growthfact
       rinflpmsl=rinflpmsl*growthfact
       rinflhowv=rinflhowv*growthfact
       rinfltcamt=rinfltcamt*growthfact
       rinfllcbas=rinfllcbas*growthfact
       rinfluwnd10m=rinfluwnd10m*growthfact
       rinflvwnd10m=rinflvwnd10m*growthfact



       if (mype==0) then
          print*,'in derive_xbvar /final: rinflu,rinflv,rinflt,rinflq,rinflp=',&
                                   rinflu,rinflv,rinflt,rinflq,rinflp

          print*,'in derive_xbvar /final: rinflgust,rinflvis,rinflpblh,rinfldist=', &
                                   rinflgust,rinflvis,rinflpblh,rinfldist

          print*,'in derive_xbvar /final: rinflwspd10m,rinfltd2m,rinflmxtm,rinflmitm=', &
                                   rinflwspd10m,rinfltd2m,rinflmxtm,rinflmitm  

          print*,'in derive_xbvar /final: rinflpmsl,rinflhowv,rinfltcamt,rinfllcbas=', &
                                   rinflpmsl,rinflhowv,rinfltcamt,rinfllcbas

          print*,'in derive_xbvar /final: rinfluwnd10m,rinflvwnd10m=',rinfluwnd10m,rinflvwnd10m
       endif
!
!=================================================================
! allocate fields
!=================================================================
!
       allocate(aux(ny,nx))   !transposed field
       allocate(var_u(nx,ny))
       allocate(var_v(nx,ny))
       allocate(field1(nx,ny))
       allocate(field2(nx,ny))
!
!=================================================================
! get estimate of square-root of variance for u, and v:
!=================================================================
!
       open (94,file='bckgvar.dat_psi',form='unformatted')
       read(94) aux
       close(94)
       field1=transpose(aux)

       open (94,file='bckgvar.dat_chi',form='unformatted')
       read(94) aux
       close(94)
       field2=transpose(aux)

       dxx=1.e5 !Consistent with the use of global statistics
       dyy=1.e5 !Consistent with the use of global statistics

       do j=1,ny
       do i=1,nx
         var_u(i,j)=(field1(i,j)/dyy+field2(i,j)/dxx)*rinflu  
         var_v(i,j)=(field1(i,j)/dxx+field2(i,j)/dyy)*rinflv  
       enddo       
       enddo       

       if (mype==0) then
          print*,'in derive_xbvar, for u, sqrt(var)min,max=', & 
                                   minval(var_u),maxval(var_u)

          print*,'in derive_xbvar, for v, sqrt(var)min,max=', & 
                                   minval(var_v),maxval(var_v)

          open (10,file='bckgvar.dat_u',form='unformatted')
          write(10) var_u
          close(10)

          open (10,file='bckgvar.dat_v',form='unformatted')
          write(10) var_v
          close(10)
       endif
!
!=================================================================
! get estimate of square-root of variance for ps:
!=================================================================
!
       open (94,file='bckgvar.dat_ps0',form='unformatted')
       read(94) aux
       close(94)
       field1=transpose(aux)

       do j=1,ny
       do i=1,nx
         field2(i,j)=1000.*field1(i,j)*rinflp
       enddo
       enddo

       if (mype==0) then 
          print*,'in derive_xbvar, for ps, sqrt(var)min,max=', & 
                                   minval(field2),maxval(field2)

          open (10,file='bckgvar.dat_ps',form='unformatted')
          write(10) field2
          close(10)
       endif
!
!=================================================================
! get estimate of square-root of variance for q:
!=================================================================
!
       open (94,file='bckgvar.dat_pseudorh',form='unformatted')
       read(94) aux
       close(94)
       field1=transpose(aux)

       open (94,file='bckg_qsat.dat',form='unformatted')
       read(94) field2    !qs(nx,ny). no need to transpose
       close(94)
       qs0=sum(field2(:,:))/float(nx*ny)
       !!!qs0=maxval(field2)! Avoid too small an error value

       do j=1,ny
       do i=1,nx
         field2(i,j)=field1(i,j)*qs0*rinflq
       enddo
       enddo

       if (mype==0) then
          print*,'in derive_xbvar,qs0=',qs0
          print*,'in derive_xbvar, for q, sqrt(var)min,max=', & 
                                   minval(field2),maxval(field2)

          open (10,file='bckgvar.dat_q',form='unformatted')
          write(10)field2
          close(10)
       endif
!
!=================================================================
! get estimate of square-root of variance for t:
!=================================================================
!
       open (94,file='bckgvar.dat_t0',form='unformatted')
       read(94) aux
       close(94)
       field2=transpose(aux)*rinflt

       if (mype==0) then
          print*,'in derive_xbvar, for t, sqrt(var)min,max=', & 
                                   minval(field2),maxval(field2)
      
          open (10,file='bckgvar.dat_t',form='unformatted')
          write(10) field2
          close(10)
       endif
!
!=================================================================
! get estimate of square-root of variance for gust:
!=================================================================
!
       if (igust > 0) then
          open (94,file='bckgvar.dat_gust0',form='unformatted')
          read(94) aux
          close(94)
          field2=transpose(aux)*rinflgust

          if (mype==0) then
             print*,'in derive_xbvar, for gust, sqrt(var)min,max=', & 
                                      minval(field2),maxval(field2)

             open (10,file='bckgvar.dat_gust',form='unformatted')
             write(10) field2
             close(10)
          endif
       endif
!
!=================================================================
! get estimate of square-root of variance for vis:
!=================================================================
!
       if (ivis > 0) then
          open (94,file='bckgvar.dat_vis0',form='unformatted')
          read(94) aux
          close(94)
          field2=transpose(aux)*rinflvis

          if (mype==0) then
             print*,'in derive_xbvar, for vis, sqrt(var)min,max=', &
                                      minval(field2),maxval(field2)

             open (10,file='bckgvar.dat_vis',form='unformatted')
             write(10) field2
             close(10)
          endif
       endif
!
!=================================================================
! get estimate of square-root of variance for pblh:
!=================================================================
!
       if (ipblh > 0) then
          open (94,file='bckgvar.dat_pblh0',form='unformatted')
          read(94) aux
          close(94)
          field2=transpose(aux)*rinflpblh

          if (mype==0) then
             print*,'in derive_xbvar, for pbhl, sqrt(var)min,max=', &
                                      minval(field2),maxval(field2)

             open (10,file='bckgvar.dat_pblh',form='unformatted')
             write(10) field2
             close(10)
          endif
       endif
!
!=================================================================
! get estimate of square-root of variance for dist:
!=================================================================
!
       if (idist > 0) then
          open (94,file='bckgvar.dat_dist0',form='unformatted')
          read(94) aux
          close(94)
          field2=transpose(aux)*rinfldist

          if (mype==0) then
             print*,'in derive_xbvar, for dist, sqrt(var)min,max=', &
                                      minval(field2),maxval(field2)

             open (10,file='bckgvar.dat_dist',form='unformatted')
             write(10) field2
             close(10)
          endif
       endif
!=================================================================
! get estimate of square-root of variance for wspd10m:
!=================================================================
!
       if (iwspd10m > 0) then
          open (94,file='bckgvar.dat_wspd10m0',form='unformatted')
          read(94) aux
          close(94)
          field2=transpose(aux)*rinflwspd10m

          if (mype==0) then
             print*,'in derive_xbvar, for wspd10m, sqrt(var)min,max=', &
                                      minval(field2),maxval(field2)

             open (10,file='bckgvar.dat_wspd10m',form='unformatted')
             write(10) field2
             close(10)
          endif
       endif
!=================================================================
! get estimate of square-root of variance for td2m:
!=================================================================
!
       if (itd2m > 0) then
          open (94,file='bckgvar.dat_td2m0',form='unformatted')
          read(94) aux
          close(94)
          field2=transpose(aux)*rinfltd2m

          if (mype==0) then
             print*,'in derive_xbvar, for td2m, sqrt(var)min,max=', &
                                      minval(field2),maxval(field2)

             open (10,file='bckgvar.dat_td2m',form='unformatted')
             write(10) field2
             close(10)
          endif
       endif
!=================================================================
! get estimate of square-root of variance for mxtm:
!=================================================================
!
       if (imxtm > 0) then
          open (94,file='bckgvar.dat_mxtm0',form='unformatted')
          read(94) aux
          close(94)
          field2=transpose(aux)*rinflmxtm

          if (mype==0) then
             print*,'in derive_xbvar, for mxtm, sqrt(var)min,max=', &
                                      minval(field2),maxval(field2)

             open (10,file='bckgvar.dat_mxtm',form='unformatted')
             write(10) field2
             close(10)
          endif
       endif
!=================================================================
! get estimate of square-root of variance for mitm:
!=================================================================
!
       if (imitm > 0) then
          open (94,file='bckgvar.dat_mitm0',form='unformatted')
          read(94) aux
          close(94)
          field2=transpose(aux)*rinflmitm

          if (mype==0) then
             print*,'in derive_xbvar, for mitm, sqrt(var)min,max=', &
                                      minval(field2),maxval(field2)

             open (10,file='bckgvar.dat_mitm',form='unformatted')
             write(10) field2
             close(10)
          endif
       endif
!=================================================================
! get estimate of square-root of variance for pmsl:
!=================================================================
!
       if (ipmsl > 0) then
          open (94,file='bckgvar.dat_pmsl0',form='unformatted')
          read(94) aux
          close(94)
          field2=transpose(aux)*rinflpmsl

          if (mype==0) then
             print*,'in derive_xbvar, for pmsl, sqrt(var)min,max=', &
                                      minval(field2),maxval(field2)

             open (10,file='bckgvar.dat_pmsl',form='unformatted')
             write(10) field2
             close(10)
          endif
       endif
!=================================================================
! get estimate of square-root of variance for howv:
!=================================================================
!
       if (ihowv > 0) then
          open (94,file='bckgvar.dat_howv0',form='unformatted')
          read(94) aux
          close(94)
          field2=transpose(aux)*rinflhowv

          if (mype==0) then
             print*,'in derive_xbvar, for howv, sqrt(var)min,max=', &
                                      minval(field2),maxval(field2)

             open (10,file='bckgvar.dat_howv',form='unformatted')
             write(10) field2
             close(10)
          endif
       endif
!=================================================================
! get estimate of square-root of variance for tcamt:
!=================================================================
!
       if (itcamt > 0) then
          open (94,file='bckgvar.dat_tcamt0',form='unformatted')
          read(94) aux
          close(94)
          field2=transpose(aux)*rinfltcamt

          if (mype==0) then
             print*,'in derive_xbvar, for tcamt, sqrt(var)min,max=', &
                                      minval(field2),maxval(field2)

             open (10,file='bckgvar.dat_tcamt',form='unformatted')
             write(10) field2
             close(10)
          endif
       endif
!=================================================================
! get estimate of square-root of variance for lcbas:
!=================================================================
!
       if (ilcbas > 0) then
          open (94,file='bckgvar.dat_lcbas0',form='unformatted')
          read(94) aux
          close(94)
          field2=transpose(aux)*rinfllcbas

          if (mype==0) then
             print*,'in derive_xbvar, for lcbas, sqrt(var)min,max=', &
                                      minval(field2),maxval(field2)

             open (10,file='bckgvar.dat_lcbas',form='unformatted')
             write(10) field2
             close(10)
          endif
       endif
!=================================================================
! get estimate of square-root of variance for uwnd10m:
!=================================================================
!
       if (iuwnd10m > 0) then
          open (94,file='bckgvar.dat_uwnd10m0',form='unformatted')
          read(94) aux
          close(94)
          field2=transpose(aux)*rinfluwnd10m

          if (mype==0) then
             print*,'in derive_xbvar, for uwnd10m, sqrt(var)min,max=', &
                                      minval(field2),maxval(field2)

             open (10,file='bckgvar.dat_uwnd10m',form='unformatted')
             write(10) field2
             close(10)
          endif
       endif
!=================================================================
! get estimate of square-root of variance for vwnd10m:
!=================================================================
!
       if (ivwnd10m > 0) then
          open (94,file='bckgvar.dat_vwnd10m0',form='unformatted')
          read(94) aux
          close(94)
          field2=transpose(aux)*rinflvwnd10m

          if (mype==0) then
             print*,'in derive_xbvar, for vwnd10m, sqrt(var)min,max=', &
                                      minval(field2),maxval(field2)

             open (10,file='bckgvar.dat_vwnd10m',form='unformatted')
             write(10) field2
             close(10)
          endif
       endif
!=================================================================
!
       call mpi_barrier(mpi_comm_world,ierror)

       deallocate(aux)
       deallocate(var_u)
       deallocate(var_v)
       deallocate(field1)
       deallocate(field2)

       return
       end
!*********************************************************************
!*********************************************************************