***s/r eole_3d
*

      subroutine eole_3d( geobus, ngeop ) 1,14
      implicit none
*
**
#include "nesting.cdk"
#include "dynmem.cdk"
#include "tracers.cdk"
#include "nestpnt.cdk"
#include "yomdyn.cdk"
#include "yomdyn1.cdk"
c#include "yomdyn2.cdk"
#include "consdyn_8.cdk"
#include "levels.cdk"
#include "partopo.cdk"
c***
#include "topo.cdk"
#include "h_geop.cdk"
#include "eole.cdk"
*    
      integer i,j,k,n,gnix,gnjy,dim,err,kc
      real*8 c1,tropo
      real tp1,tp2,qp1,s,d,qstar
      pointer (patp1, tp1(gni+2*hx,gnj+2*hy,gnk)),
     $        (patp2, tp2(gni+2*hx,gnj+2*hy,gnk)),
     $        (paqp1, qp1(gni+2*hx,gnj+2*hy,0:gnk)),
     $        (pas1 ,s(*)), (pad1 ,d(*))
*     to hold the global sby, sbx
      real sby1(gni+2*hx,gnj+2*hy),sbx1(gni+2*hx,gnj+2*hy)
      real*8 rtstar1
c
      integer ngeop
      real geobus(ngeop)
c***  use new variables Tprime and Qprime (beginning), Jan. 2003
c
      integer km1, kp1
      real*8 beta, dh, dqdz, pt5
      real hht(minx:maxx,miny:maxy,gnk), hhm(minx:maxx,miny:maxy,0:gnk)
      real hhw(minx:maxx,miny:maxy,  gnk)
      pt5  = 0.5d0
c
c***  use new variables Tprime and Qprime (end), Jan. 2003
c
*
****
*     Mise en place des profils
****
      print*, 'NOT ADAPTED FOR NEW LATERAL BCS --- ABORT ---'
      call mc2stop(-1)
      gnix = gni+2*hx
      gnjy = gnj+2*hy
      if (myproc.eq.0) then
         call hpalloc (patp1, gnix*gnjy*gnk,     err, 1)
         call hpalloc (patp2, gnix*gnjy*gnk,     err, 1)
         call hpalloc (paqp1, gnix*gnjy*(gnk+1), err, 1)
      endif
*
      if (myproc.eq.0) then
         do k=1,gnk
         do j=1,gnjy
         do i=1,gnix
            tp1(i,j,k) = 0.            ! no humidity
         end do
         end do
         end do
      endif
      call glbdist2 (tp1,hup ,minx,maxx,miny,maxy,gni+hx,gnj+hy,gnk)
*
      if (myproc.eq.0) then
         do k=1,gnk
            if (zm(k).gt.haut4) then
               if (k.gt.1) then
                  tp1(1,1,k)=tp1(1,1,k-1)
                  tp2(1,1,k)=tp2(1,1,k-1)
               else
                  print*,'zm(1) > haut4'
                  print*,'Initialisation du profil de vent avec ug et vg'
                  tp1(1,1,k)=uvg
                  tp2(1,1,k)=vvg
               endif
            else
               call intcub_2pts_2d2('u',zm(k),tp1(1,1,k))
               call intcub_2pts_2d2('v',zm(k),tp2(1,1,k))
            endif
         print*,'ug (',k,')=',tp1(1,1,k)
         print*,'vg (',k,')=',tp2(1,1,k)
         end do
*
         do k=1,gnk
         do j=1,gnjy
         do i=1,gnix
            tp1(i,j,k) = tp1(1,1,k)
            tp2(i,j,k) = tp2(1,1,k)
         enddo
         enddo
         enddo
      endif
      call glbdist2 (tp1,uup  ,minx,maxx,miny,maxy,gni+hx,gnj+hy,gnk)
      call glbdist2 (tp2,vvp  ,minx,maxx,miny,maxy,gni+hx,gnj+hy,gnk)
*
*     get the m2
      call glbcolc (sby1,gnix,gnjy,sby,minx,maxx,miny,maxy,1)  !verifier dims
*
      tropo = 10000.d0
      if (myproc.eq.0) then
      do k=1,gnk
         if (ztr(k).le.tropo) then
	    if (ztr(k).gt.haut4) then 
c MDMD inliner intlin (de grace)
cccccccccccc               call intlin(haut3,haut4,tprofil3,tprofil4,
cccccccccccc     $         ztr(k),tp1(1,1,k))
            else
               call intcub_2pts_2d2('t',ztr(k),tp1(1,1,k))
            endif
	 else
            if (k.eq.1) then
               tp1(1,1,k)=grtstar
            else
	       tp1(1,1,k)=tp1(1,1,k-1)
            endif
	 endif
      enddo
      endif
*
****
*     Calcul des valeurs pleines : P=Pstar+Pprime
****
c***  use new variables Tprime and Qprime (beginning), Jan. 2003
c
      my_psol = 100000.0d0
*      
      if (myproc.eq.0) then
c
         do j=1-hy,ldnj+hy
         do i=1-hx,ldni+hx
            hhm(i,j,0)=hh0i(i,j,1)
         end do
         end do
c
         do k=1,gnk 
            do j=1-hy,ldnj+hy
            do i=1-hx,ldni+hx
               hhw(i,j,k)=h_geop(zt(k),i,j)
               hhm(i,j,k)=h_geop(zm(k),i,j)
               hht(i,j,k)=h_geop(ztr(k),i,j)
            end do
            end do
         end do
c
         call qntstar(qstr,nssq,gots,orts,hht,hhm,
     &                 (maxx-minx+1)*(maxy-miny+1),0,gnk)

*
         c1 = grav_8 / rgasd_8
c
         qp1(1,1,0) = dlog(my_psol)
*
         qp1(1,1,1) = qp1(1,1,0)-c1/tp1(1,1,1)*dble(zm(1))  !zm(0) n existe pas
*
      print*,'k=',0,'t=              p=',exp(qp1(1,1,0))
      print*,'k=',1,'t=',tp1(1,1,1),'p=',exp(qp1(1,1,1))
*
      do k=2,gnk
         qp1(1,1,k)= qp1(1,1,k-1)-c1/tp1(1,1,k)*(zm(k)-zm(k-1))
         print*,'k=',k,'t=',tp1(1,1,k),'p=',exp(qp1(1,1,k))
      end do
*
****
*     Calcul des perturbations
****
      do k = 0, gnk
         qp1(1,1,k) = ( qp1(1,1,k) - qstr(1,1,k) ) / orts(1,1,k)
      end do
c
      print*,'k=',0,'tprime=              pprime=',qp1(1,1,0)
c
      do k = 1, gnk
         km1=max(k-1,1)
         kp1=min(k+1,gnk)
         beta = nssq(1,1,k) / grav_8 - gots(1,1,k) / cpd_8
         dh = ( hhw(1,1,kp1) - hhw(1,1,km1) ) * pt5
         dqdz = ( qp1(1,j,k) - qp1(1,1,k-1) ) / dh
     &         - ( qp1(1,1,k) + qp1(1,1,k-1) ) * pt5 * beta
         tp1(1,1,k) = grav_8 * dqdz / ( grav_8 - dqdz )
c
         print*,'k=',k,'tprime=',tp1(1,1,k),'qprime=',qp1(1,1,k),
     &          'beta, dh, dqdz=', beta, dh, dqdz
      end do
**********************************
*
****
*     Champs constants de dq et T en (x,y)
****
      do j=1,gnjy
      do i=1,gnix
         qp1 (i,j,0)= qp1(1,1,0)
      end do
      end do
*
      do k=1,gnk
      do j=1,gnjy
      do i=1,gnix         
         tp1 (i,j,k)= tp1(1,1,k)
         qp1 (i,j,k)= qp1(1,1,k)
      end do
      end do
      end do
*
      endif
*
      call glbdist2 (tp1,bbp  ,minx,maxx,miny,maxy,gni+hx,gnj+hy,gnk)
      call glbdist2 (qp1,ppp  ,minx,maxx,miny,maxy,gni+hx,gnj+hy,gnk+1)
*
*     do the pressure balance for geostrophic flow (operates on ppp)
      print *,'s/r eole_qbal called....'
*
      call eole_qbal
*
*
* Vertical motion
*
      do k=1,gnk
         do j=1-hy,ldnj+hy
         do i=1-hx,ldni+hx
            wwp(i,j,k) = 0.
         end do
         end do
      end do
*
c---- A Buble is introduced as a tracer
      if (myproc.eq.0) then  
         kc=0
         do k=1,gnk-1
            if (zm(k).lt.blb_zp) kc=k
         enddo
         print *,"kc=",kc," : ",zm(kc)
         do k=1,gnk
         do j=1,gnjy
         do i=1,gnix
            tp1(i,j,k)=100./(1.+
     $           (real(k-kc)/real(blb_zs))**4.+
     $           (real(i-gnix/4)/real(blb_xs))**4.)
c     tp1(i,j,k)= min(5,max(5-abs(i-gnix/4),0))
c     tp1(i,j,k)= 1.
*     tp1(i,j,k)= 0.
         end do
         end do
         end do
      endif
*     attention ... 
*     le Bubble tracer doit aller en derniere place des traceurs
      call glbdist2 (tp1,trp(minx,miny,1,ntr) ,
     $     minx,maxx,miny,maxy,gni+hx,gnj+hy,gnk)
c---- 
      if (ctebcs) then
         do k=1,gnk
         do j=1-hy,ldnj+hy
         do i=1-hx,ldni+hx
            ppnta(i,j,k) = ppp(i,j,k)
            uunta(i,j,k) = uup(i,j,k)
            vvnta(i,j,k) = vvp(i,j,k)
            wwnta(i,j,k) = wwp(i,j,k)
            bbnta(i,j,k) = bbp(i,j,k)
            hunta(i,j,k) = hup(i,j,k)
         end do
         end do
         do n=1,ntr
            do j=1-hy,ldnj+hy
            do i=1-hx,ldni+hx
               trnta(i,j,k,n) = trp(i,j,k,n)
            end do
            end do
         end do
         end do
         do j=1-hy,ldnj+hy
         do i=1-hx,ldni+hx
            ppnta(i,j,0) = ppp(i,j,0)
         end do
         end do
      endif
*
      dim = ndynvar*dim3d+dim2d
      pas1 = pappp
      pad1 = papp0
      do i=1,dim
         d(i) = s(i)
      end do
*     
      do k=1,gnk
         do j=1-hy,ldnj+hy
         do i=1-hx,ldni+hx
            ppntt(i,j,k) = ppp(i,j,k)
            uuntt(i,j,k) = uup(i,j,k)
            vvntt(i,j,k) = vvp(i,j,k)
            wwntt(i,j,k) = wwp(i,j,k)
            bbntt(i,j,k) = bbp(i,j,k)
            huntt(i,j,k) = hup(i,j,k)
         end do
         end do
      end do
      do n = 1, ntr
         do k=1,gnk
            do j=1-hy,ldnj+hy
               do i=1-hx,ldni+hx
*                  trntt(i,j,k,n) = trp(i,j,k,n)
               end do
            end do
         end do
      end do
      do j=1-hy,ldnj+hy
      do i=1-hx,ldni+hx
         ppntt(i,j,0) = ppp(i,j,0)
      end do
      end do
*     
      if (myproc.eq.0) then
         write (6,602)
         call hpdeallc (patp1 ,err,1)
         call hpdeallc (patp2 ,err,1)
         call hpdeallc (paqp1 ,err,1)
      endif
*
      if ( fhalo .and. vraies_mtn.eq.2 ) then
         call draglaw ( geobus, ngeop )
      endif
c
 602  format (/'INITIALIZATION OF EOLE PROBLEM COMPLETED')
*---------------------------------------------------------------------
      return
      end
*

      subroutine eole_qbal 1,1
*
      implicit none
*
#include "grd.cdk"
#include "consdyn_8.cdk"
#include "yomdyn.cdk"
#include "yomdyn1.cdk"
c#include "yomdyn2.cdk"
#include "dynmem.cdk"
#include "levels.cdk"
c***
#include "topo.cdk"
#include "h_geop.cdk"
#include "eole.cdk"
*
      integer   i, j, k, kk, km, kp, err,nb_instab
      real*8    dxi, dyi, one, two, three, p25,
     $          c2,c1, vbarxy, ubarxy, tpbarz, dz,
     $          vr(minx:maxx,miny:maxy,1:nk),
     $          ur(minx:maxx,miny:maxy,1:nk),
     $          ppr(minx:maxx,miny:maxy)
*
      parameter (p25=0.25, one = 1.0)
      real ref_adiab, ref_conv, critere_stab, petit
      pointer (pat_ad, ref_adiab(2:gnk)),
     $          (pat_cv, ref_conv(2:gnk))
      parameter (critere_stab=9.3)  !refroidissement adiab : -9.8C/km
      parameter (petit=0.0001)
c ***
      integer km1, kp1
      real*8 beta, dh, dqdz, pt5
      real hht(minx:maxx,miny:maxy,gnk), hhm(minx:maxx,miny:maxy,0:gnk)
      real hhw(minx:maxx,miny:maxy,  gnk)
      pt5  = 0.5d0
c ***
*     ------------------------------------
*
      dxi  = one / dble(grdx)
      dyi  = one / dble(grdy)
*
****
*     Calcul de grad (q) : ur=R(Tstar+Tprime)dq/dx ; vr=R(Tstar+Tprime)dq/dy
****
      do k=1,gnk-1
         do j = 1-hy, ldnj+hy-1
         do i = 1-hx+1,ldni+hx
            vbarxy    = p25 * ( ( vvp(i-1,j+1,k)+vvp(i-1,j,k) ) +
     $                          ( vvp(i  ,j+1,k)+vvp(i  ,j,k) ) )
            ur(i,j,k) = + vbarxy * ( fcor(i,j+1) + fcor(i,j) ) * pt5
                !Coriolis doit rester constant
         end do
         end do
*
         do j = 1-hy+1,ldnj+hy
         do i = 1-hx,ldni+hx-1
            ubarxy    = p25 * ( (uup(i+1,j-1,k)+uup(i,j-1,k) )
     $                        + (uup(i+1,j  ,k)+uup(i,  j,k) ) )
            vr(i,j,k) = - ubarxy * ( fcor(i+1,j) + fcor(i,j) ) * pt5
         end do
         end do
*
         i=ldni+hx
         do j = 1-hy+1,ldnj+hy
            vr(i,j,k) = vr(i-1,j,k)   !OK car grad q constant
         enddo
      enddo
*
****
*     ppp by integration
*     Tout doit etre constant dans l equilibre geostrophique
****
      do k=0,gnk
*         kk=min(gnk-1,max(1,k))
         kk=min(gnk-1,k)
         km=max(1,k)
         kp=min(gnk,k+1)
         tpbarz=(bbp(1,1,km)+bbp(1,1,kp))*pt5
c*** use new variable Qprime=R*Tstar*Qprime(old), (beginning) Jan. 2003
         c1 = dble(grdx) / ( 1 + tpbarz / grav_8 )
c*** use new variable Qprime=R*Tstar*Qprime(old), (end) Jan. 2003
         c2=grav_8/(rgasd_8*dble(grtstar))
*
*     mid point
*
            i=ldni/2
            j=ldnj/2
            ppr(i,j)=ppp(i,j,k)   !Calculs en double precision
*
*     mid row minus mid point
*
*     A k=0, ur pas defini. Si defini, probleme dans runsor pour TT !!?
            do i= ldni/2-1,1-hx,-1
               if (k.eq.0) then
                  ppr(i,j)=ppr(i+1,j)-c1*vprofil1*fcor(i,j)
               else
                    ppr(i,j)=ppr(i+1,j)-c1*ur(i+1,j,kk)
               endif
            enddo
*
            do i= ldni/2+1,ldni+hx
               if (k.eq.0) then
                   ppr(i,j)=ppr(i-1,j)+c1*vprofil1*fcor(i,j)
               else
                   ppr(i,j)=ppr(i-1,j)+c1*ur(i,j,kk)
               endif
            enddo
*
*     other rows
*
         do j= ldnj/2-1,1-hy,-1
            do i= 1-hx,ldni+hx
               if (k.eq.0) then
                  ppr(i,j)=ppr(i,j+1)-c1*(-uprofil1*fcor(i,j))
               else
                  ppr(i,j)=ppr(i,j+1)-c1*vr(i,j+1,kk)
               endif
            enddo
         enddo
*
         do j= ldnj/2+1,ldnj+hy
            do i= 1-hx,ldni+hx
               if (k.eq.0) then
                  ppr(i,j)=ppr(i,j-1)+c1*(-uprofil1*fcor(i,j))
               else
                  ppr(i,j)=ppr(i,j-1)+c1*vr(i,j,kk)
               endif
            enddo
         enddo
*
         do j= 1-hy,ldnj+hy
            do i= 1-hx,ldni+hx
               ppp(i,j,k)=ppr(i,j)
c               ppm(i,j,k)=ppp(i,j,k)
c               pp0(i,j,k)=ppp(i,j,k)
            enddo
         enddo
c ***
         print*, 'in eole_qbal: k, ppp = ', k, ppp(3,3,k)
      enddo
*
****
*     Iteration avec l'equation hydrostatique pour trouver 
*        un profil de temperature T(x,y,z) plus proche des 2 equilibres
****
c
         do j=1-hy,ldnj+hy
         do i=1-hx,ldni+hx
            hhm(i,j,0)=hh0i(i,j,1)
         end do
         end do
c
         do k=1,gnk 
            do j=1-hy,ldnj+hy
            do i=1-hx,ldni+hx
               hhw(i,j,k)=h_geop(zt(k),i,j)
               hhm(i,j,k)=h_geop(zm(k),i,j)
               hht(i,j,k)=h_geop(ztr(k),i,j)
            end do
            end do
         end do
c
         call qntstar(qstr,nssq,gots,orts,hht,hhm,
     &                 (maxx-minx+1)*(maxy-miny+1),0,gnk)
c
      do k=1,gnk
         dz = zm(1)
         if(k.ne.1) dz = zm(k) - zm(k-1)
         km1=max(k-1,1)
         kp1=min(k+1,gnk)
         do j= 1-hy,ldnj+hy
            do i= 1-hx,ldni+hx
               beta = nssq(i,j,k) / grav_8 - gots(i,j,k) / cpd_8
               dh = ( hhw(i,j,kp1) - hhw(i,j,km1) ) * pt5
               dqdz = ( ppp(i,j,k) - ppp(i,j,k-1) ) / dh
     &               - ( ppp(i,j,k) + ppp(i,j,k-1) ) * pt5 * beta
               bbp(i,j,k)= grav_8 * dqdz / ( grav_8 - dqdz )
c               bbm(i,j,k)= bbp(i,j,k)
c               bb0(i,j,k)= bbp(i,j,k)
            enddo
         enddo
         print*,'tprime_recalculee(1,1',k,'=)',bbp(1,1,k), 
     &          'beta, dh, dqdz=', beta, dh, dqdz
      enddo
*
      if (stabilite_air.eq.1) then
*     Attention, les 2 equilibres sont moins bons
         nb_instab=0
         call hpalloc (pat_ad, gnk-1, err, 1)
         call hpalloc (pat_cv, gnk-1, err, 1)
         do k=2,gnk
            ref_adiab(k)=-critere_stab*(ztr(k)-ztr(k-1))/1000.
         enddo
         do j= 1-hy,ldnj+hy
            do i= 1-hx,ldni+hx
 100           continue
               do k=2,gnk
                  ref_conv(k)=(bbp(i,j,k)-bbp(i,j,k-1))
                  ref_conv(k)=ref_conv(k)-ref_adiab(k)
               enddo
*
               k=2
 110           if (ref_conv(k).lt.(0.-petit)) then
                  nb_instab=nb_instab+1
                  bbp(i,j,k)=bbp(i,j,k-1)+ref_adiab(k)
                  bbp(i,j,k+1)=bbp(i,j,k+1)+ref_conv(k)
                  print*,' ! Profil T(',i,',',j,',',k,') -
     $ T(',i,',',j,',',k-1,') instable '
                  goto 100
               else
                  k=k+1
                  if (k.eq.gnk) then  !pas d instabilite en gnk
                     goto 200         !car profil ct de temperature
                  else
                     goto 110
                  endif
               endif
 200           continue
            enddo
         enddo
*
         call hpdeallc (pat_ad, err, 1)
         call hpdeallc (pat_cv, err, 1)
         print*,' '
         print*,'----------------------------------------------'
         print*,'Nombre d instabilites corrigees: ',nb_instab
         print*,'----------------------------------------------'

      endif
*
*----------------------------------------------------------------------
*
      return
      end
*
copyright (C) 2001  MSC-RPN COMM  %%%MC2%%%
*
***s/r draglaw (geobus,ngeop)
*

      subroutine draglaw (geobus,ngeop) 1
      implicit none
*
*AUTHOR   David Lemarquis                      Sep   2001
*
*REVISION
*
* Wei Yu (Jan. 2003)
* Use Z0 instead of ZP for surface roughness
*
*IMPLICIT
#include "eole.cdk"
#include "lesbus.cdk"
#include "dynmem.cdk"
#include "consdyn_8.cdk"
#include "yomdyn1.cdk"
#include "levels.cdk"
#include "grd.cdk"
*
*     integer i,j,k,ldni,ldnj,ni,nj,   nk,k_hcl
      integer i, j, k, ni, nj, k_hcl
      integer offj,izp,err
      integer ngeop
      real geobus(ngeop)
*     real zzero,ue,tau0,tau,taux,tauy
*     pointer (pat_z0, zzero(minx:maxx,miny:maxy)),
*     $        (pat_ue, ue(minx:maxx,miny:maxy)),
*     $        (pat_tau0, tau0(minx:maxx,miny:maxy)),
*     $        (pat_tau, tau(minx:maxx,miny:maxy,gnk)),
*     $        (pat_taux, taux(minx:maxx,miny:maxy,gnk)),
*     $        (pat_tauy, tauy(minx:maxx,miny:maxy,gnk))
      real zzero(minx:maxx,miny:maxy),
     $     ue(minx:maxx,miny:maxy),
     $     tau0(minx:maxx,miny:maxy)
*     $        tau(minx:maxx,miny:maxy,gnk),
*     $        taux(minx:maxx,miny:maxy,gnk),
*     $        tauy(minx:maxx,miny:maxy,gnk)
      real uemin,uemax,eps,ueg,ued,ueopp,deltaue
      integer nit,nitmax,signeyg,signeyd,signey
      real yg,yd,y,A,B,hcl,cdd,sdd,rho0,tbarz
      real *8 ug1,vg1,geostr,costh,sinth,uv1,u1,v1,bx,by,bb,dens,G
      logical verb
      data verb/.false./
*
*     profil de gradient de stress=gprime
*
      real gprime,z,h
      gprime(z,h)=-2*(1-z/h)/h
*
      A=0.9          !These Robert Benoit mars 1073 p21
      B=4.5
*     uemin=0.0001   !Hauteur couche lim = ue/f
      uemin=0.000001   !gaspe testing
*     uemax=1.       !ue moyen = 0.07
      uemax=100.       ! uemax=1 maybe too low  (gaspesie)
      nitmax=100
      eps=0.001      !eps=delta ue / ue
      G=sqrt(dble(uprofil1**2.)+dble(vprofil1**2.))
      hcl=1000.      !hauteur de la couche limite (m)
*
      print *,'draglaw.gni=',gni,' gnj=',gnj,' ldni,ldnj=',ldni,ldnj,
     $     ' ni,nj=',ni,nj
*     ldni=gni
*     ldnj=gnj
      ni=gni+2*hx
      nj=gnj+2*hy
*     nk=gnk
      print *,'draglaw.ni=',ni,' nj=',nj,' gni=',gni,' gnj=',gnj,
     $     ' minx=',minx,' maxx=',maxx,' miny=',miny,' maxy=',maxy,
     $     'gnk,nk=',gnk,nk
*     stop
*
      do k=1,nk
         if (ztr(k).gt.hcl) then
            goto 10
         else
            k_hcl=k+1
         endif
      enddo
*
 10   continue
*     10   call hpalloc (pat_z0, ni*nj, err, 1)
*     call hpalloc (pat_ue, ni*nj, err, 1)
*     call hpalloc (pat_tau0, ni*nj, err, 1)
*     call hpalloc (pat_tau, ni*nj*nk, err, 1)
*     call hpalloc (pat_taux, ni*nj*nk, err, 1)
*     call hpalloc (pat_tauy, ni*nj*nk, err, 1)
*
      do i=1,geotop       
c      Line changed (WY, Jan. 2003)
c         if (geonm(i,2).eq.'ZP') izp=i
         if (geonm(i,2).eq.'Z0') izp=i
c-----------
      enddo
*     Lecture de la longueur de rugosite au centre du domaine
      do j= 1,ldnj
         offj=ldni*(j-1)
         do i= 1,ldni
            zzero(i,j)=geobus(geopar(izp,1)+offj+i-1)
         enddo
      enddo
*
*     Recopiage de Z0 sur les bandes
      do i=minx,0
         do j=1,ldnj
            zzero(i,j)=zzero(1,j)
         enddo
      enddo
*
      do i=ldni+1,maxx
         do j=1,ldnj
            zzero(i,j)=zzero(ldni,j)
         enddo
      enddo
*
      do i=1,ldni
         do j=miny,0
            zzero(i,j)=zzero(i,1)
         enddo
      enddo
*
      do i=1,ldni
         do j=ldnj+1,maxy
            zzero(i,j)=zzero(i,ldnj)
         enddo
      enddo
*
*     Recopiage de Z0 dans les coins
      do i=minx,0
         do j=miny,0
            zzero(i,j)=zzero(1,1)
         enddo
      enddo
*
      do i=minx,0
         do j=ldnj+1,maxy
            zzero(i,j)=zzero(1,ldnj)
         enddo
      enddo
*
      do i=ldni+1,maxx
         do j=miny,0
            zzero(i,j)=zzero(ldni,1)
         enddo
      enddo
*
      do i=ldni+1,maxx
         do j=ldnj+1,maxy
            zzero(i,j)=zzero(ldni,ldnj)
         enddo
      enddo
*
*     Calcul de Uetoile, le stress de surface par dichotomie
*     do i=minx,maxx
      do i=minx,maxx-1
         do j=miny,maxy-1
*         do j=miny,maxy
            nit=0
            ueg=uemin
            ued=uemax
            ue(i,j)=(ueg+ued)/2.
*           print *,'fcor,i,j=',fcor(i,j),i,j	
*
 50         nit=nit+1
            if (nit.gt.nitmax) then
               print*,'Calcul du stress de surface impossible'
               print*,'Nombre max d iteration depasse'
               stop
            endif
            yg=ueg/karman_8 * sqrt((alog(ueg/(fcor(i,j)*
     $            zzero(i,j))) - A)**2. + B**2) - G
            if (yg.lt.0.) then
               signeyg=-1
            else
               signeyg=+1
            endif
            yd=ued/karman_8 * sqrt((alog(ued/(fcor(i,j)*
     $            zzero(i,j))) - A)**2. + B**2) - G
            if (yd.lt.0.) then
               signeyd=-1
            else
               signeyd=+1
            endif
            if (signeyg.eq.signeyd) then
               print*,'Calcul du stress de surface impossible'
	       print *,nit,ueg,ued,i,j,zzero(i,j),g,fcor(i,j),
     $	               karman_8
               stop
            endif
*
            y=ue(i,j)/karman_8 * sqrt((alog(ue(i,j)/(fcor(i,j)*
     $            zzero(i,j))) - A)**2. + B**2) - G
*
            if (y.lt.0.) then
               signey=-1
            else
               signey=+1
            endif
*
            if (signey.ne.signeyg) then
               ued=ue(i,j)
               ueopp=ueg
            else
               ueg=ue(i,j)
               ueopp=ued
            endif
            ue(i,j)=(ue(i,j)+ueopp)/2.
*
            deltaue=sqrt((ue(i,j)-ueopp)**2.)
            if ((deltaue/ue(i,j)).lt.eps) then
               goto 100
            else
               goto 50
            endif
*
 100        continue
*
*           Calcul de Tau0
c            rho0=my_psol/(rgasd_8*(bbp(i,j,1)+grtstar))
            rho0 = my_psol / (rgasd_8*(1.+bbp(i,j,1)/grav_8)*grtstar)
            tau0(i,j)=ue(i,j)**2. * rho0
            if (verb) 
     $           print*,'draglaw...',i,j,bbp(i,j,1)+grtstar,tau0(i,j),zzero(i,j),
     $           ue(i,j)
*
*           Profil quadratique de tau(z)
*     do k=1,k_hcl
*     tau(i,j,k)=tau0(i,j) * (ztr(k)**2./hcl**2. - 
*     $            2.*ztr(k)/hcl + 1.)
*     cdd=uup(i,j,k)/(sqrt(uup(i,j,k)**2.+vvp(i,j,k)**2.))
*     sdd=vvp(i,j,k)/(sqrt(uup(i,j,k)**2.+vvp(i,j,k)**2.))
*     taux(i,j,k)=tau(i,j,k)*(-cdd)
*     tauy(i,j,k)=tau(i,j,k)*(-sdd)
*     enddo
*
         enddo
      enddo
*
*     Calcul des nouveaux vents
*     a l'entree, uup,vvp contiennent ug,vg (geostrophique)
*     premier niveau (special, donne direction profil de stress)
*      do j=miny,maxy
*         do i=minx,maxx
      do j=miny,maxy-1
         do i=minx,maxx-1
            k=1
            ug1=uup(i,j,k)
            vg1=vvp(i,j,k)
            bx=-fcor(i,j)*vg1
            by=+fcor(i,j)*ug1
            geostr=sqrt(ug1**2+vg1**2)
            bb=sqrt(bx*bx+by*by)
            costh=ue(i,j)**2*dble(abs(gprime(ztr(k),hcl)/fcor(i,j)))/geostr
            if (costh.gt.0.99) then
               print *,'draglaw...costh,i,j,=',costh,i,j
               costh=0.99 !avoid 1.0000x value (large z0?)
               print *,'draglaw...costh____,i,j,=',costh,i,j
            endif
            sinth=sqrt(dble(1.0)-costh**2)
            uv1=geostr*sinth
            u1=uv1*(costh*bx+sinth*by)/bb
            v1=uv1*(costh*by-sinth*bx)/bb
            uup(i,j,k)=u1
            vvp(i,j,k)=v1
            uu0(i,j,k) = uup(i,j,k)
            vv0(i,j,k) = vvp(i,j,k)
*     nest aussi !
            uunta(i,j,k) =  uup(i,j,k)
            vvnta(i,j,k) =  vvp(i,j,k)
            uuntt(i,j,k) =  uup(i,j,k)
            vvntt(i,j,k) =  vvp(i,j,k)
            if (verb) 
     $           print*,'draglaw...uv1',
     $           i,j,ug1,vg1,bx,by,geostr,bb,costh,sinth,uv1,u1,v1,
     $           (ug1*u1+vg1*v1)/(geostr*uv1),
     $           hcl,ztr(k),gprime(ztr(k),hcl),zzero(i,j),fcor(i,j)
            do k=2,k_hcl-1
               ug1=uup(i,j,k)
               vg1=vvp(i,j,k)
*     tbarz=(bbp(i,j,k)+bbp(i,j,k+1))/2.
c               dens=1.                   ! a ajuster ....
               dens = my_psol/(rgasd_8*(1.+bbp(i,j,k)/grav_8)*grtstar)
               vvp(i,j,k)=vg1
     $              -tau0(i,j)*gprime(ztr(k),hcl)*u1/uv1/fcor(i,j)/dens
               uup(i,j,k)=ug1
     $              +tau0(i,j)*gprime(ztr(k),hcl)*v1/uv1/fcor(i,j)/dens
*     nest aussi !
               uu0(i,j,k) = uup(i,j,k)
               vv0(i,j,k) = vvp(i,j,k)
               uunta(i,j,k) =  uup(i,j,k)
               vvnta(i,j,k) =  vvp(i,j,k)
               uuntt(i,j,k) =  uup(i,j,k)
               vvntt(i,j,k) =  vvp(i,j,k)
                geostr=sqrt(ug1**2+vg1**2)
               u1=uup(i,j,k)
               v1=vvp(i,j,k)
               uv1=sqrt(u1**2+v1**2)
               if (verb) 
     $              print*,'draglaw...uvk',k,ug1,vg1,uup(i,j,k),vvp(i,j,k),
     $              geostr,uv1,(ug1*u1+vg1*v1)/(geostr*uv1)
            enddo
         enddo
      enddo
*     stop
*
*     call hpdeallc (pat_z0, err, 1)
*     call hpdeallc (pat_ue, err, 1)
*     call hpdeallc (pat_tau0, err, 1)
*     call hpdeallc (pat_tau, err, 1)
*     call hpdeallc (pat_taux, err, 1)
*     call hpdeallc (pat_tauy, err, 1)
*
      print *,'draglaw...returning'
      return
      end
*
***s/r intcub_2pts_2d2
*

      subroutine intcub_2pts_2d2(choix,z,f) 3
      implicit none
*
#include "eole.cdk"
*
      real f1,f2,f3,f4,x1,x2,x3,x4
      real f4p,f1pp,f2pp,f3pp
      real z,f
      real a,b,c,d
      character choix
*
*
      x1=haut1
      x2=haut2
      x3=haut3
      x4=haut4
*
      if (choix.eq.'u') then
         f1=uprofil1
         f2=uprofil2
         f3=uprofil3
         f4=uprofil4
      endif
      if (choix.eq.'v') then
         f1=vprofil1
         f2=vprofil2
         f3=vprofil3
         f4=vprofil4
      endif
      if (choix.eq.'t') then
         f1=tprofil1
         f2=tprofil2
         f3=tprofil3
         f4=tprofil4
      endif
*
      f1pp=0.
      f2pp=( ((f3-f2)/(x3-x2)) - ((f2-f1)/(x2-x1)) ) / 
     $      (0.5*(x3-x1))
      f3pp=( ((f4-f3)/(x4-x3)) - ((f3-f2)/(x3-x2)) ) / 
     $      (0.5*(x4-x2))
      if (choix.eq.'t') then
         f4p=(f4-f3)/(x4-x3)
      else
         f4p=0.
      endif

*
*
      if ((z.gt.x4).or.(z.lt.x1)) then
         print*,'intcub_2pts_2d2 : altitude hors du domaine'
         stop
      endif
*
      if (z.le.x2) then
         d=(f2pp-f1pp)/(6.*(x2-x1))
         c=(f1pp-6.*d*x1)/2.
         b=(f2-f1)/(x2-x1) - c*(x2+x1) - d*(x1**2.+x1*x2+x2**2.)
         a=f1-b*x1-c*x1**2.-d*x1**3.
      endif
*
      if ((z.gt.x2).and.(z.le.x3)) then
         d=(f3pp-f2pp)/(6.*(x3-x2))
         c=(f2pp-6.*d*x2)/2.
         b=(f3-f2)/(x3-x2) - c*(x3+x2) - d*(x2**2.+x2*x3+x3**2.)
         a=f2-b*x2-c*x2**2.-d*x2**3.
      endif
*
      if ((z.gt.x3).and.(z.le.x4)) then
         c=1./(-x3+x4+(x3**2.+x3*x4-2.*x4**2.)/(3.*x3)) *
     $       (f4p-(f4-f3)/(x4-x3) + f3pp/(6.*x3) * 
     $       (x3**2.+x3*x4-2.*x4**2.))
         d=(f3pp-2.*c)/(6.*x3)
         b=f4p-2.*c*x4-(f3pp-2.*c)/(2.*x3) * x4**2.
         a=f3-b*x3-c*x3**2.-d*x3**3.
      endif
*
*
      f=a+b*z+c*z**2.+d*z**3.
*
c***debug
      if ( choix .eq. 't' ) then
         write(78,*) 'x1, x2, x3, x4, z=', x1, x2, x3, x4, z
         write(78,*) 'f1, f2, f3, f4, f=', f1, f2, f3, f4, f
      endif
c***debug
*
*
      return
      end