C $Header: /u/gcmpack/MITgcm/pkg/streamice/streamice_vel_solve_openad.F,v 1.3 2015/03/23 14:07:17 dgoldberg Exp $
C $Name: $
#include "STREAMICE_OPTIONS.h"
#ifdef ALLOW_AUTODIFF
# include "AUTODIFF_OPTIONS.h"
#endif
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
CBOP
SUBROUTINE STREAMICE_VEL_SOLVE_OPENAD ( myThid, maxNLIter,
& maxCGiter, myiter )
C /============================================================\
C | SUBROUTINE |
C | o |
C |============================================================|
C | |
C \============================================================/
IMPLICIT NONE
C === Global variables ===
#include "SIZE.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#include "STREAMICE.h"
#include "STREAMICE_CG.h"
#ifdef ALLOW_AUTODIFF_TAMC
# include "tamc.h"
#endif
C !INPUT/OUTPUT ARGUMENTS
INTEGER myThid
INTEGER maxNLIter
INTEGER maxCGIter
INTEGER myIter
#ifdef ALLOW_STREAMICE
C LOCAL VARIABLES
INTEGER i, j, k, l, bi, bj, loopiter
CHARACTER*(MAX_LEN_MBUF) msgBuf
INTEGER NL_iter
_RL err_last_change, cgtol, err_init
LOGICAL CONVERGED
#ifdef ALLOW_OPENAD
INTEGER ADJ_ITER
LOGICAL ADJ_CONVERGED
#endif
#ifdef ALLOW_STREAMICE_OAD_FP
isinloop0 =0
isinloop1 =1
isinloop2 =2
#endif
#if (defined (ALLOW_STREAMICE_OAD_FP))
IF (STREAMICE_ppm_driving_stress) THEN
CALL STREAMICE_DRIVING_STRESS_PPM (myThid)
ELSE
CALL STREAMICE_DRIVING_STRESS (myThid)
ENDIF
#ifdef STREAMICE_STRESS_BOUNDARY_CONTROL
_EXCH_XY_RL( taudx_SI , myThid )
_EXCH_XY_RL( taudy_SI , myThid )
CALL STREAMICE_FORCED_BUTTRESS (myThid)
#endif
CALL TIMER_START ('STREAMICE_VEL_SOLVE',myThid)
cgtol = streamice_cg_tol
nl_iter = 0
CONVERGED = .false.
err_last_change = 1 _d 1
_EXCH_XY_RL( taudx_SI , myThid )
_EXCH_XY_RL( taudy_SI , myThid )
DO bj = myByLo(myThid), myByHi(myThid)
DO bi = myBxLo(myThid), myBxHi(myThid)
DO j=1-OLy,sNy+OLy
DO i=1-OLx,sNx+OLx
U_streamice (i,j,bi,bj)=U_streamice (i,j,bi,bj)
& + 0*u_new_SI (i,j,bi,bj)
V_streamice (i,j,bi,bj)=V_streamice (i,j,bi,bj)
& + 0*v_new_SI (i,j,bi,bj)
ENDDO
ENDDO
ENDDO
ENDDO
#ifdef STREAMICE_HYBRID_STRESS
CALL STREAMICE_VISC_BETA_HYBRID ( myThid )
#else
CALL STREAMICE_VISC_BETA ( myThid )
#endif
if (STREAMICE_chkresidconvergence .or.
& (streamice_maxnliter_cpl.eq.0 .and. myIter.eq.0)) then
CALL STREAMICE_GET_VEL_RESID_ERR_OAD ( err_init, myThid )
err_last_change = err_init
WRITE(msgBuf,'(A,E15.7)') 'initial nonlinear resid (error): ',
& err_init
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
& SQUEEZE_RIGHT , 1)
endif
#ifndef ALLOW_OPENAD
CALL STREAMICE_VEL_PHISTAGE (
I myThid,
I maxNLIter,
I maxCGiter,
O cgtol,
O nL_iter,
O CONVERGED,
O err_last_change,
O err_init,
I isinloop0)
#else
CALL STREAMICE_VEL_PHISTAGE (
I myThid,
I maxNLIter,
I maxCGiter,
O cgtol,
O nL_iter,
O adj_iter,
O CONVERGED,
O ADJ_CONVERGED,
O err_last_change,
O err_init,
I isinloop0)
#endif
DO loopiter=1,maxNLIter
C To avoid using "exit", loop goes through all iterations
C but after convergence loop does nothing
! IF (.not.CONVERGED) THEN
#ifndef ALLOW_OPENAD
CALL STREAMICE_VEL_PHISTAGE (
I myThid,
I maxNLIter,
I maxCGiter,
O cgtol,
O nL_iter,
O CONVERGED,
O err_last_change,
O err_init,
I isinloop1)
#else
CALL STREAMICE_VEL_PHISTAGE (
I myThid,
I maxNLIter,
I maxCGiter,
O cgtol,
O nL_iter,
O adj_iter,
O CONVERGED,
O ADJ_CONVERGED,
O err_last_change,
O err_init,
I isinloop1)
#endif
!DO bj = myByLo(myThid), myByHi(myThid)
! DO bi = myBxLo(myThid), myBxHi(myThid)
! DO j=1-OLy,sNy+OLy
! DO i=1-OLx,sNx+OLx
! U_streamice (i,j,bi,bj)=u_new_SI (i,j,bi,bj)
! V_streamice (i,j,bi,bj)=v_new_SI (i,j,bi,bj)
! ENDDO
! ENDDO
! ENDDO
!ENDDO
ENDDO
#ifndef ALLOW_OPENAD
CALL STREAMICE_VEL_PHISTAGE (
I myThid,
I maxNLIter,
I maxCGiter,
O cgtol,
O nL_iter,
O CONVERGED,
O err_last_change,
O err_init,
I isinloop2)
#else
CALL STREAMICE_VEL_PHISTAGE (
I myThid,
I maxNLIter,
I maxCGiter,
O cgtol,
O nL_iter,
O adj_iter,
O CONVERGED,
O ADJ_CONVERGED,
O err_last_change,
O err_init,
I isinloop2)
#endif
C END NL ITER. LOOP
C-------------------------------------------------------------------
if (nl_iter .lt. streamice_max_nl_iter) then
WRITE(msgBuf,'(A,I5,A)') 'VELOCITY SOLVE CONVERGED, ',
& nl_iter, ' iterations'
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
& SQUEEZE_RIGHT , 1)
else
WRITE(msgBuf,'(A,I5,A)') 'VELOCITY SOLVE NOT CONVERGED IN ',
& nl_iter, ' iterations'
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
& SQUEEZE_RIGHT , 1)
endif
_EXCH_XY_RL(U_streamice, myThid)
_EXCH_XY_RL(V_streamice, myThid)
CALL TIMER_STOP ('STREAMICE_VEL_SOLVE',myThid)
#endif
#endif
RETURN
END