C $Header: /u/gcmpack/MITgcm/pkg/streamice/streamice_vel_phistage.F,v 1.5 2015/04/20 19:10:58 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 #ifndef ALLOW_OPENAD SUBROUTINE STREAMICE_VEL_PHISTAGE ( I myThid, I maxNLIter, I maxCGiter, O cgtol, O nL_iter, O CONVERGED, O err_last_change, O err_init, I isinloop) #else SUBROUTINE 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 isinloop) #endif 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 _RL cgtol _RL err_last_change _RL err_init _RL err_max INTEGER nL_iter LOGICAL CONVERGED INTEGER isinloop #ifdef ALLOW_OPENAD INTEGER adj_iter LOGICAL adj_CONVERGED #endif #ifdef ALLOW_STREAMICE #if (defined (ALLOW_STREAMICE_OAD_FP)) C LOCAL VARIABLES INTEGER i, j, bi, bj, cg_iters, m _RL err_max_fp, errmax CHARACTER*(MAX_LEN_MBUF) msgBuf #ifdef ALLOW_OPENAD adj_iter=0 adj_CONVERGED=.false. #endif IF(ISINLOOP .ne. 0) THEN IF(.NOT. CONVERGED) THEN NL_ITER = (NL_ITER + 1) CALL STREAMICE_VEL_PHI(MYTHID,MAXNLITER,MAXCGITER,CGTOL +,CG_ITERS,err_max) WRITE(MSGBUF,'(A,I5,A,I4,A)') 'streamice linear solve number', +NL_ITER,' ',CG_ITERS,' iterations ' CALL PRINT_MESSAGE(MSGBUF,STANDARDMESSAGEUNIT,'R',1) C!!!!!!!!!!! conv check if (STREAMICE_chkresidconvergence) then WRITE(msgBuf,'(A,E15.7)') 'err/err_init', err_max/err_init CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, SQUEEZE_RIGH +T , 1) IF (err_max .LE. streamice_nonlin_tol * err_init) THEN CONVERGED = .true. ENDIF IF (err_maxerr_last_change*1.e-2 .and. STREAMICE_lower_cg_to +l) THEN cgtol = cgtol * 5.e-2 err_last_change = err_max WRITE(msgBuf,'(A,E15.7)') 'new cg tol: ', cgtol CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, SQUEEZE_RIG +HT , 1) ENDIF endif if (STREAMICE_chkfixedptconvergence) then CALL STREAMICE_GET_FP_ERR_OAD ( err_max_fp, myThid ) WRITE(msgBuf,'(A,1PE22.14)') 'STREAMICE_FP_ERROR =', err_max_ +fp CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, SQUEEZE_RIGH +T , 1) IF (err_max_fp .LE. streamice_nonlin_tol_fp) THEN CONVERGED = .true. ENDIF 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) #ifdef STREAMICE_HYBRID_STRESS streamice_taubx(i,j,bi,bj)=taubx_new_si(i,j,bi,bj) streamice_tauby(i,j,bi,bj)=tauby_new_si(i,j,bi,bj) DO m=Nr,1,-1 visc_streamice_full(i,j,m,bi,bj)= visc_full_new_si(i,j,m, +bi,bj) ENDDO #endif ENDDO ENDDO ENDDO ENDDO C!!!!!!!!!!! end conv check end
if end
if #endif #endif RETURN END