module presolver  
    use const
    use comm
    use var
implicit real*8 (a-h,o-z)
#   include "pnetcdf.inc"
    
    ! preprocessor for 1/2 deg res global model                   july, 2007
    !!cyclic longitudinal b.c.'s (i.e., global or periodic)
    ! ----------------------------------------------------------------------
    !      block data nishal
    ! ----------------------------------------------------------------------
    real*8 hh,d1
    common/contro/r0
    common/lpi/mvfreq
    common/boyanc/d1(i0,j0,k1)
    common/bathy/hh(i0,j0),rmets(i0,j0)
    common/bcs/tsurf(i2,j2,12),ssurf(i2,j2,12),snsp(i2,10,k2,12),sssp(i2,10,k2,12),tnsp(i2,10,k2,12),tssp(i2,10,k2,12)

! lsolver solver control
! lsolver:0 no solver setting
! lsolver:1 evp
! lsolver:2 bi-cgstab
! ie(nb0)=j1
! we initialize ie in do loop 250 of subroutine initfs
!     data ie/6,11,16,...,j1/

! ----------------------------
! explanation of parameters
! ----------------------------
! i0,j0: horizontal dimension parameters (includes ghost zones around
! entire model domain; climatological boundary values are stored in
! ghost zones)
! k0: vertical dimension parameter (number of layer interfaces, equal
! the number of layers or pressure levels plus 1, does not include ghost
! zone)
! nb0: number of evp ellipti! solver restart vectors, used to control
! solver roundoff error (decreases with increasing nb0)
! case=5-character case name
! dscrib=63-character case descriptor
! r0=earth radius
! daodt=number of time steps per day
! b=thermal expansion coefficient when linear equation of state is used
! g=gravity
! dm0,de0 are horizontal heat and momentum diffusivities (cm-cm/sec)
! rzmx=vertical cell reynolds number limit
! drag=drag coefficient (standard value is .002)
! fltw=time filter coefficient on time filtered leapfrog method
! ktrm=thermocline level (used only for animation graphics)
! lrstrt=flag to initialize from restart file; if lrstrt=0, initial vel
!         is zero (but not necessarily boundary values)
! mxit=last time step number of current run (last time step of previous
!      run is saved on restart file)
! lopen=flag for open lateral boundaries (derive geostrophi! inflows)
! lmovi=flag to save data for animation of the results
! lsolver=flag for this program to initialize ellipti! solver data for the
! lprecon=flag for precodition of bi-cgstab(lsolver=2)
!  given geometry and also to generate initial temperature and salinity
! ie=array for evp ellipti! solver (controls roundoff error); ie(nb0)=j1

contains
! ----------------------------------------------------------------------
subroutine solvergen
! ----------------------------------------------------------------------
! input data: etopo5, levitus (t and s)
! the model now reads input wind data directly
! output data:
! input data translated to model variable latitudinal resolution grid

    integer*2 intmp(i2,j2),ing(i0t,j0t),inbuf(i2t*j2t)
    integer*2 isw(j0*k1),ise(j0*k1),isn(i0*k1),iss(i0*k1),irw(j0*k1),ire(j0*k1),irn(i0*k1),irs(i0*k1)
    real*8 scr_tmp(i0,j0) 

    daodt=576
    r0=6.4e8
    b=2.05e-4
    g=980.6
    dm0=5.e6
    de0=25.e5
    dmz0=.01
    rzmx=50
    drag=.001
    fltw=.1
    rawf=.53

    ! this may be unstable
    !data ktrm,lrstrt,mxit,isav,mxsav/5,0,0,5400,5400/
   
    ktrm=5
    lrstrt=0
    mxit=0
    isav=5400
    mxsav=5400
    
    !data lopen,lmovi,mvfreq,lfsrf,lsolver,lprecon/0,1,5,1,2,1/
    lopen=0
    lmovi=1
    mvfreq=5
    lfsrf=1
    lsolver=2
    lprecon=1
    case="GLOBO"
    dscrib="global model (.5 deg longitudinal resolution)                  "
    
    if (myid .eq. 0) then
	open(79,file='namelist.txt',form='formatted')
	read(79,*)lrstrt
	read(79,*)daodt
	read(79,*)irun
	close(79)
	mxit=irun*daodt*360
    endif
    call mpi_bcast(lrstrt,1,mpi_integer,0,mpi_comm_world,ierr)
    call mpi_bcast(daodt,1,mpi_real8,0,mpi_comm_world,ierr)
    call mpi_bcast(mxit,1,mpi_integer,0,mpi_comm_world,ierr)

    ! output data
!    open(10,file='data/yzgrid'//grd,form='unformatted')
!    open(11,file='data/depth'//grd,form='unformatted')
!    open(70,file='data/annualevitus'//grd,form='unformatted')
    ! output data
!    open(7,file='data/vbk_ascii'//grd)
!    open(8,file='data/windmix'//grd,form='unformatted')
!    open(9,file='data/rundata'//grd,form='unformatted')
!    open(17,file='data/kbview'//grd)
!    open(60,file='data/zkb'//grd,form='unformatted')
!    open(62,file='data/boundaries'//grd,form='unformatted')
    ! check solver 
    if(lsolver.eq.1 .or. lsolver.eq.2) then
!	open(99,file='data/evp'//grd,form='unformatted')
!	rewind 99
    elseif(lsolver.eq.0) then
	if(myid.eq.0) print*,'no solver setting'
    else
	if(myid.eq.0) print*,'lsolver=',lsolver,' err'
	stop 0
    endif

!    rewind 10
!    rewind 11
!    rewind 70
!    rewind 7 
!    rewind 8 
!    rewind 9 
!    rewind 17 
!    rewind 60 
!    rewind 62

    call rdnc_yzgrid2(j,k,dxmnut) !dog
!    read(10) j,k
    if (j0.ne.j.and.k0.ne.k) then
    write(*,6)
6   format('stop due to resolution mismatch. set i0,k0 to values from metgen.f.')
    stop 0
    endif
!   continue   

!9   read(10) tlz,z,odz,odzw,dxmnut,xdeg,y,yv,yvdeg,ydeg,cs,csv,ocs,ocsv,dx,dxv,odx,odxv,dy,dyv,ody,odyv

    !k01=k0+k1
    !write(21,10) (.01*z(k),k=1,k01,2)
    !10   format('z-levels(m)'/(10f8.2))
!coriolis parameter array
      omega2=3.141592654/21600.
! degrees to radians
      pi_180=3.141592654/180.
      do 12 j=2,j1
! spherical curvature parameter
      tanphi(j-1)=tan(pi_180*ydeg(j))/r0
 12   f(j-1)=omega2*sin(pi_180*ydeg(j))

     ! write(21,14) i0,j0
 !14   format('longitude(x) grid dimension:',i4/'latitude(y) grid dimension:',i4/)

! rmets data
! rmets(i,1) corresponds to southern most internal grid point
!      stop
      call rdnc_depth(rmets)
!      read(11) rmets


      write(*,*) '==============',maxval(rmets),minval(rmets)
      write(*,*) 'rmets filtered'
      write(*,*) '=============='
      call mpi_type_vector(j0,1,i0,mpi_real8,m_vlon_2d,ierr) !dog
      call mpi_type_vector(1,i0,j0,mpi_real8,m_vlat_2d,ierr)
      call mpi_type_commit(m_vlon_2d,ierr)
      call mpi_type_commit(m_vlat_2d,ierr)

      call mpi_sendrecv(rmets(2,1),1,m_vlon_2d,m_w,1,rmets(i0,1),1,m_vlon_2d,m_e,1,mpi_comm_world,istat,ierr)
      call mpi_sendrecv(rmets(i1,1),1,m_vlon_2d,m_e,1,rmets(1,1),1,m_vlon_2d,m_w,1,mpi_comm_world,istat,ierr)
      call mpi_sendrecv(rmets(1,2),1,m_vlat_2d,m_s,1,rmets(1,j0),1,m_vlat_2d,m_n,1,mpi_comm_world,istat,ierr)
      call mpi_sendrecv(rmets(1,j1),1,m_vlat_2d,m_n,1,rmets(1,1),1,m_vlat_2d,m_s,1,mpi_comm_world,istat,ierr)


!cts change from mxpas=2 to 4
      mxpas=4
      do n=1,mxpas
      do 15 j=2,j1
      do 15 i=2,i1

! don't filter izu ridge and se honshu coastal region
      if(xdeg(i).gt.134.5.and.xdeg(i).lt.147..and.ydeg(j).gt.-62.5.and.ydeg(j).lt.-51.5) goto 15
! don't filter gs window region      
      if(xdeg(i).gt.284.5.and.xdeg(i).lt.320..and.ydeg(j).gt.-54.5.and.ydeg(j).lt.-29.) goto 15

! don't filter regions near land (they are adequately known)
! filter only points farther than nwet grid intervals from land

      if (rmets(i,j).lt. 300.) goto 15
      scr_tmp(i,j)=.25*(rmets(i,j-1)+rmets(i,j+1)+rmets(i-1,j)+rmets(i+1,j))
 15   continue

      do 16 j=2,j1
      do 16 i=2,i1

! don't filter izu ridge and se honshu coastal region
      if(xdeg(i).gt.134.5.and.xdeg(i).lt.147..and.ydeg(j).gt.-62.5.and.ydeg(j).lt.-51.5) goto 16
! don't filter gs window region
      if(xdeg(i).gt.284.5.and.xdeg(i).lt.320..and.ydeg(j).gt.-54.5.and.ydeg(j).lt.-29.) goto 16

      if (rmets(i,j).lt. 300.) goto 16
      rmets(i,j)=scr_tmp(i,j)
 16   continue
     
      call mpi_sendrecv(rmets(2,1),1,m_vlon_2d,m_w,1,rmets(i0,1),1,m_vlon_2d,m_e,1,mpi_comm_world,istat,ierr)
      call mpi_sendrecv(rmets(i1,1),1,m_vlon_2d,m_e,1,rmets(1,1),1,m_vlon_2d,m_w,1,mpi_comm_world,istat,ierr)
      call mpi_sendrecv(rmets(1,2),1,m_vlat_2d,m_s,1,rmets(1,j0),1,m_vlat_2d,m_n,1,mpi_comm_world,istat,ierr)
      call mpi_sendrecv(rmets(1,j1),1,m_vlat_2d,m_n,1,rmets(1,1),1,m_vlat_2d,m_s,1,mpi_comm_world,istat,ierr)
      enddo


!cts20150921
      if(.false.)then
! 555 510  64  53
! make izu ridge into a narrow ridge at sill level
!cw      do 18 j=547,527,-1
!cw      jloc=j-mylat*j2
      do 18 j=2,j1
      do 18 i=3,i2
! rmets is in meters
! 15   write(*,16) j,(int(.1*rmets(i,j)),i=555,565)
! 16   format(i3,1x,11i4)
! find shallowest sill level in longitudinal range i=555-565
      kmn=10000
!cw      do 17 i=556,564
!cw      iloc=i-mylon*i2
      
!      if(iloc.le.2.or.iloc.ge.i1.or.jloc.le.2.and.jloc.ge.j1)
!cw      if(iloc.lt.2.or.iloc.gt.i1.or.jloc.lt.2.or.jloc.gt.j1)
!cw     1  goto 18
       if(xdeg(i).gt.138..and.xdeg(i).lt.142..and.ydeg(j).gt.30..and.ydeg(j).lt.35.) then
!      k=kmn
!      kmn=min(kmn,int(.1*rmets(i,j)))
! 17   if (kmn.ne.k) imn=i
! make narrow ridge
!      tmp=max(rmets(imn-1,j),rmets(imn-2,j))
!      rmets(imn-2,j)=tmp
!      rmets(imn-1,j)=tmp
!      tmp=max(rmets(imn+1,j),rmets(imn+2,j))
!      rmets(imn+2,j)=tmp
!      rmets(imn+1,j)=tmp
!     write(*,*) imn,kmn

      k=kmn
!cw      kmn=min(kmn,int(.1*rmets(iloc,jloc)))
      kmn=min(kmn,int(.1*rmets(i,j)))
!cw 17   if (kmn.ne.k) imn=iloc
 17   if (kmn.ne.k) imn=i
! make narrow ridge
      tmp=max(rmets(imn-1,j),rmets(imn-2,j))
      rmets(imn-2,j)=tmp
      rmets(imn-1,j)=tmp
      tmp=max(rmets(imn+1,j),rmets(imn+2,j))
      rmets(imn+2,j)=tmp
      rmets(imn+1,j)=tmp
!cw      tmp=max(rmets(imn-1,jloc),rmets(imn-2,jloc))
!cw      rmets(imn-2,jloc)=tmp
!cw      rmets(imn-1,jloc)=tmp
!cw      tmp=max(rmets(imn+1,jloc),rmets(imn+2,jloc))
!cw      rmets(imn+2,jloc)=tmp
!cw      rmets(imn+1,jloc)=tmp
!     write(*,*) imn,kmn
      endif
 18   continue


      do i=2,i1
      do j=2,j1
! smoother coastline near cozumel
       if(xdeg(i).gt.273.2.and.xdeg(i).lt.273.5.and.ydeg(j).gt.21.1.and.ydeg(j).lt.21.5) then
       rmets(i,j)=0.
       endif

! eliminate shallow water northwest of easternmost florida point
! rmets(1118:1120,516:530)=0.
       if(xdeg(i).gt.279.1.and.xdeg(i).lt.279.9.and.ydeg(j).gt.28.1.and.ydeg(j).lt.31.6) then
       rmets(i,j)=0.
       endif
! rmets(1121,516:530)=28.
       if(xdeg(i).gt.280.0.and.xdeg(i).lt.280.3.and.ydeg(j).gt.28.1.and.ydeg(j).lt.31.6) then
       rmets(i,j)=28.
       endif
! rmets(1121,521:525)=45.
       if(xdeg(i).gt.280.0.and.xdeg(i).lt.280.3.and.ydeg(j).gt.29.2.and.ydeg(j).lt.30.5) then
       rmets(i,j)=45.
       endif
! rmets(1120,522:523)=28.
       if(xdeg(i).gt.279.5.and.xdeg(i).lt.280.0.and.ydeg(j).gt.29.5.and.ydeg(j).lt.30.0) then
       rmets(i,j)=28.
       endif         
       if(ydeg(j).gt.85.0)then
       rmets(i,j)=0.
       endif
       enddo
       enddo

!      stop
! artificial high latitude shelves (shortcircuits arcti! ocean,
! truncates antarcti! seas and bays, and avoids artificial excessive bt
! mode vortex stretching at latitudinal boundaries)

!cw new shallowing scheme
      jtt=min(j2t/60,k2)
!cw      jtt=min(j2t/30,k2)
      kinv=int(dble(k2)/dble(jtt)+.5)
      kzl=int(70.*dble(k1)/60.)
      if(myid.eq.0) print*,'kzl=',kzl

      do 23 j=2,j1

      if(mylat*j2+j-1.le.jtt) then
      jin=mylat*j2+j-2      
      kin=1+kinv*jin
!cw      kk=min(k0+k1,2*kin+3)
      kk=min(k0+k1,2*kin+kzl+1)
      tmp=.01*z(kk)
      do 21 i=1,i0
 21   rmets(i,j)=min(rmets(i,j),tmp)  
      endif

      if(mylat*j2+j.ge.j0t-jtt) then
      jin=j0t-mylat*j2-j-1
      kin=1+kinv*jin
!cw      kk=min(k0+k1,2*kin+3)
      kk=min(k0+k1,2*kin+kzl+1)

      tmp=.01*z(kk)
      do 22 i=1,i0
 22   rmets(i,j)=min(rmets(i,j),tmp)
      endif
 23   continue   


!cts20150921 if(.false.)then
      endif

!      if (mylat .eq. 0) then
!      n=0
!      do 22 k=1,k1
!      n=n+1
!      kk=min(k0+k1,2*k+3)
!      tmp=.01*z(kk)
!      do 22 i=1,i0
! 22   rmets(i,n+1)=min(rmets(i,n+1),tmp)
!      endif
!      
!      if (mylat .eq. ngy1) then
!      n=0
!      do 23 k=1,k1
!      n=n+1
!      kk=min(k0+k1,2*k+3)
!      tmp=.01*z(kk)
!      do 23 i=1,i0
! 23   rmets(i,j0-n)=min(rmets(i,j0-n),tmp)
!      endif

      

! bad point is (39,401) starting at step 91100
!      write(*,24) (j,(int(rmets(i,j)),i=31,47),j=j1,j1-50,-1)
! 24   format(i3,4x,17i4)

!     write(*,24) (j,(int(rmets(i,j)),i=261,300),j=206,167,-1)
!c24   format(/(i3,1x,40i1))

! make all water least 2 layers deep
! to allow baroclini! ventillation all the way to coast
      tmp=.01*z(5)
!convert 1-layer deep water to 2-layer-deep water
! alternatively, !convert water less than 2 layers deep to land

!cw20150910
!cw      tmp1=.01*(z(3)+z(5))/2.
      tmp1=.01*(z(5)+z(7))/2. 

      do 25 j=2,j1
      do 25 i=2,i1
!convert land to water
! 25   if (rmets(i,j).gt.tmp1) rmets(i,j)=max(rmets(i,j),tmp)
!convert water to land
 25   if (rmets(i,j).lt.tmp1) rmets(i,j)=0.

! periodic
      call mpi_sendrecv(rmets(2,1),1,m_vlon_2d,m_w,1,rmets(i0,1),1,m_vlon_2d,m_e,1,mpi_comm_world,istat,ierr)
      call mpi_sendrecv(rmets(i1,1),1,m_vlon_2d,m_e,1,rmets(1,1),1,m_vlon_2d,m_w,1,mpi_comm_world,istat,ierr)
      call mpi_sendrecv(rmets(1,2),1,m_vlat_2d,m_s,1,rmets(1,j0),1,m_vlat_2d,m_n,1,mpi_comm_world,istat,ierr)
      call mpi_sendrecv(rmets(1,j1),1,m_vlat_2d,m_n,1,rmets(1,1),1,m_vlat_2d,m_s,1,mpi_comm_world,istat,ierr)

      do 33 j=1,j0
      do 33 i=1,i0
 33   rmets(i,j)=min(tlz,100.*rmets(i,j))
  
! determine "logical grid" rmets array kb(i,j)
! kb(i,j)=number of layers at pressure point (i,j)
      do 34 k=1,k1
      zz=.5*(z(2*k-1)+z(2*k+1))
      do 34 j=1,j0
      do 34 i=1,i0
! if rmets is deeper than mid-layer (zz), increment kb by 1
      l=rmets(i,j)/zz
 34   kb(i,j)=kb(i,j)+min(1,l)

! widen northern izu gap to allow more flow through to entrain more
! oyashio water. this was added at day 90 of year 6. before that the
! kuroshio extension was good, but a small southward loop downstream from
! the gap is decreased by this change.
! deepen widened gap at start of year 14
!     n=1
! further deepen gap at start of year 16
      n=2
      do i=2,i1
      do j=2,j1

      if(.false.)then
!cts 20150911 remove new york bight singularity
       if(xdeg(i).gt.289.5.and.xdeg(i).lt.293.5.and.ydeg(j).gt.42.2.and.ydeg(j).lt.45.2) then
       kb(i,j)=min(kb(i,j),3)
       endif
       if(xdeg(i).gt.289.5.and.xdeg(i).lt.293.5.and.ydeg(j).gt.41.5.and.ydeg(j).lt.45.2) then
       kb(i,j)=min(kb(i,j),7)
       endif
      endif
!cts seamounts around 44.7n, 321e

      if(xdeg(i).gt.319.and.xdeg(i).lt.322.and.ydeg(j).gt.44.8.and.ydeg(j).lt.45.2) then
       kb(i,j)=min(kb(i,j),32)
      endif

      if(.false.)then
!cts kuroshio seperation-japan coast should be sahllower
      if(xdeg(i).gt.138.8.and.xdeg(i).lt.141.4.and.ydeg(j).gt.34.5.and.ydeg(j).lt.35.) then
       kb(i,j)=min(kb(i,j),18)
      endif
      if(xdeg(i).gt.140.9.and.xdeg(i).lt.141.8.and.ydeg(j).gt.35..and.ydeg(j).lt.36.) then
       kb(i,j)=min(kb(i,j),15)
      endif
      if(xdeg(i).gt.140.9.and.xdeg(i).lt.141.8.and.ydeg(j).gt.36.and.ydeg(j).lt.37.) then
       kb(i,j)=min(kb(i,j),11)
      endif
      if(xdeg(i).gt.141.8.and.xdeg(i).lt.142.8.and.ydeg(j).gt.35.1.and.ydeg(j).lt.39.4) then
       kb(i,j)=kb(i,j)-5
      endif
      endif
!cw 20150910
      if(.false.) then

!cw      do j=539,541  i=561,563
!cw      kb(iloc,jloc)=13+n
       if(xdeg(i).gt.140.0.and.xdeg(i).lt.140.8.and.ydeg(j).gt.33.2.and.ydeg(j).lt.34.0) then
       kb(i,j)=13+n
       endif
!cw      iloc=561-mylon*i2    jloc=539-mylat*j2
!cw      kb(iloc,jloc)=13+n
       if(xdeg(i).gt.140.0.and.xdeg(i).lt.140.3.and.ydeg(j).gt.33.2.and.ydeg(j).lt.33.6) then
       kb(i,j)=13+n
       endif
!cw      iloc=562-mylon*i2    jloc=539-mylat*j2
!cw      kb(iloc,jloc)=13+n
       if(xdeg(i).gt.140.3.and.xdeg(i).lt.140.5.and.ydeg(j).gt.33.2.and.ydeg(j).lt.33.6) then
       kb(i,j)=13+n
       endif
!cw      iloc=561-mylon*i2    jloc=540-mylat*j2
!cw      kb(iloc,jloc)=13+n
       if(xdeg(i).gt.140.0.and.xdeg(i).lt.140.3.and.ydeg(j).gt.33.5.and.ydeg(j).lt.33.7) then
       kb(i,j)=13+n
       endif
!cw      iloc=562-mylon*i2    jloc=540-mylat*j2
!cw      kb(iloc,jloc)=13+n
       if(xdeg(i).gt.140.3.and.xdeg(i).lt.140.5.and.ydeg(j).gt.33.5.and.ydeg(j).lt.33.7) then
       kb(i,j)=13+n
       endif
!cw      iloc=562-mylon*i2    jloc=541-mylat*j2
!cw      kb(iloc,jloc)=13+n
       if(xdeg(i).gt.140.3.and.xdeg(i).lt.140.5.and.ydeg(j).gt.33.7.and.ydeg(j).lt.33.9) then
       kb(i,j)=13+n
       endif

! eliminate anomalous ny bight island
!cw      iloc=1142-mylon*i2   jloc=557-mylat*j2
!cw      kb(iloc,jloc)=2
       if(xdeg(i).gt.285.3.and.xdeg(i).lt.285.5.and.ydeg(j).gt.36.9.and.ydeg(j).lt.37.1) then
       kb(i,j)=2
       endif
!cw      iloc=1142-mylon*i2   jloc=558-mylat*j2
!cw      kb(iloc,jloc)=2
       if(xdeg(i).gt.285.3.and.xdeg(i).lt.285.5.and.ydeg(j).gt.37.1.and.ydeg(j).lt.37.3) then
       kb(i,j)=2
       endif
!cw      iloc=1142-mylon*i2   jloc=559-mylat*j2
!cw      kb(iloc,jloc)=2
       if(xdeg(i).gt.285.3.and.xdeg(i).lt.285.5.and.ydeg(j).gt.37.3.and.ydeg(j).lt.37.5) then
       kb(i,j)=2
       endif
!cw      iloc=1144-mylon*i2   jloc=561-mylat*j2
!cw      kb(iloc,jloc)=2
       if(xdeg(i).gt.285.8.and.xdeg(i).lt.290.1.and.ydeg(j).gt.37.7.and.ydeg(j).lt.37.9) then
       kb(i,j)=2
       endif
!cts no above modification
       endif



!cts new check and topographical modification
       if(xdeg(i).gt.140.5.and.xdeg(i).lt.141.5.and.ydeg(j).gt.41.0.and.ydeg(j).lt.42.) then
       kb(i,j)=10
       endif
!cw20150902
       if(xdeg(i).gt.120.5.and.xdeg(i).lt.121.5.and.ydeg(j).gt.24.5.and.ydeg(j).lt.25.0) then
       kb(i,j)=9
       endif
  
       if(xdeg(i).gt.121.5.and.xdeg(i).lt.122.5.and.ydeg(j).gt.25.5.and.ydeg(j).lt.26.0) then
       kb(i,j)=13
       endif

!cw indonesia throughflow
       if(xdeg(i).gt.119.5.and.xdeg(i).lt.120.5.and.ydeg(j).gt.-6..and.ydeg(j).lt.0.25) then
       kb(i,j)=23
       endif

       if(xdeg(i).gt.119.5.and.xdeg(i).lt.121.5.and.ydeg(j).gt.0.5.and.ydeg(j).lt.0.75) then
       kb(i,j)=20
       endif

       if(xdeg(i).gt.119.5.and.xdeg(i).lt.121.5.and.ydeg(j).gt.0.75.and.ydeg(j).lt.1.) then
       kb(i,j)=24
       endif

       if(xdeg(i).gt.119.5.and.xdeg(i).lt.121.5.and.ydeg(j).gt.1..and.ydeg(j).lt.1.5) then
       kb(i,j)=26
       endif

!cw allow lombok
       if(xdeg(i).gt.118.5.and.xdeg(i).lt.119.5.and.ydeg(j).gt.-12.5.and.ydeg(j).lt.-11.75) then
       kb(i,j)=26
       endif

       if(xdeg(i).gt.118.5.and.xdeg(i).lt.119.5.and.ydeg(j).gt.-10.75.and.ydeg(j).lt.-10.25) then
       kb(i,j)=28
       endif

!cw allow ombai
       if(xdeg(i).gt.122.5.and.xdeg(i).lt.123.5.and.ydeg(j).gt.-8.5.and.ydeg(j).lt.-8.) then
       kb(i,j)=26
       endif

       if(xdeg(i).gt.123.5.and.xdeg(i).lt.124.5.and.ydeg(j).gt.-8.5.and.ydeg(j).lt.-8.) then
       kb(i,j)=25
       endif

       if(xdeg(i).gt.126.5.and.xdeg(i).lt.127.5.and.ydeg(j).gt.-9.and.ydeg(j).lt.-8.5) then
       kb(i,j)=24
       endif

       if(xdeg(i).gt.129.5.and.xdeg(i).lt.131.5.and.ydeg(j).gt.-3.75.and.ydeg(j).lt.0.75) then
       kb(i,j)=24
       endif


       enddo
       enddo

       do j=2,j1
       do i=2,i1
       if(ydeg(j).ge.34..and.ydeg(j).le.36.5.and.xdeg(i).ge.352.5.and.xdeg(i).le.356)then
        kb(i,j)=max(kb(i,j),19)
       endif
       enddo
       enddo

       do j=2,j1
       do i=2,i1
       if(ydeg(j).ge.36..and.ydeg(j).le.36.5.and.xdeg(i).ge.354.and.xdeg(i).le.356)then
        write(*,*)'topo1',i,j

        do jj=j+6,j-8,-1
        write(*,'(a,11i4)')'topo1',kb(i-5:i+5,jj)
        enddo
       endif
       enddo
       enddo


!cw check
!       do i=2,i1
!       do j=2,j1
!       it=i+mylon*i2-1
!       jt=j+mylat*j2-1
!       if(it.eq.107.and.jt.eq.144) print*,'1 kb 107 144=',kb(i,j)
!     1 ,xdeg(i),ydeg(j)
!       if(it.eq.116.and.jt.eq.144) print*,'1 kb 116 144=',kb(i,j)
!     1 ,xdeg(i),ydeg(j)
!       if(it.eq.117.and.jt.eq.144) print*,'1 kb 117 144=',kb(i,j)
!       enddo
!       enddo

! derive land/sea mask array
      do 52 j=1,j0
      do 52 i=1,i0
      it=kb(i,j)
      if (it.ne.0) go to 50
      kb(i,j)=1
      go to 52
 50   do 51 k=1,it
 51   in(i,j,k)=1
 52   continue

      do 53 j=2,j1
      do 53 i=2,i1
 53   intmp(i-1,j-1)=in(i,j,1)

       do j=2,j1
       do i=2,i1
       if(ydeg(j).ge.36..and.ydeg(j).le.36.5.and.xdeg(i).ge.354.and.xdeg(i).le.356)then
        write(*,*)'topo1',i,j
        do jj=j+6,j-8,-1
        write(*,'(a,11i4)')'topo1',in(i-5:i+5,jj,1)
        enddo
       endif
       enddo
       enddo

      nsend=i2*j2

      call mpi_gather(intmp,nsend,mpi_integer2,inbuf,nsend,mpi_integer2,0,mpi_comm_world,ierr)

      if (myid .eq. 0) then
      do 57 nx=1,ngx0
      ngxt=(nx-1)*ngy0
      do 57 ny=1,ngy0
      ngt=((ny-1)+ngxt)*i2*j2
      do 57 j=1,j2
      nt=ngt+(j-1)*i2
      jt=j+(ny-1)*j2
      do 57 i=1,i2
!      it=mod(i+(nx-1)*i2+i2t/2,i2t)
      it=i+(nx-1)*i2
 57   ing(it+1,jt+1)=inbuf(nt+i)
      
! in and ing is the same with in in global_serial1


!remark that boundary condition is computed in value of ghost cell.
! ------------------------------------------------------
! start with single point in central equatorial pacific
! check pt
      n=0
!      ing(i2t/6,j0t/2)=2


      ing(2*i0t/3,j0t/2)=2


! ------------------------------------------------------
! due to periodi! logical grid boundary at 0 deg longitude
! we need a second point in the arcti! ocean
! rmk: i=2 alway lies in processor 0.

!cw20140604      ing(2,j1t)=2

 153  n=n+1
      nsum=0
      do 155 j=2,j1t
      do 154 i=2,i1t
      nn=ing(i+1,j)
      if (ing(i+1,j).eq.1.and.ing(i,j).eq.2) ing(i+1,j)=2
      nsum=nsum+ing(i+1,j)-nn
      nn=ing(i-1,j)
      if (ing(i-1,j).eq.1.and.ing(i,j).eq.2) ing(i-1,j)=2
      nsum=nsum+ing(i-1,j)-nn
      nn=ing(i,j+1)
      if (ing(i,j+1).eq.1.and.ing(i,j).eq.2) ing(i,j+1)=2
      nsum=nsum+ing(i,j+1)-nn
      nn=ing(i,j-1)
      if (ing(i,j-1).eq.1.and.ing(i,j).eq.2) ing(i,j-1)=2
 154  nsum=nsum+ing(i,j-1)-nn
      do 155 i=i1t,2,-1
      nn=ing(i+1,j)
      if (ing(i+1,j).eq.1.and.ing(i,j).eq.2) ing(i+1,j)=2
      nsum=nsum+ing(i+1,j)-nn
      nn=ing(i-1,j)
      if (ing(i-1,j).eq.1.and.ing(i,j).eq.2) ing(i-1,j)=2
      nsum=nsum+ing(i-1,j)-nn
      nn=ing(i,j+1)
      if (ing(i,j+1).eq.1.and.ing(i,j).eq.2) ing(i,j+1)=2
      nsum=nsum+ing(i,j+1)-nn
      nn=ing(i,j-1)
      if (ing(i,j-1).eq.1.and.ing(i,j).eq.2) ing(i,j-1)=2
 155  nsum=nsum+ing(i,j-1)-nn

      write(*,156) nsum,n
 156  format(i8,'changes during iteration',i4)
      if (nsum.ne.0) go to 153


      do 157 j=1,j0t
      ing(i0t,j)=ing(2,j)
 157  ing(1,j)=ing(i1t,j)
      endif
      call mpi_bcast(ing,i0t*j0t,mpi_integer2,0,mpi_comm_world,ierr)

! widen northern izu gap to allow more flow through to entrain more
! oyashio water. this was added at day 90 of year 6. before that the
! kuroshio extension was good, but a small southward loop downstream from
! the gap is decreased by this change.

!cw      iloc=561-mylon*i2
!cw      jloc=539-mylat*j2
!cw      if(iloc.ge.2.and.iloc.le.i1.and.jloc.ge.2.and.jloc.le.j1)
!cw     1 kb(iloc,jloc)=13
!cw      iloc=562-mylon*i2
!cw      jloc=539-mylat*j2
!cw      if(iloc.ge.2.and.iloc.le.i1.and.jloc.ge.2.and.jloc.le.j1)
!cw     1 kb(iloc,jloc)=13
!cw      iloc=561-mylon*i2
!cw      jloc=540-mylat*j2
!cw      if(iloc.ge.2.and.iloc.le.i1.and.jloc.ge.2.and.jloc.le.j1)
!cw     1 kb(iloc,jloc)=13
!cw      iloc=562-mylon*i2
!cw      jloc=540-mylat*j2
!cw      if(iloc.ge.2.and.iloc.le.i1.and.jloc.ge.2.and.jloc.le.j1)
!cw     1 kb(iloc,jloc)=13
!cw      iloc=562-mylon*i2
!cw      jloc=541-mylat*j2
!cw      if(iloc.ge.2.and.iloc.le.i1.and.jloc.ge.2.and.jloc.le.j1)
!cw     1 kb(iloc,jloc)=13


      it=mylon*i2
      jt=mylat*j2
      do 158 j=1,j0
      do 158 i=1,i0
      in(i,j,1)=ing(it+i,jt+j)
      n=in(i,j,1)
 158  if (in(i,j,1).ne.2) kb(i,j)=0
       do j=2,j1
       do i=2,i1
       if(ydeg(j).ge.36..and.ydeg(j).le.36.5.and.xdeg(i).ge.354.and.xdeg(i).le.356)then
        write(*,*)'topo2',i,j
        do jj=j+6,j-8,-1
         write(*,'(a,11i4)')'toin2',in(i-5:i+5,jj,1)
        enddo
       endif
       enddo
       enddo

      do 159 k=1,k1
      do 159 j=1,j0
      do 159 i=1,i0
 159  in(i,j,k)=0

       do j=2,j1
       do i=2,i1
       if(ydeg(j).ge.36..and.ydeg(j).le.36.5.and.xdeg(i).ge.354.and.xdeg(i).le.356)then
        write(*,*)'topo2',i,j
        do jj=j+6,j-8,-1
         write(*,'(a,11i4)')'topo2',kb(i-5:i+5,jj)
        enddo
       endif
       enddo
       enddo

!     do 8886 j=j1,2,-1
!8886 write(*,8887) j,(kb(i,j),i=1,122)
!8887 format(i3,1x,122i1)
!     do 8888 j=j1,2,-1
!8888 write(*,8887) j,(kb(i,j),i=121,242)
!     do 8889 j=j1,2,-1
!8889 write(*,8887) j,(kb(i,j),i=241,362)

! redefine in with exterraneous pools eliminated

      do 162 j=2,j1
      do 162 i=1,i0
      it=kb(i,j)
      if (it.ne.0) go to 160
      kb(i,j)=1
      go to 162
 160  do 161 k=1,it
 161  in(i,j,k)=1
 162  continue


       do j=2,j1
       do i=2,i1
       if(ydeg(j).ge.36..and.ydeg(j).le.36.5.and.xdeg(i).ge.354.and.xdeg(i).le.356)then
        write(*,*)'topo3',i,j
        do jj=j+6,j-8,-1
        write(*,'(a,11i4)')'topo3',kb(i-5:i+5,jj)
        enddo
       endif
       enddo
       enddo

! periodic
      call mpi_type_vector(1,i0,j0,mpi_integer2,m_vlat_2di,ierr)
      call mpi_type_commit(m_vlat_2di,ierr)
      call mpi_sendrecv(kb(1,2),1,m_vlat_2di,m_s,1,kb(1,j0),1,m_vlat_2di,m_n,1,mpi_comm_world,istat,ierr)
      call mpi_sendrecv(kb(1,j1),1,m_vlat_2di,m_n,1,kb(1,1),1,m_vlat_2di,m_s,1,mpi_comm_world,istat,ierr)

      call mpi_type_vector(k1,i0,i0*j0,mpi_integer2, m_vlat_2di,ierr)
      call mpi_type_commit(m_vlat_2di,ierr)
      call mpi_sendrecv(in(1,2,1),1,m_vlat_2di,m_s,1,in(1,j0,1),1,m_vlat_2di,m_n,1,mpi_comm_world,istat,ierr)
      call mpi_sendrecv(in(1,j1,1),1,m_vlat_2di,m_n,1,in(1,1,1),1,m_vlat_2di,m_s,1,mpi_comm_world,istat,ierr)


!cw check
!       do i=2,i1
!       do j=2,j1
!       it=i+(mylon)*i2-1
!       jt=j+(mylat)*j2-1
!       if(it.eq.107.and.jt.eq.144) print*,'2 kb 107 144=',kb(i,j)
!       if(it.eq.116.and.jt.eq.144) print*,'2 kb 116 144=',kb(i,j)
!       if(it.eq.117.and.jt.eq.144) print*,'2 kb 117 144=',kb(i,j)
!       enddo
!       enddo






! mask out points having no lateral ventillation
 69   n=0
      do 70 k=2,k1
      do 70 j=2,j1
      do 70 i=2,i1
      if (in(i-1,j,k)+in(i+1,j,k)+in(i,j-1,k)+in(i,j+1,k).ne.0) go to 70
      if (in(i,j,k).ne.0) n=n+1
      in(i,j,k)=0
 70   continue
      write(*,71) n
 71   format('mask out',i4,' points having no lateral ventillation')
      if (n.ne.0) go to 69
! redefine kb based on modified in
      do 72 k=2,k1
      do 72 j=2,j1
      do 72 i=2,i1
      if (in(i,j,k).eq.1) go to 72
      if (in(i,j,k-1).eq.1) kb(i,j)=k-1
! this may be redundant
      kb(i,j)=max(1,kb(i,j))
 72   continue

       do j=2,j1
       do i=2,i1
       if(ydeg(j).ge.36..and.ydeg(j).le.36.5.and.xdeg(i).ge.354.and.xdeg(i).le.356)then
        write(*,*)'topo4',i,j
        do jj=j+6,j-8,-1
        write(*,'(a,11i4)')'topo4',kb(i-5:i+5,jj)
        enddo
       endif
       enddo
       enddo

! periodic
      call mpi_barrier(mpi_comm_world,ierr)
      call mpi_type_vector(1,i0,j0,mpi_integer2,m_vlat_2di,ierr)
      call mpi_type_commit(m_vlat_2di,ierr)
      call mpi_type_vector(j0,1,i0,mpi_integer2,m_vlon_2di,ierr)
      call mpi_type_commit(m_vlon_2di,ierr)
      call mpi_sendrecv(kb(1,2),1,m_vlat_2di,m_s,1,kb(1,j0),1,m_vlat_2di,m_n,1,mpi_comm_world,istat,ierr)
      call mpi_sendrecv(kb(1,j1),1,m_vlat_2di,m_n,1,kb(1,1),1,m_vlat_2di,m_s,1,mpi_comm_world,istat,ierr)
      call mpi_sendrecv(kb(2,1),1,m_vlon_2di,m_w,1,kb(i0,1),1,m_vlon_2di,m_e,1,mpi_comm_world,istat,ierr)
      call mpi_sendrecv(kb(i1,1),1,m_vlon_2di,m_e,1,kb(1,1),1,m_vlon_2di,m_w,1,mpi_comm_world,istat,ierr)


      call mpi_barrier(mpi_comm_world,ierr)
      call mpi_type_vector(k1,i0,i0*j0,mpi_integer2,m_vlat_2di,ierr)
      call mpi_type_commit(m_vlat_2di,ierr)
      call mpi_type_vector(k1*j0,1,i0,mpi_integer2,m_vlon_2di,ierr)
      call mpi_type_commit(m_vlon_2di,ierr)
      call mpi_sendrecv(in(1,2,1),1,m_vlat_2di,m_s,1,in(1,j0,1),1,m_vlat_2di,m_n,1,mpi_comm_world,istat,ierr)
      call mpi_sendrecv(in(1,j1,1),1,m_vlat_2di,m_n,1,in(1,1,1),1,m_vlat_2di,m_s,1,mpi_comm_world,istat,ierr)
      call mpi_sendrecv(in(2,1,1),1,m_vlon_2di,m_w,1,in(i0,1,1),1,m_vlon_2di,m_e,1,mpi_comm_world,istat,ierr)
      call mpi_sendrecv(in(i1,1,1),1,m_vlon_2di,m_e,1,in(1,1,1),1,m_vlon_2di,m_w,1,mpi_comm_world,istat,ierr)
      call mpi_barrier(mpi_comm_world,ierr)



!cw check
!       do i=2,i1
!       do j=2,j1
!       it=i+(mylon)*i2-1
!       jt=j+(mylat)*j2-1
!       if(it.eq.107.and.jt.eq.144) print*,'3 kb 107 144=',kb(i,j)
!       if(it.eq.116.and.jt.eq.144) print*,'3 kb 116 144=',kb(i,j)
!       if(it.eq.117.and.jt.eq.144) print*,'3 kb 117 144=',kb(i,j)
!       enddo
!       enddo


! other mask arrays

      do 64 k=1,k1
      do 64 j=1,j0
      do 64 i=1,i1
 64   iu(i,j,k)=in(i,j,k)*in(i+1,j,k)

      do 65 k=1,k1
      do 65 j=1,j1
      do 65 i=1,i0
 65   iv(i,j,k)=in(i,j,k)*in(i,j+1,k)

      do 66 k=1,k2
      do 66 j=1,j0
      do 66 i=1,i0
 66   iw(i,j,k+1)=in(i,j,k)*in(i,j,k+1)


      do k=1,k1
       jt=(k-1)*j0
       do j=1,j0
        ise(jt+j)=iu(i1,j,k)
        isw(jt+j)=iu(2,j,k)
       enddo
      enddo
      do k=1,k1
       it=(k-1)*i0
       do i=1,i0
        isn(it+i)=iv(i,j2,k)
        iss(it+i)=iv(i,2,k)
       enddo
      enddo

      nlon=j0*k1
      nlat=i0*k1

      call mpi_barrier(mpi_comm_world,ierr)
      call mpi_sendrecv(isw,nlon,mpi_integer2,m_w,1,ire,nlon,mpi_integer2,m_e,1,mpi_comm_world,istat,ierr)
      call mpi_sendrecv(ise,nlon,mpi_integer2,m_e,1,irw,nlon,mpi_integer2,m_w,1,mpi_comm_world,istat,ierr)
      call mpi_sendrecv(iss,nlat,mpi_integer2,m_s,1,irn,nlat,mpi_integer2,m_n,1,mpi_comm_world,istat,ierr)
      call mpi_sendrecv(isn,nlat,mpi_integer2,m_n,1,irs,nlat,mpi_integer2,m_s,1,mpi_comm_world,istat,ierr)

      do k=1,k1
       jt=(k-1)*j0
        do j=1,j0
         ise(jt+j)=iu(i2,j,k)
         isw(jt+j)=iu(3,j,k)
         iu(i0,j,k)=ire(jt+j)
         iu(1,j,k)=irw(jt+j)
       enddo
      enddo
      if (mylat .ne.ngy1) then
      do k=1,k1
       it=(k-1)*i0
       do i=1,i0
        iv(i,j0,k)=irn(it+i)
       enddo
      enddo
      endif

      if (mylat .ne. 0) then
      do k=1,k1
       it=(k-1)*i0
       do i=1,i0
        iv(i,0,k)=irs(it+i)
       enddo
      enddo
      endif

      call mpi_barrier(mpi_comm_world,ierr)
      call mpi_sendrecv(isw,nlon,mpi_integer2,m_w,1,ire,nlon,mpi_integer2,m_e,1,mpi_comm_world,istat,ierr)
      call mpi_sendrecv(ise,nlon,mpi_integer2,m_e,1,irw,nlon,mpi_integer2,m_w,1,mpi_comm_world,istat,ierr)

      do k=1,k1
       jt=(k-1)*j0
       do j=1,j0
        iu(i0+1,j,k)=ire(jt+j)
        iu(0,j,k)=irw(jt+j)
       enddo
      enddo
      do j=2,j1
       do i=0,i0+1
        iu0(i,j)=iu(i,j,1)
        iu(i,j,1)=1
       enddo
      enddo
      do j=0,j0
      do i=2,i1
        iv0(i,j)=iv(i,j,1)
        iv(i,j,1)=1
       enddo
      enddo

      if(mylat.eq.0)then
        do i=1,i0
         iv(i,0,1)=0
         iv(i,1,1)=0
        enddo    
      endif
      if(mylat.eq.ngy1)then
        do i=1,i0
         iv(i,j0,1)=0
         iv(i,j1,1)=0
        enddo
      endif                    

!      write(60) tlz,z,odz,odzw,kb,in,iu,iv,iw,iu0,iv0
!      write(60) rmets
      call wr8nc_zkb  !dog
! ===================================================================
! coupling to 1/8 deg resolution tai and gom grids; one may still run
! entire medina model with coupling to global model, because it uses
! no equatorial shelf.
! this global model, the medina model and norpa! tai grid all fit in
! the memory of a single "fast" processor, but may run less than a
! day per hour of cpu. with one way coupling and separate processors
! for each model, the speed will be almost as fast as the full norpac
! duo grid model.
! ===================================================================
! write rmets data for tai grid (at 150 deg e)
! this covers coupling region with tai grid (j0=488 in tai grid)
! from equator northward
!      open(80,file='tai_kbe')
!      write(80,80) (kb(601,j),kb(601,j),j=399,642)
! 80   format(40i3)
!      open(81,file='gom_kbe')
! write rmets data for gom grid (at 300 deg e)
! this covers coupling region with gom grid (j0=336 in gom grid)
! from 10 deg latitude to 46 deg n
!      write(81,80) (kb(1201,j),kb(1201,j),j=439,606)
!      write(*,99) (j,(in(i,j,1),i=1,140),j=j0,1,-1)
! 99   format(i3,1x,140i1)

      call initfs

end subroutine
! ****************
! initialization *
! ****************
! ----------------------------------------------------------------------
subroutine pre(ax,ay,bb,cx,cy,rinv,rinv1,hh,ie)
! ----------------------------------------------------------------------
      real*8 rinv,rinv1,hh,run,rtp,rtemp,rp
      dimension ax(i2,j2),ay(i2,j2),bb(i2,j2),cx(i2,j2),cy(i2,0:j2),rinv(ibir,i0,nbg0),rinv1(ibir,i0,nbg1),hh(i0,j0),ie(nb0),rp(i0t*i0t),rtemp(i2t,i0t),rtp(i2t,i2t),ipvt(i2t)
      dimension axt(i2,j2),ayt(i2,j2),bbt(i2,j2),cxt(i2,j2),cyt(i2,j2),ct(i2)

      do 100 ng=1,ngy0
      jl=1
      if (mylat .eq. ng-1) then
      do 99 j=1,j2
      do 99 i=1,i2
      axt(i,j)=ax(i,j)
      ayt(i,j)=ay(i,j)
      bbt(i,j)=bb(i,j)
      cxt(i,j)=cx(i,j)
 99   cyt(i,j)=cy(i,j)
      endif
      if (mylat .eq. ng-2) then
      do 98 i=1,i2
 98   ct(i)=cy(i,j2)
      endif
      nsd=i2*j2
      call mpi_bcast(axt,nsd,mpi_real8,ng-1,m_comm_lat,ierr)
      call mpi_bcast(ayt,nsd,mpi_real8,ng-1,m_comm_lat,ierr)
      call mpi_bcast(bbt,nsd,mpi_real8,ng-1,m_comm_lat,ierr)
      call mpi_bcast(cxt,nsd,mpi_real8,ng-1,m_comm_lat,ierr)
      call mpi_bcast(cyt,nsd,mpi_real8,ng-1,m_comm_lat,ierr)
      if (ng .ne. 1)call mpi_bcast(ct,i2,mpi_real8,ng-2,m_comm_lat,ierr)

      if (mylat .eq. ng-1) then
      do 97 i=1,i2
 97   cy(i,0)=ct(i)
      endif
      do 100 nb=1,nb0
      nbg=(ng-1)*nb0+nb
      write(*,111) nbg,nbg0
 111  format ('processing block #',i3,' out of ',i3,' total evp solver')
      jh=ie(nb)
      jhp=jh+1
      jhm=jh-2
      jg=jl+1
      do 250 ii=1,ibir
      ig=mylat*ibir+ii
      idxy=(ig-1)/i2
      do 210 j=jl,jhp
      do 210 i=1,i0
 210  hh(i,j)=0.d0
      if (idxy .eq. mylon) then
      if (mod(ig,i2) .eq. 0) then
      hh(i1,jg)=1.d0
      else
      hh(mod(ig,i2)+1,jg)=1.d0
      endif
      endif
      call mpi_sendrecv(hh(2,jg),1,mpi_real8,m_w,1,hh(i0,jg),1,mpi_real8,m_e,1,mpi_comm_world,istat,ierr)
      call mpi_sendrecv(hh(i1,jg),1,mpi_real8,m_e,1,hh(1,jg),1,mpi_real8,m_w,1,mpi_comm_world,istat,ierr)
      if (nbg .eq. 1) go to 220
      if (idxy .eq. mylon) then
      if (nb .ne. 1) then
       if (mod(ig,i2) .eq. 0) then
       ctemp=cyt(i2,jg-2)
       else
       ctemp=cyt(mod(ig,i2),jg-2)
       endif
      else
       if (mod(ig,i2) .eq. 0) then
       ctemp=ct(i2)
       else
       ctemp=ct(mod(ig,i2))
       endif
      endif
      endif
      call mpi_bcast(ctemp,1,mpi_real8,idxy,m_comm_lon,ierr)
      do 218 n=1,i0
 218  hh(n,jl)=rinv1(ii,n,nbg-1)*ctemp
 220  continue
      do 226 j=jl,jhm
      do 225 i=1,i2
 225  hh(i+1,j+2)=-(axt(i,j)*hh(i,j+1)+ayt(i,j)*hh(i+1,j)+bbt(i,j)*hh(i+1,j+1)+cxt(i,j)*hh(i+2,j+1))/cyt(i,j)
      call mpi_sendrecv(hh(2,j+2),1,mpi_real8,m_w,1,hh(i0,j+2),1,mpi_real8,m_e,1,mpi_comm_world,istat,ierr)
 226  call mpi_sendrecv(hh(i1,j+2),1,mpi_real8,m_e,1,hh(1,j+2),1,mpi_real8,m_w,1,mpi_comm_world,istat,ierr)
      j=jh-1
      do 230 i=1,i2
 230  rinv(ii,i+1,nbg)=axt(i,j)*hh(i,j+1)+ayt(i,j)*hh(i+1,j)+bbt(i,j)*hh(i+1,j+1)+cxt(i,j)*hh(i+2,j+1)

      if (nbg.eq.nbg0) go to 250
      j=ie(nb)
      do 240 n=1,i0
 240  rinv(ii,n,nbg0)=hh(n,j)
      if (idxy .eq. mylon) then
      if (mod(ig,i2) .eq. 0) then
      hh(i1,jg)=0.d0
      else
      hh(mod(ig,i2)+1,jg)=0.d0
      endif
      endif
 250  continue

      nsend=i2*ibir

      call mpi_gather(rinv(1,2,nbg),nsend,mpi_real8,rp(1),nsend,mpi_real8,0,mpi_comm_world,ierr)
      if (myid .eq. 0) then
      do 497 nx=1,ngx0
      ngxt=(nx-1)*ngy0
      do 497 ny=1,ngy0
      ngt=((ny-1)+ngxt)*ibir*i2
      do 497 j=1,i2
      nt=ngt+(j-1)*ibir
      jt=j+(nx-1)*i2
      do 497 i=1,ibir
      it=i+(ny-1)*ibir
 497  rtemp(it,jt)=rp(nt+i)

      do 498 i=1,i2t
      do 498 j=1,i2t
 498  rtp(j,i)=0.d0
      do 499 i=1,i2t
 499  rtp(i,i)=1.d0
      call dgesv(i2t,i2t,rtemp,i2t,ipvt,rtp,i2t,info)
      do 500 i=1,i2t
      do 500 j=1,i2t
 500  rtemp(j,i)=rtp(i,j)
      endif

      call mpi_bcast(info,1,mpi_integer,0,mpi_comm_world,ierr)
      if (info .ne. 0) then
      print*,'preporcessor failed because rinv is singular at nbg =',nbg
      stop
      endif
      nsend=i2t*i2t
      call mpi_bcast(rtp,nsend,mpi_real8,0,mpi_comm_world,ierr)
      it=mylon*i2
      jt=mylat*ibir

      jss=1
      jff=i0
      if (mylon .eq.0) then
      do 501 i=1,ibir
 501  rinv(i,1,nbg)=rtp(jt+i,i2t)
      jss=2
      endif
      if (mylon .eq. ngx1) then
      do 502 i=1,ibir
 502  rinv(i,i0,nbg)=rtp(jt+i,1)
      jff=i1
      endif
      do 503 j=jss,jff
      do 503 i=1,ibir
 503  rinv(i,j,nbg)=rtp(jt+i,it+j-1)

      if (nbg.eq.nbg0) return
      nsend=i0*ibir
      call mpi_allgather(rinv(1,1,nbg0),nsend,mpi_real8,rp,nsend,mpi_real8,m_comm_lat,ierr)
      do 504 ny=1,ngy0
      ngt=(ny-1)*ibir*i0
      do 504 j=1,i0
      nt=ngt+(j-1)*ibir
      do 504 i=1,ibir
      it=i+(ny-1)*ibir
 504  rtemp(it,j)=rp(nt+i)

      it=ibir*mylat
      do 300 i=1,ibir
      do 300 j=1,i0
      rinv1(i,j,nbg)=0.d0
      do 300 k=1,i2t
 300  rinv1(i,j,nbg)=rinv1(i,j,nbg)-rtp(it+i,k)*rtemp(k,j)
      jl=jh

 100  call mpi_barrier(mpi_comm_world,ierr)

end subroutine

! ----------------------------------------------------------------------
subroutine pre2(ax,ay,bb,cx,cy,rinv,rinv1,hh,ie)
! ----------------------------------------------------------------------
      real*8 rinv,rinv1,h,run,rtp,rtemp,rp
      dimension ax(i2,j2),ay(i2,j2),bb(i2,j2),cx(i2,j2),cy(i2,0:j2),rinv(ibir,i0,nbg0),rinv1(ibir,i0,nbg1),hh(i0,j0),ie(nb0),rp(ig0*ig0),rtemp(ig2,ig0),rtp(ig2,ig2),ipvt(ig2)
      dimension axt(i2,j2),ayt(i2,j2),bbt(i2,j2),cxt(i2,j2),cyt(i2,j2),ct(i2)

!      if (myid .eq. 0)
      do 100 ng=1,ngy0
      jl=1
      if (mylat .eq. ng-1) then
      do 99 j=1,j2
      do 99 i=1,i2
      axt(i,j)=ax(i,j)
      ayt(i,j)=ay(i,j)
      bbt(i,j)=bb(i,j)
      cxt(i,j)=cx(i,j)
 99   cyt(i,j)=cy(i,j)
      endif
      if (mylat .eq. ng-2) then
      do 98 i=1,i2
 98   ct(i)=cy(i,j2)
      endif
      nsd=i2*j2
      call mpi_bcast(axt,nsd,mpi_real8,ng-1,m_comm_lat,ierr)
      call mpi_bcast(ayt,nsd,mpi_real8,ng-1,m_comm_lat,ierr)
      call mpi_bcast(bbt,nsd,mpi_real8,ng-1,m_comm_lat,ierr)
      call mpi_bcast(cxt,nsd,mpi_real8,ng-1,m_comm_lat,ierr)
      call mpi_bcast(cyt,nsd,mpi_real8,ng-1,m_comm_lat,ierr)
      if (ng .ne. 1) call mpi_bcast(ct,i2,mpi_real8,ng-2,m_comm_lat,ierr)

      if (mylat .eq. ng-1) then
      do 97 i=1,i2
 97   cy(i,0)=ct(i)
      endif
      do 100 nb=1,nb0
      nbg=(ng-1)*nb0+nb
      write(*,111) nbg,nbg0
 111  format ('processing block #',i3,' out of ',i3,' total evp solver')
      jh=ie(nb)
      jhp=jh+1
      jhm=jh-2
      jg=jl+1
      do 250 ii=1,ibir
      ig=mylat*ibir+ii
      idxy=(ig-1)/i2
      do 210 j=jl,jhp
      do 210 i=1,i0
 210  hh(i,j)=0.d0
      if (idxy .eq. mylon) then
      if (mod(ig,i2) .eq. 0) then
      hh(i1,jg)=1.d0
      else
      hh(mod(ig,i2)+1,jg)=1.d0
      endif
      endif
      call mpi_sendrecv(hh(2,jg),1,mpi_real8,m_w,1,hh(i0,jg),1,mpi_real8,m_e,1,mpi_comm_world,istat,ierr)
      call mpi_sendrecv(hh(i1,jg),1,mpi_real8,m_e,1,hh(1,jg),1,mpi_real8,m_w,1,mpi_comm_world,istat,ierr)
      if (nbg .eq. 1) go to 220
      if (idxy .eq. mylon) then
      if (nb .ne. 1) then
       if (mod(ig,i2) .eq. 0) then
       ctemp=cyt(i2,jg-2)
       else
       ctemp=cyt(mod(ig,i2),jg-2)
       endif
      else
       if (mod(ig,i2) .eq. 0) then
       ctemp=ct(i2)
       else
       ctemp=ct(mod(ig,i2))
       endif
      endif
      endif
      call mpi_bcast(ctemp,1,mpi_real8,idxy,m_comm_lon,ierr)
      do 218 n=1,i0
 218  hh(n,jl)=rinv1(ii,n,nbg-1)*ctemp
 220  continue
      do 226 j=jl,jhm
      do 225 i=1,i2
 225  hh(i+1,j+2)=-(axt(i,j)*hh(i,j+1)+ayt(i,j)*hh(i+1,j)+bbt(i,j)*hh(i+1,j+1)+cxt(i,j)*hh(i+2,j+1))/cyt(i,j)
      call mpi_sendrecv(hh(2,j+2),1,mpi_real8,m_w,1,hh(i0,j+2),1,mpi_real8,m_e,1,mpi_comm_world,istat,ierr)
 226  call mpi_sendrecv(hh(i1,j+2),1,mpi_real8,m_e,1,hh(1,j+2),1,mpi_real8,m_w,1,mpi_comm_world,istat,ierr)
      j=jh-1
      do 230 i=1,i2
 230  rinv(ii,i+1,nbg)=axt(i,j)*hh(i,j+1)+ayt(i,j)*hh(i+1,j)+bbt(i,j)*hh(i+1,j+1)+cxt(i,j)*hh(i+2,j+1)

      if (nbg.eq.nbg0) go to 250
      j=ie(nb)
      do 240 n=1,i0
 240  rinv(ii,n,nbg0)=hh(n,j)
      if (idxy .eq. mylon) then
      if (mod(ig,i2) .eq. 0) then
      hh(i1,jg)=0.d0
      else
      hh(mod(ig,i2)+1,jg)=0.d0
      endif
      endif
 250  continue

      nsend=i2*ibir

      call mpi_gather(rinv(1,2,nbg),nsend,mpi_real8,rp(1),nsend,mpi_real8,0,mpi_comm_world,ierr)
      if (myid .eq. 0) then
      do 497 nx=1,ngx0
      ngxt=(nx-1)*ngy0
      do 497 ny=1,ngy0
      ngt=((ny-1)+ngxt)*ibir*i2
      do 497 j=1,i2
      nt=ngt+(j-1)*ibir
      jt=j+(nx-1)*i2
      do 497 i=1,ibir
      it=i+(ny-1)*ibir
 497  rtemp(it,jt)=rp(nt+i)

      do 498 i=1,ig2
      do 498 j=1,ig2
 498  rtp(j,i)=0.d0
      do 499 i=1,ig2
 499  rtp(i,i)=1.d0
!      write(1233)rtemp
      call dgesv(ig2,ig2,rtemp,ig2,ipvt,rtp,ig2,info)
      do 500 i=1,ig2
      do 500 j=1,ig2
 500  rtemp(j,i)=rtp(i,j)
      endif

      call mpi_bcast(info,1,mpi_integer,0,mpi_comm_world,ierr)
      if (info .ne. 0) then
      print*,'preporcessor failed because rinv is singular at nbg =',nbg
      stop
      endif
      nsend=ig2*ig2
      call mpi_bcast(rtp,nsend,mpi_real8,0,mpi_comm_world,ierr)
      it=mylon*i2
      jt=mylat*ibir

      jss=1
      jff=i0
      if (mylon .eq.0) then
      do 501 i=1,ibir
 501  rinv(i,1,nbg)=rtp(jt+i,ig2)
      jss=2
      endif
      if (mylon .eq. ngx1) then
      do 502 i=1,ibir
 502  rinv(i,i0,nbg)=rtp(jt+i,1)
      jff=i1
      endif
      do 503 j=jss,jff
      do 503 i=1,ibir
 503  rinv(i,j,nbg)=rtp(jt+i,it+j-1)

      if (nbg.eq.nbg0) return
      nsend=i0*ibir
      call mpi_allgather(rinv(1,1,nbg0),nsend,mpi_real8,rp,nsend,mpi_real8,m_comm_lat,ierr)
      do 504 ny=1,ngy0
      ngt=(ny-1)*ibir*i0
      do 504 j=1,i0
      nt=ngt+(j-1)*ibir
      do 504 i=1,ibir
      it=i+(ny-1)*ibir
 504  rtemp(it,j)=rp(nt+i)

      it=ibir*mylat
      do 300 i=1,ibir
      do 300 j=1,i0
      rinv1(i,j,nbg)=0.d0
      do 300 k=1,ig2
 300  rinv1(i,j,nbg)=rinv1(i,j,nbg)-rtp(it+i,k)*rtemp(k,j)
      jl=jh

 100  call mpi_barrier(mpi_comm_world,ierr)

end subroutine

! ----------------------------------------------------------------------
subroutine sipinc(al,ab,ac,ar,at,cl,cb,cc,cr,ct,alpha)
! ----------------------------------------------------------------------
      dimension al(i2,j2),ar(i2,j2),ab(i2,j2),ac(i2,j2),at(i2,0:j2),cl(i2,j2),cr(i2,j2),cb(i2,j2),cc(i2,j2),ct(i2,j2),act(i2,j2)

      do 50 j=1,j2
      do 50 i=1,i2
 50   act(i,j)=ac(i,j)

      cl(1,1)=al(1,1)
      cb(1,1)=ab(1,1)
      cc(1,1)=1/ac(1,1)
      ct(1,1)=at(1,1)*cc(1,1)
      cr(1,1)=ar(1,1)*cc(1,1)
      do 100 i=2,i2
      cl(i,1)=al(i,1)
      cb(i,1)=ab(i,1)/(1+alpha*cr(i-1,1))
      cc(i,1)=1/(act(i,1)+alpha*(cb(i,1)*cr(i-1,1))-cb(i,1)*ct(i-1,1))
      ct(i,1)=at(i,1)*cc(i,1)
 100  cr(i,1)=(ar(i,1)-alpha*cb(i,1)*ar(i-1,1))*cc(i,1)

      do 200 j=2,j2
      cl(1,j)=al(1,j)/(1+alpha*ct(1,j-1))
      cb(1,j)=ab(1,j)
      cc(1,j)=1/(act(1,j)+alpha*(cl(1,j)*ct(1,j-1))-cl(1,j)*cr(1,j-1))
      ct(1,j)=(at(1,j)-alpha*cl(1,j)*ct(1,j-1))*cc(1,j)
      cr(1,j)=ar(1,j)*cc(1,j)
      do 200 i=2,i2
      cl(i,j)=al(i,j)/(1+alpha*ct(i,j-1))
      cb(i,j)=ab(i,j)/(1+alpha*cr(i-1,j))
      cc(i,j)=1/(act(i,j)+alpha*(cl(i,j)*ct(i,j-1)+cb(i,j)*cr(i-1,j))-cl(i,j)*cr(i,j-1)-cb(i,j)*ct(i-1,j))
      ct(i,j)=(at(i,j)-alpha*cl(i,j)*ct(i,j-1))*cc(i,j)
 200  cr(i,j)=(ar(i,j)-alpha*cb(i,j)*cr(i-1,j))*cc(i,j)
end subroutine

! ----------------------------------------------------------------------
subroutine cholinc(al,ab,ac,ar,at,cl,cb,cc,cr,ct)
! ----------------------------------------------------------------------
      dimension al(i2,j2),ar(i2,j2),ab(i2,j2),ac(i2,j2),at(i2,0:j2),cl(i2,j2),cr(i2,j2),cb(i2,j2),cc(i2,j2),ct(i2,j2),act(i2,j2)

      do 50 j=1,j2
      do 50 i=1,i2
 50   act(i,j)=ac(i,j)

      do 100 j=1,j0-3
      do 150 i=1,i0-3
      cc(i,j)=1/sqrt(act(i,j))
      cr(i,j)=ar(i,j)*cc(i,j)
      cl(i,j)=cr(i,j)
      ct(i,j)=at(i,j)*cc(i,j)
      cb(i,j)=ct(i,j)
      act(i+1,j)=act(i+1,j)-ar(i,j)*ar(i,j)*cc(i,j)*cc(i,j)
 150  act(i,j+1)=act(i,j+1)-at(i,j)*at(i,j)*cc(i,j)*cc(i,j)
      cc(i2,j)=1/sqrt(act(i2,j))
      ct(i2,j)=at(i2,j)*cc(i2,j)
      cb(i2,j)=ct(i2,j)
 100  act(i2,j+1)=act(i2,j+1)-at(i2,j)*at(i2,j)*cc(i2,j)*cc(i2,j)

      j=j2
      do 200 i=1,i3
      cc(i,j)=1/sqrt(act(i,j))
      cr(i,j)=ar(i,j)*cc(i,j)
      cl(i,j)=cr(i,j)
 200  act(i+1,j)=act(i+1,j)-ar(i,j)*ar(i,j)*cc(i,j)*cc(i,j)

      cc(i2,j2)=1/sqrt(ac(i2,j2))


end subroutine

! ----------------------------------------------------------------------
subroutine luinc(al,ab,ac,ar,at,cl,cb,cc,cr,ct)
! ----------------------------------------------------------------------
      dimension al(i2,j2),ar(i2,j2),ab(i2,j2),ac(i2,j2),at(i2,0:j2),cl(i2,j2),cr(i2,j2),cb(i2,j2),cc(i2,j2),ct(i2,j2),act(i2,j2)

      do 50 j=1,j2
      do 50 i=1,i2
 50   act(i,j)=ac(i,j)

      do 100 j=1,j0-3
      do 150 i=1,i0-3
      cc(i,j)=1/act(i,j)
      cl(i,j)=al(i,j)*cc(i,j)
      cr(i,j)=ar(i,j)
      cb(i,j)=ab(i,j)*cc(i,j)
      ct(i,j)=at(i,j)
      act(i+1,j)=act(i+1,j)-ar(i,j)*ar(i,j)*cc(i,j)
 150  act(i,j+1)=act(i,j+1)-at(i,j)*at(i,j)*cc(i,j)
      cc(i2,j)=1/act(i2,j)
      cb(i2,j)=ab(i2,j)*cc(i2,j)
      ct(i2,j)=at(i2,j)
 100  act(i2,j+1)=act(i2,j+1)-at(i2,j)*at(i2,j)*cc(i2,j)
      j=j2
      do 200 i=1,i3
      cc(i,j)=1/act(i,j)
      cl(i,j)=al(i,j)*cc(i,j)
      cr(i,j)=ar(i,j)
 200  act(i+1,j)=act(i+1,j)-ar(i,j)*ar(i,j)*cc(i,j)

      cc(i2,j2)=1/ac(i2,j2)
end subroutine

! ---------------------------------------------------------------------
subroutine bounds
! ----------------------------------------------------------------------
      real*8 mpd,sltd,pisd,p01,p02,sb8,rb8,dg
      dimension ttemp(i0,j0,k1),stemp(i0,j0,k1)

      call mpi_type_vector(k1*j0,1,i0,mpi_real8,m_vlon,ierr) !dog
      call mpi_type_vector(k1,i0,i0*j0,mpi_real8,m_vlat,ierr)
      call mpi_type_commit(m_vlon,ierr)
      call mpi_type_commit(m_vlat,ierr)
      
      call rdnc_levitus(1)   !dog
!      read(70) s1,t1


      do 32 n=1,50

      write(*,20) n
 20   format('iteration #',i3)


      do 31 k=1,k1
      smin=100.
      smax=0.
      tmin=100.
      tmax=0.
      do 30 j=2,j1
      do 30 i=2,i1
      m=in(i-1,j,k)+in(i+1,j,k)+in(i,j-1,k)+in(i,j+1,k)
      if (m*in(i,j,k).eq.0) go to 30
      tmp=1./m
      ttemp(i,j,k)=tmp*(in(i+1,j,k)*t1(i+1,j,k)+in(i-1,j,k)*t1(i-1,j,k)+in(i,j+1,k)*t1(i,j+1,k)+in(i,j-1,k)*t1(i,j-1,k))
      stemp(i,j,k)=tmp*(in(i+1,j,k)*s1(i+1,j,k)+in(i-1,j,k)*s1(i-1,j,k)+in(i,j+1,k)*s1(i,j+1,k)+in(i,j-1,k)*s1(i,j-1,k))
      smin=min(smin,stemp(i,j,k))
      smax=max(smax,stemp(i,j,k))
      tmin=min(tmin,ttemp(i,j,k))
      tmax=max(tmax,ttemp(i,j,k))
 30   continue
 31   continue
      do 33 k=1,k1
      do 33 j=2,j1
      do 33 i=2,i1
      t1(i,j,k)=ttemp(i,j,k)
      s1(i,j,k)=stemp(i,j,k)
 33   continue      
      call mpi_sendrecv(s1(2,1,1),1,m_vlon,m_w,1,s1(i0,1,1),1,m_vlon,m_e,1,mpi_comm_world,istat,ierr)
      call mpi_sendrecv(s1(i1,1,1),1,m_vlon,m_e,1,s1(1,1,1),1,m_vlon,m_w,1,mpi_comm_world,istat,ierr)
      call mpi_sendrecv(s1(1,2,1),1,m_vlat,m_s,1,s1(1,j0,1),1,m_vlat,m_n,1,mpi_comm_world,istat,ierr)
      call mpi_sendrecv(s1(1,j1,1),1,m_vlat,m_n,1,s1(1,1,1),1,m_vlat,m_s,1,mpi_comm_world,istat,ierr)

      call mpi_sendrecv(t1(2,1,1),1,m_vlon,m_w,1,t1(i0,1,1),1,m_vlon,m_e,1,mpi_comm_world,istat,ierr)
      call mpi_sendrecv(t1(i1,1,1),1,m_vlon,m_e,1,t1(1,1,1),1,m_vlon,m_w,1,mpi_comm_world,istat,ierr)
      call mpi_sendrecv(t1(1,2,1),1,m_vlat,m_s,1,t1(1,j0,1),1,m_vlat,m_n,1,mpi_comm_world,istat,ierr)
      call mpi_sendrecv(t1(1,j1,1),1,m_vlat,m_n,1,t1(1,1,1),1,m_vlat,m_s,1,mpi_comm_world,istat,ierr)
      call mpi_barrier(mpi_comm_world,ierr)
 32   continue
! levitus initial conditions have been modified
! now, we check for statically unstable points that may exist
 50   do 55 k=1,k1
      do 55 j=2,j1
      do 55 i=2,i1
      tmpd=t1(i,j,k)
      sltd=s1(i,j,k)
      pisd=.001*z(2*k)
! dan wright's full e.o.s.
!     rho(i,j,k)=r(tmp,slt,pis)
!     function r(t,s,p)
      p02=1747.4508988+tmpd*(11.51588-0.046331033*tmpd)-sltd*(3.85429655+0.01353985*tmpd)
      p01=pisd+5884.81703666+tmpd*(39.803732+tmpd*(-0.3191477+tmpd*0.0004291133))+2.6126277*sltd
 55   d1(i,j,k)=p01/(p02+0.7028423*p01)

      do 57 k=2,k1
      n=0
      do 56 j=2,j1
      do 56 i=2,i1
      if (in(i,j,k).eq.0.or.d1(i,j,k).ge.d1(i,j,k-1)) go to 56
      n=n+1
      t1(i,j,k)=t1(i,j,k-1)
      s1(i,j,k)=s1(i,j,k-1)
      tmpd=t1(i,j,k)
      sltd=s1(i,j,k)
      pisd=.001*z(2*k)
      p02=1747.4508988+tmpd*(11.51588-0.046331033*tmpd)-sltd*(3.85429655+0.01353985*tmpd)
      p01=pisd+5884.81703666+tmpd*(39.803732+tmpd*(-0.3191477+tmpd*0.0004291133))+2.6126277*sltd
      d1(i,j,k)=p01/(p02+0.7028423*p01)
 56   continue
 57   write(*,58) n,k
 58   format(i6,' unstable points at level',i3)

! periodic
! remark that there doesn't not exchange the b.c. the b! will be exchange in fsglo

! write climatology based initial conditions
! climatology is modified in prep program

! wenien
!      open(69,file='data/initial'//grd,form='unformatted')
!      write(69) s1,t1
!      close(69)
      call wr8nc_preini  !dog

! 199  rewind 70

!      if (.false.) then
! seasonal boundary conditions


      do 7000 nm=1,12
      write(*,238) nm
 238  format('month',i3,' in bounds')

! read in monthly t,s boundary climatologies
      call rdnc_levitus(nm) !dog
!      read(70) s1,t1

      smin=100.
      smax=0.
      tmin=100.
      tmax=0.

      do 2400 k=1,k1
      do 2400 j=2,j1
      do 2400 i=2,i1
      s1(i,j,k)=min(max(s1(i,j,k),smax),smin)
 2400 t1(i,j,k)=min(max(t1(i,j,k),tmax),tmin)

      do 240 j=2,j1
      do 240 i=2,i1
      tsurf(i-1,j-1,nm)=t1(i,j,1)
 240  ssurf(i-1,j-1,nm)=s1(i,j,1)


      do 260 k=1,k1
      avg1=0.
      avg2=0.
      areaxy=0.
      smax=0.
      smin=100.
      do 250 j=2,j1
      tmp=dx(j)*dy(j)

      do 250 i=2,i1
      temp=s1(i,j,k)
      s1(i,j,k)=max(s1(i,j,k),25.)
      if (in(i,j,k).eq.0) go to 250
      smax=max(smax,s1(i,j,k))
      smin=min(smin,s1(i,j,k))

      if (s1(i,j,k).eq.25.) write(*,29) i,j,k,temp,s1(i,j,k)
 29   format('fixed bad point i,j,k,s1bad,s1fix=',3i5,2f5.1)

      areaxy=areaxy+tmp
      avg1=avg1+tmp*t1(i,j,k)
      avg2=avg2+tmp*s1(i,j,k)
 250  continue

      tp=avg1
      call mpi_allreduce(tp,avg1,1,mpi_real8,mpi_sum,mpi_comm_world,ierr)
      tp=avg2
      call mpi_allreduce(tp,avg2,1,mpi_real8,mpi_sum,mpi_comm_world,ierr)
      tp=areaxy
      call mpi_allreduce(tp,areaxy,1,mpi_real8,mpi_sum,mpi_comm_world,ierr)


      write(*,251) nm,k,smin,smax,avg2/areaxy
 251  format('nm,k,smin,smax,savg=',2i3,1x,3f5.1)

!      if(areaxy.eq.0.) print*,mylon,'_',mylat,'k=',k,'areaxy=',areaxy

      txycli(k,nm)=avg1/areaxy
 260  sxycli(k,nm)=avg2/areaxy

      write(*,261) nm,(sxycli(k,nm),k=1,k1)
 261  format(i2/(21f5.1))

! sponge layer climatology
! k=1 is included in ssurf, tssurf
! le
! generally, j0 will not less than 10, so there requires to fix tssp etc.,
! if j0 is less than 10.
      if (mylat .eq. 0) then
!      do 270 k=1,k1
!      do 270 j=1,j2t/18
      do 270 k=2,k1
      do 270 j=1,10
      do 270 i=2,i1
!      tssp(i-1,j,k,nm)=t1(i,j+1,k)
! 270  sssp(i-1,j,k,nm)=s1(i,j+1,k)
      tssp(i-1,j,k-1,nm)=t1(i,j+1,k)
 270  sssp(i-1,j,k-1,nm)=s1(i,j+1,k) 
      endif

      if (mylat .eq. ngy0-1) then
!      do 280 k=1,k1
!      do 280 j=1,j2t/18
      do 280 k=2,k1
      do 280 j=1,10
      do 280 i=2,i1
!      tnsp(i-1,j,k,nm)=t1(i,j0-j,k)
! 280  snsp(i-1,j,k,nm)=s1(i,j0-j,k)
      tnsp(i-1,j,k-1,nm)=t1(i,j0-j,k)
 280  snsp(i-1,j,k-1,nm)=s1(i,j0-j,k)
      endif

 7000 continue


! although the following is superfluous when using seasonal climatology,
! (because the model uses linear interpolations anyway),
! we will need 12-month arrays when we use the monthly climatology

! interpolate tsurf, ssurf in time
      tmp=1./3.
      tem=2./3.
      do 600 n=1,10,3
      nm=n+3
      if (nm.eq.13) nm=1
      do 600 j=1,j2
      do 600 i=1,i2
      tsurf(i,j,n+1)=tsurf(i,j,n)+tmp*(tsurf(i,j,nm)-tsurf(i,j,n))
      tsurf(i,j,n+2)=tsurf(i,j,n)+tem*(tsurf(i,j,nm)-tsurf(i,j,n))
      ssurf(i,j,n+1)=ssurf(i,j,n)+tmp*(ssurf(i,j,nm)-ssurf(i,j,n))
 600  ssurf(i,j,n+2)=ssurf(i,j,n)+tem*(ssurf(i,j,nm)-ssurf(i,j,n))

! interpolate seasonal sponge climatologies
      do 650 n=1,10,3
      nm=n+3
      if (nm.eq.13) nm=1
      do 648 k=1,k1
      txycli(k,n+1)=txycli(k,n)+tmp*(txycli(k,nm)-txycli(k,n))
      txycli(k,n+2)=txycli(k,n)+tem*(txycli(k,nm)-txycli(k,n))
      sxycli(k,n+1)=sxycli(k,n)+tmp*(sxycli(k,nm)-sxycli(k,n))
 648  sxycli(k,n+2)=sxycli(k,n)+tem*(sxycli(k,nm)-sxycli(k,n))
!      do 650 k=1,k1
!      do 650 j=1,j2t/18
      do 650 k=1,k2
      do 650 j=1,10
      do 650 i=1,i2
      tssp(i,j,k,n+1)=tssp(i,j,k,n)+tmp*(tssp(i,j,k,nm)-tssp(i,j,k,n))
      tssp(i,j,k,n+2)=tssp(i,j,k,n)+tem*(tssp(i,j,k,nm)-tssp(i,j,k,n))
      tnsp(i,j,k,n+1)=tnsp(i,j,k,n)+tmp*(tnsp(i,j,k,nm)-tnsp(i,j,k,n))
      tnsp(i,j,k,n+2)=tnsp(i,j,k,n)+tem*(tnsp(i,j,k,nm)-tnsp(i,j,k,n))
      sssp(i,j,k,n+1)=sssp(i,j,k,n)+tmp*(sssp(i,j,k,nm)-sssp(i,j,k,n))
      sssp(i,j,k,n+2)=sssp(i,j,k,n)+tem*(sssp(i,j,k,nm)-sssp(i,j,k,n))
      snsp(i,j,k,n+1)=snsp(i,j,k,n)+tmp*(snsp(i,j,k,nm)-snsp(i,j,k,n))
 650  snsp(i,j,k,n+2)=snsp(i,j,k,n)+tem*(snsp(i,j,k,nm)-snsp(i,j,k,n))

! write surface climatology t,s and specified inflow velocities
!      write(62) ssurf,tsurf,sssp,snsp,tssp,tnsp
!      write(62) sxycli,txycli
      call wr8nc_boundaries !dog
end subroutine
! ----------------------------------------------------------------------

subroutine initfs
! initfs initializes all controlling arrays and derived scalars
!(scalar control parameters are set in block data at start of this file)
! ----------------------------------------------------------------------

      dt=172800./daodt
      odt=1./dt
      orzmx=1./rzmx
      ofltw=1.-2.*fltw

      mvi=mvfreq*daodt
      prn=dm0/de0

! ====================================================
! set background vertical eddy viscosity & diffusivity
! ====================================================
      do 90 k=1,k2
! augment molecular viscosity & diffusivity by parameterized synopti! wind
! events, and by breaking (u,v,t,s, near surface only) and non-breaking
! (u,v only, at all rmetss) internal waves.
! synopti! wind forced mixing having 20m e-folding scale.
! bigger momentum mixing due to pressure-xfers
! associated with internal waves that have no counterpart in t,s xfers.
! after yr 7
! 10m scale height for t,s mixing due to breaking internal waves
       tmpts=exp(-.001*(z(2*k+1)-z(3)))
!
! deeper tmpuv enhancement is motivated by findings of hurlburt & hogan
! that deep bathymetry and deep transient eddies influences gs path.
! tmpts is not enhanced (layer model has none across layer interface!)
! 1000m scale height for u,v mixing (due to pressure-xfers even without
! internal wave breaking). this enhances deep bathymetry effe!cts on
! upper level flow (e.g., gs separation, kuroshio meanders)
       tmpuv=exp(-.00001*(z(2*k+1)-z(3)))
      vbk(k)=.01+.05*tmpuv
 90   hbk(k)=.002+.02*tmpts
!      write(8) vbk,hbk
!      close(8)
      call wr8nc_winmx    !dog

      if(myid.eq.0)then
      write(*,91) (k,int(.01*z(2*k+1)),vbk(k),hbk(k),k=1,k2)
!      write(7,91) (k,int(.01*z(2*k+1)),vbk(k),hbk(k),k=1,k2)
 91   format(' K    Z    VBK    HBK'/(i2,i5,2f7.3))
      endif

! wenien
!      write(9) case,dscrib,dt,tlz,b,g,dm0,de0,dmz0,f,tanphi,rzmx,drag,fltw,daodt,odt,prn,orzmx,ofltw,y,yv,yvdeg,ydeg,cs,csv,ocs,ocsv,dx,dxv,odx,odxv,dy,dyv,ody,odyv,ktrm,lrstrt,mxit,isav,mxsav,lopen,lmovi,mvi,lfsrf,lsolver,xdeg,lprecon,rawf

!      close(9)
      call wr8nc_rundata !dog
      call mpi_barrier(mpi_comm_world,ierr)

      call bounds

      if (lsolver.eq.0) then
      print*,'preprocessor running without solver setting has finished.'
      stop 0
      endif

      do 250 n=1,nb0
 250  ie(n)=min(1+n0*n,j1)
!      write(*,251) ie
! 251  format('ie'/(20i4))
      if (ie(nb0).gt.ie(nb1).and.j1.lt.ie(nb1)+9) go to 260
!      write(17,252) ie(nb1),j1
      write(*,252) ie(nb1),j1
 252  format('ie(nb1),j1=',2i5,' not properly defined. Fix above do 250 loop and restart.')

 260  ie(nb0)=j1


! preprocessor for ellipti! solver used to maintain
! incompressibility for rigid-lid hydrostati! flows
! first, do top layer (all water to regularize evp domain)
      tmp=1./odz(1)
      do 280 j=1,j2
      dzx=odx(j+1)**2*tmp
      dzyb=csv(j)*ocs(j+1)*odyv(j)*ody(j+1)*tmp
      dzyt=csv(j+1)*ocs(j+1)*odyv(j+1)*ody(j+1)*tmp
      do 280 i=1,i2
      al(i,j)=dzx
      ar(i,j)=dzx
      ab(i,j)=dzyb
 280  at(i,j)=dzyt
! remaining layers
      do 282 k=2,k1
      tmp=1./odz(k)
      do 282 j=1,j2
      dzx=odx(j+1)**2*tmp
      dzyb=csv(j)*ocs(j+1)*odyv(j)*ody(j+1)*tmp
      dzyt=csv(j+1)*ocs(j+1)*odyv(j+1)*ody(j+1)*tmp
      do 282 i=1,i2
      al(i,j)=al(i,j)+dzx*iu(i,j+1,k)
      ar(i,j)=ar(i,j)+dzx*iu(i+1,j+1,k)
      ab(i,j)=ab(i,j)+dzyb*iv(i+1,j,k)
 282  at(i,j)=at(i,j)+dzyt*iv(i+1,j+1,k)

      if (mylat .eq. 0) then
      do 285 i=1,i2
 285  ab(i,1)=0.
      endif
      if (mylat .eq. ngy1) then
      do 286 i=1,i2
 286  at(i,j2)=0.
      endif

      gamma_tmp=0.
      if (lfsrf .eq. 1) gamma_tmp=1./(0.5*dt**2)
      do 287 j=1,j2
      do 287 i=1,i2
      al(i,j)=-al(i,j)
      ar(i,j)=-ar(i,j)
      ab(i,j)=-ab(i,j)
      at(i,j)=-at(i,j)
 287  ac(i,j)=(-al(i,j)-ar(i,j)-ab(i,j)-at(i,j))+gamma_tmp

      call mpi_barrier(mpi_comm_world,ierr)

      if(lsolver .eq.1) then
        if(myid.eq.0) print*,'enter evp preprocessor',myid
        call pre(al,ab,ac,ar,at,rinv,rinv1,hh,ie)
!        write(99) al,ar,ab,at,ac,rinv,rinv1,ie
!        close(99)
        call wr8nc_evp1 !dog
        if(myid.eq.0) print*,'finished evp preprocessor',myid
      elseif(lsolver .eq.2) then
        if(myid.eq.0) print*,'enter preconditioner',myid
        if(lprecon .le. 1) then
          if(myid.eq.0) print*,'sip precondition'
          alpha=.5d0
	  call sipinc(al,ab,ac,ar,at,cl,cb,cc,cr,ct,alpha)
        elseif(lprecon .eq. 2) then
          if(myid.eq.0) print*,'lu precondition'
          call luinc(al,ab,ac,ar,at,cl,cb,cc,cr,ct)
        elseif(lprecon .eq. 3) then
          if(myid.eq.0) print*,'chol precondition'
          call cholinc(al,ab,ac,ar,at,cl,cb,cc,cr,ct)
        else
          if(myid.eq.0) print*,'lprecon=',lprecon,' err'
          stop 0
        endif
!	write(99) al,ar,ab,at,ac,cl,cb,cc,cr,ct
!        close(99)
        call wr8nc_evp2 !dog
      endif    
  
      print*,'finished preconditioner',myid

end subroutine

subroutine wr8nc_evp1
use const, only: i2t,j2t,i0t,ibir,ngy0,nbg0,nbg1,nb0
use comm,  only: myid,mylon,mylat,m_cart
implicit none
!declare pnetcdf var
character :: fn*11,desp*30
integer :: ierr,ncid,nt(3),nd(2),ns(1)
integer :: i2id,j2id,i0id,ibid,ibg0,ibg1,j2idd,inb0
integer :: ial,iar,iab,iac,iat,irin,irin1,ieid
integer(kind=mpi_offset_kind) :: dim_nn(7),leng
integer(kind=mpi_offset_kind) :: ns_ijk(3),nc_ijk(3),ns_ij(2),nc_ij(2),ns_i,nc_i
      !derive the size of each mpiid task,320,288

      !output file name
      fn = 'data/evp.nc'
      !create ncfile and id
      ierr=nfmpi_create(m_cart,fn,nf_64bit_offset,mpi_info_null,ncid)
      !define dimension and assign dimID
      dim_nn(1) = i2*ngx0
      dim_nn(2) = j2*ngy0
      dim_nn(3) = i0*ngx0
      dim_nn(4) = ibir*ngy0
      dim_nn(5) = nbg0
      dim_nn(6) = nbg1
      dim_nn(7) = nb0
      ierr=nfmpi_def_dim(ncid,"i2_global",dim_nn(1),i2id)
      ierr=nfmpi_def_dim(ncid,"j2_global",dim_nn(2),j2id)
      ierr=nfmpi_def_dim(ncid,"i0_global",dim_nn(3),i0id)
      ierr=nfmpi_def_dim(ncid,"j2+1_global",dim_nn(2)+ngy0,j2idd)
      ierr=nfmpi_def_dim(ncid,"ibir_global",dim_nn(4),ibid)
      ierr=nfmpi_def_dim(ncid,"nbg0",dim_nn(5),ibg0)
      ierr=nfmpi_def_dim(ncid,"nbg1",dim_nn(6),ibg1)
      ierr=nfmpi_def_dim(ncid,"nb0",dim_nn(7),inb0)

      !define variables and assign varID
      nd(1) = j2id
      nd(2) = i2id
      ierr=nfmpi_def_var(ncid,"al",nf_double,2,nd,ial)
      ierr=nfmpi_def_var(ncid,"ar",nf_double,2,nd,iar)
      ierr=nfmpi_def_var(ncid,"ab",nf_double,2,nd,iab)
      ierr=nfmpi_def_var(ncid,"ac",nf_double,2,nd,iac)

      nd(1) = i2id
      nd(2) = j2idd
      ierr=nfmpi_def_var(ncid,"at",nf_double,2,nd,iat)

      nt(1) = ibid
      nt(2) = i0id
      nt(3) = ibg0
      ierr=nfmpi_def_var(ncid,"rinv",nf_double,3,nt,irin)

      nt(1) = ibid
      nt(2) = i0id
      nt(3) = ibg1
      ierr=nfmpi_def_var(ncid,"rinv1",nf_double,3,nt,irin1)

      ns(1) = inb0
      ierr=nfmpi_def_var(ncid,"ie",nf_int,1,ns,ieid)

      desp='input files for lsolver = 1'
      leng=len(trim(desp))
      ierr=nfmpi_put_att_text(ncid,NF_GLOBAL,'desp',leng,trim(desp))
      ierr=nfmpi_enddef(ncid)

      !put variables
      ns_ij(1) = mylon*i2+1
      ns_ij(2) = mylat*j2+1
      nc_ij(1) = i2
      nc_ij(2) = j2
      ierr=nfmpi_put_vara_double_all(ncid,ial,ns_ij,nc_ij,al)
      ierr=nfmpi_put_vara_double_all(ncid,iar,ns_ij,nc_ij,ar)
      ierr=nfmpi_put_vara_double_all(ncid,iab,ns_ij,nc_ij,ab)
      ierr=nfmpi_put_vara_double_all(ncid,iac,ns_ij,nc_ij,ac)
      ns_ij(1) = mylon*j2+1
      ns_ij(2) = mylat*(j2+1)+1
      nc_ij(1) = i2
      nc_ij(2) = j2+1
      ierr=nfmpi_put_vara_double_all(ncid,iat,ns_ij,nc_ij,at)

      ns_ijk(1) = mylat*ibir+1
      ns_ijk(2) = mylon*i0+1
      ns_ijk(3) = 1
      nc_ijk(1) = ibir
      nc_ijk(2) = i0
      nc_ijk(3) = nbg0
      ierr=nfmpi_put_vara_double_all(ncid,irin,ns_ijk,nc_ijk,rinv)
      ns_ijk(1) = mylat*ibir+1
      ns_ijk(2) = mylon*i0+1
      ns_ijk(3) = 1
      nc_ijk(1) = ibir
      nc_ijk(2) = i0
      nc_ijk(3) = nbg1
      ierr=nfmpi_put_vara_double_all(ncid,irin1,ns_ijk,nc_ijk,rinv1)

      ns_i = 1
      nc_i = nb0
      ierr=nfmpi_put_vara_int_all(ncid,ieid,ns_i,nc_i,ie)
      ierr=nfmpi_close(ncid)
end subroutine wr8nc_evp1

subroutine wr8nc_evp2
use const, only: i2,j2,ngy0,ngx0
use comm,  only: myid,mylon,mylat,m_cart
use var,   only: grd
implicit none
!declare pnetcdf var
character :: fn*11,desp*120
integer :: ierr,ncid,nd(2)
integer :: i2id,j2id,j2idd
integer :: ial,iar,iab,iac,iat,icl,icb,icc,icr,ict
integer(kind=mpi_offset_kind) :: dim_nn(3),leng
integer(kind=mpi_offset_kind) :: ns_ij(2),nc_ij(2)
      !derive the size of each mpiid task

      !output file name
      fn = 'data/evp.nc'
      !create ncfile and id
      ierr=nfmpi_create(m_cart,fn,nf_64bit_offset,mpi_info_null,ncid)
      !define dimension and assign dimID
      dim_nn(1) = i2*ngx0
      dim_nn(2) = j2*ngy0
      dim_nn(3) = (j2+1)*ngy0
      ierr=nfmpi_def_dim(ncid,"i2_global",dim_nn(1),i2id)
      ierr=nfmpi_def_dim(ncid,"j2_global",dim_nn(2),j2id)
      ierr=nfmpi_def_dim(ncid,"j2+1_global",dim_nn(3),j2idd)
      !define variables and assign varID
      nd(1) = i2id
      nd(2) = j2id
      ierr=nfmpi_def_var(ncid,"al",nf_double,2,nd,ial)
      ierr=nfmpi_def_var(ncid,"ar",nf_double,2,nd,iar)
      ierr=nfmpi_def_var(ncid,"ab",nf_double,2,nd,iab)
      ierr=nfmpi_def_var(ncid,"ac",nf_double,2,nd,iac)

      nd(2) = j2idd
      ierr=nfmpi_def_var(ncid,"at",nf_double,2,nd,iat)

      nd(2) = j2id
      ierr=nfmpi_def_var(ncid,"cl",nf_double,2,nd,icl)
      ierr=nfmpi_def_var(ncid,"cb",nf_double,2,nd,icb)
      ierr=nfmpi_def_var(ncid,"cc",nf_double,2,nd,icc)
      ierr=nfmpi_def_var(ncid,"cr",nf_double,2,nd,icr)
      ierr=nfmpi_def_var(ncid,"ct",nf_double,2,nd,ict)

      desp='input files for lsolver = 2, note that the global domain &
            is decomposed into ngx0*ngy0 subdomains'
      leng=len(trim(desp))
      ierr=nfmpi_put_att_text(ncid,NF_GLOBAL,'desp',leng,trim(desp))
      ierr=nfmpi_enddef(ncid)

      !put variables
      ns_ij(1) = mylon*i2+1
      ns_ij(2) = mylat*j2+1
      nc_ij(1) = i2
      nc_ij(2) = j2
      ierr=nfmpi_put_vara_double_all(ncid,ial,ns_ij,nc_ij,al)
      ierr=nfmpi_put_vara_double_all(ncid,iar,ns_ij,nc_ij,ar)
      ierr=nfmpi_put_vara_double_all(ncid,iab,ns_ij,nc_ij,ab)
      ierr=nfmpi_put_vara_double_all(ncid,iac,ns_ij,nc_ij,ac)
      ns_ij(1) = mylon*i2+1
      ns_ij(2) = mylat*(j2+1)+1
      nc_ij(1) = i2
      nc_ij(2) = j2+1
      ierr=nfmpi_put_vara_double_all(ncid,iat,ns_ij,nc_ij,at)

      ns_ij(1) = mylon*i2+1
      ns_ij(2) = mylat*j2+1
      nc_ij(1) = i2
      nc_ij(2) = j2
      ierr=nfmpi_put_vara_double_all(ncid,icl,ns_ij,nc_ij,cl)
      ierr=nfmpi_put_vara_double_all(ncid,icb,ns_ij,nc_ij,cb)
      ierr=nfmpi_put_vara_double_all(ncid,icc,ns_ij,nc_ij,cc)
      ierr=nfmpi_put_vara_double_all(ncid,icr,ns_ij,nc_ij,cr)
      ierr=nfmpi_put_vara_double_all(ncid,ict,ns_ij,nc_ij,ct)

      ierr=nfmpi_close(ncid)
end subroutine wr8nc_evp2

subroutine wr8nc_winmx
use const,  only: k2
use var,    only: z
use comm,  only: m_cart
implicit none

!declare pnetcdf var
character :: fn*15,desp*100
integer :: ierr,ncid,ns
integer :: k2id,i
integer :: ivbk,ihbk,idep
integer(kind=mpi_offset_kind) :: dim_nn(1),leng
integer(kind=mpi_offset_kind) :: sns,cns
integer :: dep(k2)
      !derive the size of each mpiid task
      sns = 1
      cns = k2

      do i = 1,k2
      dep(i) = int(.01*z(2*i+1))
      end do

      !output file name
      fn = 'data/windmix.nc'
      !create ncfile and id
      ierr=nfmpi_create(m_cart,fn,nf_64bit_offset,mpi_info_null,ncid)

      !define dimension and assign dimID
      dim_nn(1) = k2
      ierr=nfmpi_def_dim(ncid,"k2",dim_nn(1),k2id)

      !define variables and assign varID
      ns = k2id
      ierr=nfmpi_def_var(ncid,"depth",nf_int,1,ns,idep)
      ierr=nfmpi_def_var(ncid,"vbk",nf_double,1,ns,ivbk)
      ierr=nfmpi_def_var(ncid,"hbk",nf_double,1,ns,ihbk)

      desp='input files for vertical eddy viscosity and diffusivity '
      leng=len(trim(desp))
      ierr=nfmpi_put_att_text(ncid,NF_GLOBAL,'desp',leng,trim(desp))

      ierr=nfmpi_enddef(ncid)

      !put variables
      ierr=nfmpi_put_vara_int_all(ncid,idep,sns,cns,dep)
      ierr=nfmpi_put_vara_double_all(ncid,ivbk,sns,cns,vbk)
      ierr=nfmpi_put_vara_double_all(ncid,ihbk,sns,cns,hbk)

      ierr=nfmpi_close(ncid)
end subroutine wr8nc_winmx

subroutine wr8nc_rundata
use const, only: j2,j1,j0,i0,j2t,j1t,j0t,i0t,ngx0,ngy0
use comm,  only: myid,mylat,mylon,m_cart
implicit none

!declare pnetcdf var
character :: fn*15
integer :: ncid,ierr,ns
integer :: siid,i0id,j0id,j1id,j2id,cid,dsid
integer :: icase,idsp,idt,itlz,ib,ig,idm0,ide0,idmz0
integer :: irzmx,idrag,ifltw,idadt,iodt,iprn,iorz,ioflt,irawf
integer :: iktrm,irst,imxit,isv,imxsv,ilop,ilmov,imvi,ilfs,ilsol,ilpre
integer :: ixdeg,ifcol,iphi,icsv,iocs,idxv,iodx,idyv,iody,iydeg
integer :: iy,iyv,iyvd,ics,iocs2,idx,iodxx,idy,iodyy
integer(kind=mpi_offset_kind) :: dim_nn(5),leng
integer(kind=mpi_offset_kind) :: ns_i,nc_i
      !output file name
      fn = "data/rundata.nc"

      !create ncfile and id
      ierr=nfmpi_create(m_cart,fn,nf_64bit_offset,mpi_info_null,ncid)

      !define dimension and assign dimID
      dim_nn(1) = 1
      dim_nn(2) = i0*ngx0
      dim_nn(3) = j0*ngy0
      dim_nn(4) = j1*ngy0
      dim_nn(5) = j2*ngy0
      ierr=nfmpi_def_dim(ncid,"char_case",dim_nn(1)*5,cid)
      ierr=nfmpi_def_dim(ncid,"char_desp",dim_nn(1)*63,dsid)
      ierr=nfmpi_def_dim(ncid,"pt_val",dim_nn(1),siid)
      ierr=nfmpi_def_dim(ncid,"i0_global",dim_nn(2),i0id)
      ierr=nfmpi_def_dim(ncid,"j0_global",dim_nn(3),j0id)
      ierr=nfmpi_def_dim(ncid,"j1_global",dim_nn(4),j1id)
      ierr=nfmpi_def_dim(ncid,"j2_global",dim_nn(5),j2id)
      !define variables and assign varID
      ns = cid
      ierr=nfmpi_def_var(ncid,"case",nf_char,1,ns,icase)
      ns = dsid
      ierr=nfmpi_def_var(ncid,"describ",nf_char,1,ns,idsp)
      ns = siid
      ierr=nfmpi_def_var(ncid,"dt",nf_double,1,ns,idt)
      ierr=nfmpi_def_var(ncid,"tlz",nf_double,1,ns,itlz)
      ierr=nfmpi_def_var(ncid,"b",nf_double,1,ns,ib)
      ierr=nfmpi_def_var(ncid,"g",nf_double,1,ns,ig)
      ierr=nfmpi_def_var(ncid,"dm0",nf_double,1,ns,idm0)
      ierr=nfmpi_def_var(ncid,"de0",nf_double,1,ns,ide0)
      ierr=nfmpi_def_var(ncid,"dmz0",nf_double,1,ns,idmz0)
      ierr=nfmpi_def_var(ncid,"rzmx",nf_double,1,ns,irzmx)
      ierr=nfmpi_def_var(ncid,"drag",nf_double,1,ns,idrag)
      ierr=nfmpi_def_var(ncid,"fltw",nf_double,1,ns,ifltw)
      ierr=nfmpi_def_var(ncid,"daodt",nf_double,1,ns,idadt)
      ierr=nfmpi_def_var(ncid,"odt",nf_double,1,ns,iodt)
      ierr=nfmpi_def_var(ncid,"prn",nf_double,1,ns,iprn)
      ierr=nfmpi_def_var(ncid,"orzmx",nf_double,1,ns,iorz)
      ierr=nfmpi_def_var(ncid,"ofltw",nf_double,1,ns,ioflt)
      ierr=nfmpi_def_var(ncid,"rawf",nf_double,1,ns,irawf)
      ierr=nfmpi_def_var(ncid,"ktrm",nf_int,1,ns,iktrm)
      ierr=nfmpi_def_var(ncid,"lrstrt",nf_int,1,ns,irst)
      ierr=nfmpi_def_var(ncid,"mxit",nf_int,1,ns,imxit)
      ierr=nfmpi_def_var(ncid,"isav",nf_int,1,ns,isv)
      ierr=nfmpi_def_var(ncid,"mxsav",nf_int,1,ns,imxsv)
      ierr=nfmpi_def_var(ncid,"lopen",nf_int,1,ns,ilop)
      ierr=nfmpi_def_var(ncid,"lmovi",nf_int,1,ns,ilmov)
      ierr=nfmpi_def_var(ncid,"mvi",nf_int,1,ns,imvi)
      ierr=nfmpi_def_var(ncid,"lfsrf",nf_int,1,ns,ilfs)
      ierr=nfmpi_def_var(ncid,"lsolver",nf_int,1,ns,ilsol)
      ierr=nfmpi_def_var(ncid,"lprecon",nf_int,1,ns,ilpre)

      ns = j2id
      ierr=nfmpi_def_var(ncid,"f",nf_double,1,ns,ifcol)
      ierr=nfmpi_def_var(ncid,"tanphi",nf_double,1,ns,iphi)
      ns = j1id ! csv,ocsv,dxv,odxv,dyv,odyv
      ierr=nfmpi_def_var(ncid,"csv",nf_double,1,ns,icsv)
      ierr=nfmpi_def_var(ncid,"ocsv",nf_double,1,ns,iocs)
      ierr=nfmpi_def_var(ncid,"dxv",nf_double,1,ns,idxv)
      ierr=nfmpi_def_var(ncid,"odxv",nf_double,1,ns,iodx)
      ierr=nfmpi_def_var(ncid,"dyv",nf_double,1,ns,idyv)
      ierr=nfmpi_def_var(ncid,"odyv",nf_double,1,ns,iody)
      ns = j0id ! y,yv,yvdeg,cs,ocs,dx,odx,dy,ody
      ierr=nfmpi_def_var(ncid,"y",nf_double,1,ns,iy)
      ierr=nfmpi_def_var(ncid,"yv",nf_double,1,ns,iyv)
      ierr=nfmpi_def_var(ncid,"yvdeg",nf_double,1,ns,iyvd)
      ierr=nfmpi_def_var(ncid,"ydeg",nf_double,1,ns,iydeg)
      ierr=nfmpi_def_var(ncid,"cs",nf_double,1,ns,ics)
      ierr=nfmpi_def_var(ncid,"ocs",nf_double,1,ns,iocs2)
      ierr=nfmpi_def_var(ncid,"dx",nf_double,1,ns,idx)
      ierr=nfmpi_def_var(ncid,"odx",nf_double,1,ns,iodxx)
      ierr=nfmpi_def_var(ncid,"dy",nf_double,1,ns,idy)
      ierr=nfmpi_def_var(ncid,"ody",nf_double,1,ns,iodyy)
      ns = i0id
      ierr=nfmpi_def_var(ncid,"xdeg",nf_double,1,ns,ixdeg)
      ierr=nfmpi_enddef(ncid)
      !put variables in collective data mode
      ns_i = mylat*j2+1
      nc_i = j2
      ierr=nfmpi_put_vara_double_all(ncid,ifcol,ns_i,nc_i,f)
      ierr=nfmpi_put_vara_double_all(ncid,iphi,ns_i,nc_i,tanphi)
      ns_i = mylat*j1+1
      nc_i = j1
      ierr=nfmpi_put_vara_double_all(ncid,icsv,ns_i,nc_i,csv)
      ierr=nfmpi_put_vara_double_all(ncid,iocs,ns_i,nc_i,ocsv)
      ierr=nfmpi_put_vara_double_all(ncid,idxv,ns_i,nc_i,dxv)
      ierr=nfmpi_put_vara_double_all(ncid,iodx,ns_i,nc_i,odxv)
      ierr=nfmpi_put_vara_double_all(ncid,idyv,ns_i,nc_i,dyv)
      ierr=nfmpi_put_vara_double_all(ncid,iody,ns_i,nc_i,odyv)
      ns_i = mylat*j0+1
      nc_i = j0
      ierr=nfmpi_put_vara_double_all(ncid,iy,ns_i,nc_i,y)
      ierr=nfmpi_put_vara_double_all(ncid,iyv,ns_i,nc_i,yv)
      ierr=nfmpi_put_vara_double_all(ncid,iydeg,ns_i,nc_i,ydeg)
      ierr=nfmpi_put_vara_double_all(ncid,iyvd,ns_i,nc_i,yvdeg)
      ierr=nfmpi_put_vara_double_all(ncid,ics,ns_i,nc_i,cs)
      ierr=nfmpi_put_vara_double_all(ncid,iocs2,ns_i,nc_i,ocs)
      ierr=nfmpi_put_vara_double_all(ncid,idx,ns_i,nc_i,dx)
      ierr=nfmpi_put_vara_double_all(ncid,iodxx,ns_i,nc_i,odx)
      ierr=nfmpi_put_vara_double_all(ncid,idy,ns_i,nc_i,dy)
      ierr=nfmpi_put_vara_double_all(ncid,iodyy,ns_i,nc_i,ody)
      ns_i = mylon*i0+1
      nc_i = i0
      ierr=nfmpi_put_vara_double_all(ncid,ixdeg,ns_i,nc_i,xdeg)
      !put variables in independent data mode
      ierr=nfmpi_begin_indep_data(ncid)
      ierr=nfmpi_put_var_text(ncid,icase,case)
      ierr=nfmpi_put_var_text(ncid,idsp,dscrib)
      ierr=nfmpi_put_var_double(ncid,idt,dt)
      ierr=nfmpi_put_var_double(ncid,itlz,tlz)
      ierr=nfmpi_put_var_double(ncid,ib,b)
      ierr=nfmpi_put_var_double(ncid,ig,g)
      ierr=nfmpi_put_var_double(ncid,idm0,dm0)
      ierr=nfmpi_put_var_double(ncid,ide0,de0)
      ierr=nfmpi_put_var_double(ncid,idmz0,dmz0)
      ierr=nfmpi_put_var_double(ncid,irzmx,rzmx)
      ierr=nfmpi_put_var_double(ncid,idrag,drag)
      ierr=nfmpi_put_var_double(ncid,ifltw,fltw)
      ierr=nfmpi_put_var_double(ncid,idadt,daodt)
      ierr=nfmpi_put_var_double(ncid,iodt,odt)
      ierr=nfmpi_put_var_double(ncid,iprn,prn)
      ierr=nfmpi_put_var_double(ncid,iorz,orzmx)
      ierr=nfmpi_put_var_double(ncid,ioflt,ofltw)
      ierr=nfmpi_put_var_double(ncid,irawf,rawf)
      ierr=nfmpi_put_var_int(ncid,iktrm,ktrm)
      ierr=nfmpi_put_var_int(ncid,irst,lrstrt)
      ierr=nfmpi_put_var_int(ncid,imxit,mxit)
      ierr=nfmpi_put_var_int(ncid,isv,isav)
      ierr=nfmpi_put_var_int(ncid,imxsv,mxsav)
      ierr=nfmpi_put_var_int(ncid,ilop,lopen)
      ierr=nfmpi_put_var_int(ncid,ilmov,lmovi)
      ierr=nfmpi_put_var_int(ncid,imvi,mvi)
      ierr=nfmpi_put_var_int(ncid,ilfs,lfsrf)
      ierr=nfmpi_put_var_int(ncid,ilsol,lsolver)
      ierr=nfmpi_put_var_int(ncid,ilpre,lprecon)
      ierr=nfmpi_end_indep_data(ncid)

      ierr=nfmpi_close(ncid)
end subroutine wr8nc_rundata

subroutine wr8nc_zkb
use comm, only: myid,mylat,mylon,m_cart
use const, only: i0,j0,k0,i01,k0,k1,ngx0,ngy0
implicit none
!declare pnetcdf var
character :: fn*11
integer :: ncid,ierr,ns,nd(2),nt(3)
integer :: siid,k0id,k1id,kkid,i01id,i0id,j0id,i11id,j11id
integer :: itlz,iz,iodz,iodzw,ikb,irmt,iiv0,iiu0
integer :: iiu,iiv,iiw,iin
integer(kind=mpi_offset_kind) :: dim_nn(9),ns_ijk(3),nc_ijk(3),ns_ij(2),nc_ij(2)
integer(kind=mpi_offset_kind) :: ns_i,nc_i

      !output file name
      fn = 'data/zkb.nc'
      !create ncfile and id
      ierr=nfmpi_create(m_cart,fn,nf_64bit_offset,mpi_info_null,ncid)
      !define dimension and assign dimID
      dim_nn(1) = 1
      dim_nn(2) = k0
      dim_nn(3) = k1
      dim_nn(4) = k0+k1
      dim_nn(5) = i01*ngx0
      dim_nn(6) = i0*ngx0
      dim_nn(7) = j0*ngy0
      dim_nn(8) = (i01+1)*ngx0
      dim_nn(9) = (j0+1)*ngy0
      ierr=nfmpi_def_dim(ncid,"pt_val",dim_nn(1),siid)
      ierr=nfmpi_def_dim(ncid,"k0",dim_nn(2),k0id)
      ierr=nfmpi_def_dim(ncid,"k1",dim_nn(3),k1id)
      ierr=nfmpi_def_dim(ncid,"k0+k1",dim_nn(4),kkid)
      ierr=nfmpi_def_dim(ncid,"i01_global",dim_nn(5),i01id)
      ierr=nfmpi_def_dim(ncid,"i0_global",dim_nn(6),i0id)
      ierr=nfmpi_def_dim(ncid,"j0_global",dim_nn(7),j0id)
      ierr=nfmpi_def_dim(ncid,"i01+1_global",dim_nn(8),i11id)
      ierr=nfmpi_def_dim(ncid,"j0+1_global",dim_nn(9),j11id)
      !define variables and assign varID
      ns = siid
      ierr=nfmpi_def_var(ncid,"tlz",nf_double,1,ns,itlz)
      ns = kkid
      ierr=nfmpi_def_var(ncid,"z",nf_double,1,ns,iz)
      ns = k1id
      ierr=nfmpi_def_var(ncid,"odz",nf_double,1,ns,iodz)
      ns = k0id
      ierr=nfmpi_def_var(ncid,"odzw",nf_double,1,ns,iodzw)
      nd(1) = i0id
      nd(2) = j0id
      ierr=nfmpi_def_var(ncid,"kb",nf_short,2,nd,ikb)
      ierr=nfmpi_def_var(ncid,"rmets",nf_double,2,nd,irmt)
      nd(1) = i0id
      nd(2) = j11id
      ierr=nfmpi_def_var(ncid,"iv0",nf_short,2,nd,iiv0)
      nd(1) = i11id
      nd(2) = j0id
      ierr=nfmpi_def_var(ncid,"iu0",nf_short,2,nd,iiu0)
      nt(1) = i0id
      nt(2) = j0id
      nt(3) = k0id
      ierr=nfmpi_def_var(ncid,"iw",nf_short,3,nt,iiw)! (i0,j0,k0)
      nt(3) = k1id
      ierr=nfmpi_def_var(ncid,"in",nf_short,3,nt,iin)! (i0,j0,k1)
      nt(2) = j11id
      ierr=nfmpi_def_var(ncid,"iv",nf_short,3,nt,iiv)! (i0,0:j0,k1)
      nt(1) = i11id
      nt(2) = j0id
      ierr=nfmpi_def_var(ncid,"iu",nf_short,3,nt,iiu)
      ierr=nfmpi_enddef(ncid)

      !put variables
      ns_i = 1
      nc_i = 1
      ierr=nfmpi_put_vara_double_all(ncid,itlz,ns_i,nc_i,tlz)
      nc_i = k0+k1
      ierr=nfmpi_put_vara_double_all(ncid,iz,ns_i,nc_i,z)
      nc_i = k1
      ierr=nfmpi_put_vara_double_all(ncid,iodz,ns_i,nc_i,odz)
      nc_i = k0
      ierr=nfmpi_put_vara_double_all(ncid,iodzw,ns_i,nc_i,odzw)

      ns_ij(1) = mylon*i0+1
      ns_ij(2) = mylat*j0+1
      nc_ij(1) = i0
      nc_ij(2) = j0
      ierr=nfmpi_put_vara_int2_all(ncid,ikb,ns_ij,nc_ij,kb)
      ierr=nfmpi_put_vara_double_all(ncid,irmt,ns_ij,nc_ij,rmets)
      ns_ij(2) = mylat*(j0+1)+1
      nc_ij(2) = j0+1
      ierr=nfmpi_put_vara_int2_all(ncid,iiv0,ns_ij,nc_ij,iv0)
      ns_ij(1) = mylon*(i01+1)+1
      ns_ij(2) = mylat*j0+1
      nc_ij(1) = i01+1
      nc_ij(2) = j0
      ierr=nfmpi_put_vara_int2_all(ncid,iiu0,ns_ij,nc_ij,iu0)
      ns_ijk(1) = mylon*i0+1
      ns_ijk(2) = mylat*j0+1
      ns_ijk(3) = 1
      nc_ijk(1) = i0
      nc_ijk(2) = j0
      nc_ijk(3) = k0
      ierr=nfmpi_put_vara_int2_all(ncid,iiw,ns_ijk,nc_ijk,iw)
      nc_ijk(3) = k1
      ierr=nfmpi_put_vara_int2_all(ncid,iin,ns_ijk,nc_ijk,in)
      ns_ijk(2) = mylat*(j0+1)+1
      nc_ijk(2) = j0+1
      ierr=nfmpi_put_vara_int2_all(ncid,iiv,ns_ijk,nc_ijk,iv)
      ns_ijk(1) = mylon*(i01+1)+1
      ns_ijk(2) = mylat*j0+1
      nc_ijk(1) = i01+1
      nc_ijk(2) = j0
      ierr=nfmpi_put_vara_int2_all(ncid,iiu,ns_ijk,nc_ijk,iu)


      ierr=nfmpi_close(ncid)
end subroutine wr8nc_zkb

subroutine wr8nc_boundaries
use const,  only: i2,j2,ngx0,ngy0,k1,k2
use comm,  only: m_cart,mylat,mylon
implicit none

!declare pnetcdf var
character :: fn*18
integer :: ierr,ncid,nd(2),nt(3),nf(4)
integer :: i2id,j2id,spid,moid,k1id,k2id
integer :: isxy,itxy,itsu,issu,isnp,issp,itnp,itsp
integer(kind=mpi_offset_kind) :: dim_nn(6)
integer(kind=mpi_offset_kind) :: ns_ijkt(4),nc_ijkt(4),ns_ijk(3),nc_ijk(3)
integer(kind=mpi_offset_kind) :: ns_ij(2),nc_ij(2)

      !output file name
      fn = 'data/boundaries.nc'
      !create ncfile and id
      ierr=nfmpi_create(m_cart,fn,nf_64bit_offset,mpi_info_null,ncid)

      !define dimension and assign dimID
      dim_nn(1) = i2*ngx0
      dim_nn(2) = j2*ngy0
      dim_nn(3) = 10*ngy0
      dim_nn(4) = 12
      dim_nn(5) = k1
      dim_nn(6) = k2
      ierr=nfmpi_def_dim(ncid,"i2_global",dim_nn(1),i2id)
      ierr=nfmpi_def_dim(ncid,"j2_global",dim_nn(2),j2id)
      ierr=nfmpi_def_dim(ncid,"j0-sponge_global",dim_nn(3),spid)
      ierr=nfmpi_def_dim(ncid,"month",dim_nn(4),moid)
      ierr=nfmpi_def_dim(ncid,"k1",dim_nn(5),k1id)
      ierr=nfmpi_def_dim(ncid,"k2",dim_nn(6),k2id)

      !define variables and assign varID
      nd(1) = k1id
      nd(2) = moid
      ierr=nfmpi_def_var(ncid,"sxycli",nf_double,2,nd,isxy)
      ierr=nfmpi_def_var(ncid,"txycli",nf_double,2,nd,itxy)
      nt(1) = i2id
      nt(2) = j2id
      nt(3) = moid
      ierr=nfmpi_def_var(ncid,"tsurf",nf_double,3,nt,itsu)
      ierr=nfmpi_def_var(ncid,"ssurf",nf_double,3,nt,issu)
      nf(1) = i2id
      nf(2) = spid
      nf(3) = k2id
      nf(4) = moid
      ierr=nfmpi_def_var(ncid,"snsp",nf_double,4,nf,isnp)
      ierr=nfmpi_def_var(ncid,"sssp",nf_double,4,nf,issp)
      ierr=nfmpi_def_var(ncid,"tnsp",nf_double,4,nf,itnp)
      ierr=nfmpi_def_var(ncid,"tssp",nf_double,4,nf,itsp)
      ierr=nfmpi_enddef(ncid)

      !put variables
      ns_ij(1) = 1
      ns_ij(2) = 1
      nc_ij(1) = k1
      nc_ij(2) = 12
      ierr=nfmpi_put_vara_double_all(ncid,isxy,ns_ij,nc_ij,sxycli)
      ierr=nfmpi_put_vara_double_all(ncid,itxy,ns_ij,nc_ij,txycli)
      ns_ijk(1) = mylon*i2+1
      ns_ijk(2) = mylat*j2+1
      ns_ijk(3) = 1
      nc_ijk(1) = i2
      nc_ijk(2) = j2
      nc_ijk(3) = 12
      ierr=nfmpi_put_vara_double_all(ncid,issu,ns_ijk,nc_ijk,ssurf)
      ierr=nfmpi_put_vara_double_all(ncid,itsu,ns_ijk,nc_ijk,tsurf)
      ns_ijkt(1) = mylon*i2+1
      ns_ijkt(2) = mylat*10+1
      ns_ijkt(3) = 1
      ns_ijkt(4) = 1
      nc_ijkt(1) = i2
      nc_ijkt(2) = 10
      nc_ijkt(3) = k2
      nc_ijkt(4) = 12
      ierr=nfmpi_put_vara_double_all(ncid,isnp,ns_ijkt,nc_ijkt,snsp)
      ierr=nfmpi_put_vara_double_all(ncid,issp,ns_ijkt,nc_ijkt,sssp)
      ierr=nfmpi_put_vara_double_all(ncid,itnp,ns_ijkt,nc_ijkt,tnsp)
      ierr=nfmpi_put_vara_double_all(ncid,itnp,ns_ijkt,nc_ijkt,tssp)
      ierr=nfmpi_close(ncid)
end subroutine wr8nc_boundaries

subroutine wr8nc_preini
use const, only: i0,j0,k1,ngx0,ngy0
use comm, only: m_cart,mylat,mylon
implicit none
!declare pnetcdf var
character :: fn*14
integer :: ierr,ncid,nt(3)
integer :: i0id,j0id,k1id
integer :: isd,itd
integer(kind=mpi_offset_kind) :: dim_nn(3)
integer(kind=mpi_offset_kind) :: ns_ijk(3),nc_ijk(3)

      !output file name
      fn = 'data/preini.nc'
      !create ncfile and id
      ierr=nfmpi_create(m_cart,fn,nf_64bit_offset,mpi_info_null,ncid)

      !define dimension and assign dimID
      dim_nn(1) = i0*ngx0
      dim_nn(2) = j0*ngy0
      dim_nn(3) = k1
      ierr=nfmpi_def_dim(ncid,"i0_global",dim_nn(1),i0id)
      ierr=nfmpi_def_dim(ncid,"j0_global",dim_nn(2),j0id)
      ierr=nfmpi_def_dim(ncid,"k1",dim_nn(3),k1id)

      !define variables and assign varID
      nt(1) = i0id
      nt(2) = j0id
      nt(3) = k1id
      ierr=nfmpi_def_var(ncid,"s1",nf_double,3,nt,isd)
      ierr=nfmpi_def_var(ncid,"t1",nf_double,3,nt,itd)
      ierr=nfmpi_enddef(ncid)

      !put variables
      ns_ijk(1) = mylon*i0+1
      ns_ijk(2) = mylat*j0+1
      ns_ijk(3) = 1
      nc_ijk(1) = i0
      nc_ijk(2) = j0
      nc_ijk(3) = k1
      ierr=nfmpi_put_vara_double_all(ncid,isd,ns_ijk,nc_ijk,s1)
      ierr=nfmpi_put_vara_double_all(ncid,itd,ns_ijk,nc_ijk,t1)

      ierr=nfmpi_close(ncid)
end subroutine wr8nc_preini

subroutine rdnc_levitus(nm)
use comm, only: m_cart,myid,mylat,mylon
use const, only: i0,j0,k1,ngy0,ngx0
implicit none
character :: fn*20
integer :: ncid,ierr,itmp
integer(kind=mpi_offset_kind) :: ns_ijkt(4),nc_ijkt(4)
integer,intent(in) :: nm
      fn = 'data/annualevitus.nc'
      ierr=nfmpi_open(m_cart,fn,nf_nowrite,mpi_info_null,ncid)

      ns_ijkt(1) = mylon*i0+1
      ns_ijkt(2) = mylat*j0+1
      ns_ijkt(3) = 1
      ns_ijkt(4) = nm
      nc_ijkt(1) = i0
      nc_ijkt(2) = j0
      nc_ijkt(3) = k1
      nc_ijkt(4) = 1
      ierr=nfmpi_inq_varid(ncid,'s1_data',itmp)
      ierr=nfmpi_get_vara_double_all(ncid,itmp,ns_ijkt,nc_ijkt,s1)
      ierr=nfmpi_inq_varid(ncid,'t1_data',itmp)
      ierr=nfmpi_get_vara_double_all(ncid,itmp,ns_ijkt,nc_ijkt,t1)
      ierr=nfmpi_close(ncid)
endsubroutine rdnc_levitus

subroutine rdnc_depth(rmets)
use comm, only: m_cart,myid,mylat,mylon
use const, only: i0,j0
implicit none
character :: fn*14
integer :: ncid,ierr,itmp
integer(kind=mpi_offset_kind) :: ns_ij(2),nc_ij(2)
real*8,intent(inout) :: rmets(i0,j0)
      fn = 'data/depth.nc'
      ierr=nfmpi_open(m_cart,fn,nf_nowrite,mpi_info_null,ncid)
      ierr=nfmpi_inq_varid(ncid,'rmets',itmp)
      ns_ij(1) = mylon*i0+1
      ns_ij(2) = mylat*j0+1
      nc_ij(1) = i0
      nc_ij(2) = j0
      ierr=nfmpi_get_vara_double_all(ncid,itmp,ns_ij,nc_ij,rmets)
      ierr=nfmpi_close(ncid)
endsubroutine rdnc_depth

subroutine rdnc_yzgrid2(j,k,dxmnut)
use comm, only: m_cart,myid,mylat,mylon
use const, only: j0,j1
implicit none
character :: fn*14
integer :: ncid,ierr,itmp
integer(kind=mpi_offset_kind) :: ns_i,nc_i
integer,intent(inout) :: j,k
real*8,intent(inout) :: dxmnut
      fn = 'data/yzgrid.nc'
      ierr=nfmpi_open(m_cart,fn,nf_nowrite,mpi_info_null,ncid)

      ierr=nfmpi_inq_varid(ncid,'j0',itmp)
      ierr=nfmpi_get_var_int_all(ncid,itmp,j)
      ierr=nfmpi_inq_varid(ncid,'k0',itmp)
      ierr=nfmpi_get_var_int_all(ncid,itmp,k)
      ierr=nfmpi_inq_varid(ncid,'dxmnut',itmp)
      ierr=nfmpi_get_var_double_all(ncid,itmp,dxmnut)
      ierr=nfmpi_inq_varid(ncid,'tlz_depth',itmp)
      ierr=nfmpi_get_var_double_all(ncid,itmp,tlz)
      ierr=nfmpi_inq_varid(ncid,'z',itmp)
      ierr=nfmpi_get_var_double_all(ncid,itmp,z)
      ierr=nfmpi_inq_varid(ncid,'odz',itmp)
      ierr=nfmpi_get_var_double_all(ncid,itmp,odz)
      ierr=nfmpi_inq_varid(ncid,'odzw',itmp)
      ierr=nfmpi_get_var_double_all(ncid,itmp,odzw)

      ns_i=mylon*i0+1
      nc_i=i0
      ierr=nfmpi_inq_varid(ncid,'xdeg',itmp)
      ierr=nfmpi_get_vara_double_all(ncid,itmp,ns_i,nc_i,xdeg)
      ns_i=mylat*j0+1
      nc_i=j0
      ierr=nfmpi_inq_varid(ncid,'y',itmp)
      ierr=nfmpi_get_vara_double_all(ncid,itmp,ns_i,nc_i,y)
      ierr=nfmpi_inq_varid(ncid,'yv',itmp)
      ierr=nfmpi_get_vara_double_all(ncid,itmp,ns_i,nc_i,yv)
      ierr=nfmpi_inq_varid(ncid,'yvdeg',itmp)
      ierr=nfmpi_get_vara_double_all(ncid,itmp,ns_i,nc_i,yvdeg)
      ierr=nfmpi_inq_varid(ncid,'ydeg',itmp)
      ierr=nfmpi_get_vara_double_all(ncid,itmp,ns_i,nc_i,ydeg)
      ierr=nfmpi_inq_varid(ncid,'cs',itmp)
      ierr=nfmpi_get_vara_double_all(ncid,itmp,ns_i,nc_i,cs)
      ierr=nfmpi_inq_varid(ncid,'ocs',itmp)
      ierr=nfmpi_get_vara_double_all(ncid,itmp,ns_i,nc_i,ocs)
      ierr=nfmpi_inq_varid(ncid,'dx',itmp)
      ierr=nfmpi_get_vara_double_all(ncid,itmp,ns_i,nc_i,dx)
      ierr=nfmpi_inq_varid(ncid,'odx',itmp)
      ierr=nfmpi_get_vara_double_all(ncid,itmp,ns_i,nc_i,odx)
      ierr=nfmpi_inq_varid(ncid,'dy',itmp)
      ierr=nfmpi_get_vara_double_all(ncid,itmp,ns_i,nc_i,dy)
      ierr=nfmpi_inq_varid(ncid,'ody',itmp)
      ierr=nfmpi_get_vara_double_all(ncid,itmp,ns_i,nc_i,ody)

      ns_i=mylat*j1+1
      nc_i=j1
      ierr=nfmpi_inq_varid(ncid,'csv',itmp)
      ierr=nfmpi_get_vara_double_all(ncid,itmp,ns_i,nc_i,csv)
      ierr=nfmpi_inq_varid(ncid,'ocsv',itmp)
      ierr=nfmpi_get_vara_double_all(ncid,itmp,ns_i,nc_i,ocsv)
      ierr=nfmpi_inq_varid(ncid,'dxv',itmp)
      ierr=nfmpi_get_vara_double_all(ncid,itmp,ns_i,nc_i,dxv)
      ierr=nfmpi_inq_varid(ncid,'odxv',itmp)
      ierr=nfmpi_get_vara_double_all(ncid,itmp,ns_i,nc_i,odxv)
      ierr=nfmpi_inq_varid(ncid,'dyv',itmp)
      ierr=nfmpi_get_vara_double_all(ncid,itmp,ns_i,nc_i,dyv)
      ierr=nfmpi_inq_varid(ncid,'odyv',itmp)
      ierr=nfmpi_get_vara_double_all(ncid,itmp,ns_i,nc_i,odyv)
      ierr=nfmpi_close(ncid)

end subroutine rdnc_yzgrid2

end module
