copyright (C) 2001  MSC-RPN COMM  %%%MC2%%%
***s/r casc_bcs
*

      subroutine casc_bcs ( trname, datev, unf ) 1,12
      implicit none
*
      character*8 trname(*)
      character*15 datev
      integer unf
*
#include "lcldim.cdk"
#include "bcsdim.cdk"
#include "bcsmem.cdk"
#include "bcsgrds.cdk"
#include "nestpnt.cdk"
#include "partopo.cdk"
#include "ifd.cdk"
*
      integer  longueur,sid3df
      external longueur,sid3df
      character*4 nomvar
      character*8 dynophy
      character*8, dimension (:), allocatable :: trname_a
      character*256 fn
      logical done
      integer i,j,nka,ntra,n,err,ngd,nga,errop,ofi,ofj,
     $        errdyn,cumerr,cnt,nit,njt,d1,ni1,nj1,nk1,nbits
      real*8  , dimension (:  ), allocatable :: xpaq,ypaq,xpau,ypav
      real, dimension (:,:), allocatable :: mxn,uun,vvn,wzn,
     $                                      bun,prn,hun,cln
*-----------------------------------------------------------------------
*
* Read all needed files and construct the source domain for
* the horozontal interpolation
*
      if (south_L.or.north_L.or.west_L.or.east_L) then
*
      nga  = bcs_nia * bcs_nja
      nka  = 0
      ntra = 0
      err  = 0
      done = .false.
*
      do n=1,ifd_nf
      if (ifd_needit(n)) then
         errdyn = -1
         fn ='../casc/3df_'//datev//'_'//ifd_fnext(n)
         open (unf,file=fn(1:longueur(fn)),access='SEQUENTIAL',
     $            form='UNFORMATTED',status='OLD',iostat=errop)
         if (errop.ne.0) goto 33
*
* Use first file to establish 3D grid dimensions and geo-references
* of all input stagerred grids (xpaq, ypaq, xpau and ypva).
*
         if (.not.done) allocate (xpaq(bcs_nia), ypaq(bcs_nja), 
     $                            xpau(bcs_nia), ypav(bcs_nja))
         err = sid3df (xpaq,ypaq,xpau,ypav,unf,done,
     $                 bcs_nia,bcs_nja,bcs_nka,bcs_ntra)
         nka = bcs_nka
         ntra= bcs_ntra
         if (.not.done) then
            allocate (mxn(nga,2),uun(nga,nka),vvn(nga,nka),wzn(nga,nka),
     $                bun(nga,nka),prn(nga,nka+1),hun(nga,nka),
     $                cln(nga*nka,ntra), trname_a(ntra))
            trname_a='!@@NOT@@'
         endif
*
         ofi = ifd_minx(n)-1
         ofj = ifd_miny(n)-1
         read (unf,end=33) dynophy,cnt
*
 23      if (dynophy.eq.'PHYSICSS') then
            read (unf)
            do i=1,cnt
               read (unf)
               read (unf)
            end do
            read (unf,end=33) dynophy,cnt
         endif
*
         cumerr=0
         call filmup ( mxn,ifd_niad,ifd_niaf,ifd_njad,ifd_njaf,  2,
     $                                         unf,ofi,ofj,cumerr )
         call filmup ( uun,ifd_niad,ifd_niaf,ifd_njad,ifd_njaf,nka,
     $                                         unf,ofi,ofj,cumerr )
         call filmup ( vvn,ifd_niad,ifd_niaf,ifd_njad,ifd_njaf,nka,
     $                                         unf,ofi,ofj,cumerr )
         call filmup ( wzn,ifd_niad,ifd_niaf,ifd_njad,ifd_njaf,nka,
     $                                         unf,ofi,ofj,cumerr )
         call filmup ( bun,ifd_niad,ifd_niaf,ifd_njad,ifd_njaf,nka,
     $                                         unf,ofi,ofj,cumerr )
         call filmup ( prn,ifd_niad,ifd_niaf,ifd_njad,ifd_njaf,nka+1,
     $                                         unf,ofi,ofj,cumerr )
         call filmup ( hun,ifd_niad,ifd_niaf,ifd_njad,ifd_njaf,nka,
     $                                         unf,ofi,ofj,cumerr )
         if (ntra.gt.0) then
            call filuptr ( cln,ifd_niad,ifd_niaf,ifd_njad,ifd_njaf,nka,
     $                     unf,ofi,ofj,trname,ntr,trname_a,ntra,cumerr )
         endif
         errdyn = cumerr
 33      continue
*
         err = err + errdyn
         if (err.lt.0) then
            write (6,203) fn(1:longueur(fn)),myproc
            goto 999
         endif
         done = .true.
         close (unf)
      endif
      end do
 999  continue
*
      else
         err = 0
      endif
*
      call mc2stop(err)
*
      ofi = ldni-hblen_x+2
      ofj = ldnj-hblen_y+2
*
* Perform horizontal and vertical interpolations for S-N 
* and W-E boundaries
*
      nit = max(dimxs,dimxn)
      njt = 0
      if (south_L) njt = njt + dimys
      if (north_L) njt = njt + dimyn
      d1  = dimys*north
      ngd = nit * njt
*
      call casc_hvi (trname,trname_a,
     $               xpn,ypn,xpun,ypvn,xpaq,ypaq,xpau,ypav,
     $               bcs_ppa,bcs_ppa(bcs_inq),  
     $               bcs_uua,bcs_uua(bcs_in),bcs_vva,bcs_vva(bcs_in),
     $               bcs_wwa,bcs_wwa(bcs_in),bcs_bba,bcs_bba(bcs_in),
     $               bcs_hua,bcs_hua(bcs_in),bcs_tra,bcs_tra(bcs_in),
     $               mxn,uun,vvn,wzn,bun,prn,hun,cln,
     $               minxs,maxxs,minys,maxys,0,d1,0,ofj,gnk,nit,njt,
     $               bcs_nia,bcs_nja,nka,ntra,south_L,north_L)
*
      nit = 0
      njt = max(dimyw,dimye)
      if (west_L) nit = nit + dimxw
      if (east_L) nit = nit + dimxe
      d1  = dimxw*east
      ngd = nit * njt
*
      call casc_hvi (trname,trname_a, 
     $               xpw,ypw,xpuw,ypvw,xpaq,ypaq,xpau,ypav,
     $               bcs_ppa(bcs_iwq),bcs_ppa(bcs_ieq),
     $  bcs_uua(bcs_iw),bcs_uua(bcs_ie),bcs_vva(bcs_iw),bcs_vva(bcs_ie),
     $  bcs_wwa(bcs_iw),bcs_wwa(bcs_ie),bcs_bba(bcs_iw),bcs_bba(bcs_ie),
     $  bcs_hua(bcs_iw),bcs_hua(bcs_ie),bcs_tra(bcs_iw),bcs_tra(bcs_ie),
     $               mxn,uun,vvn,wzn,bun,prn,hun,cln,
     $               minxw,maxxw,minyw,maxyw,d1,0,ofi,0,gnk,nit,njt,
     $               bcs_nia,bcs_nja,nka,ntra,west_L,east_L)
*
      if (myproc.eq.0) then
         write(6,100)
         write(6,101) datev
         write(6,100)
      endif
*
 100  format (' ',65('*'))
 101  format (' (CASC_BCS) JUST READ INPUT DATA FOR DATE: ',a15)
 203  format (/' PROBLEM WITH FILE: ',a,', PROC#:',i4,' --ABORT--'/)
*-----------------------------------------------------------------------
      return
      end
*