/[MITgcm]/MITgcm/model/src/calc_surf_dr.F
ViewVC logotype

Annotation of /MITgcm/model/src/calc_surf_dr.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.19 - (hide annotations) (download)
Fri Jun 1 18:42:24 2012 UTC (11 years, 11 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint64, checkpoint65, checkpoint63p, checkpoint63q, checkpoint63r, checkpoint63s, checkpoint63n, checkpoint63o, checkpoint64y, checkpoint64x, checkpoint64z, checkpoint64q, checkpoint64p, checkpoint64s, checkpoint64r, checkpoint64u, checkpoint64t, checkpoint64w, checkpoint64v, checkpoint64i, checkpoint64h, checkpoint64k, checkpoint64j, checkpoint64m, checkpoint64l, checkpoint64o, checkpoint64n, checkpoint64a, checkpoint64c, checkpoint64b, checkpoint64e, checkpoint64d, checkpoint64g, checkpoint64f
Changes since 1.18: +6 -6 lines
also use h0FacC to compute hFac_surfC (more similar to calc_r_star.F).

1 jmc 1.19 C $Header: /u/gcmpack/MITgcm/model/src/calc_surf_dr.F,v 1.18 2012/06/01 03:22:02 jmc Exp $
2 jmc 1.1 C $Name: $
3    
4 jmc 1.16 #include "PACKAGES_CONFIG.h"
5 jmc 1.1 #include "CPP_OPTIONS.h"
6    
7 cnh 1.3 CBOP
8     C !ROUTINE: CALC_SURF_DR
9     C !INTERFACE:
10 jmc 1.16 SUBROUTINE CALC_SURF_DR( etaFld,
11     I myTime, myIter, myThid )
12 cnh 1.3 C !DESCRIPTION: \bv
13     C *==========================================================*
14 jmc 1.11 C | SUBROUTINE CALC_SURF_DR
15     C | o Calculate the new surface level thickness according to
16     C | the surface r-position (Non-Linear Free-Surf)
17     C | o take decision if grid box becomes too thin or too thick
18 cnh 1.3 C *==========================================================*
19     C \ev
20    
21     C !USES:
22 jmc 1.1 IMPLICIT NONE
23     C == Global variables
24     #include "SIZE.h"
25     #include "EEPARAMS.h"
26     #include "PARAMS.h"
27     #include "GRID.h"
28     #include "SURFACE.h"
29    
30 cnh 1.3 C !INPUT/OUTPUT PARAMETERS:
31 jmc 1.1 C == Routine arguments ==
32 jmc 1.16 C etaFld :: current eta field used to update the hFactor
33     C myTime :: current time in simulation
34     C myIter :: current iteration number in simulation
35     C myThid :: thread number for this instance of the routine.
36 jmc 1.18 _RL etaFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
37 jmc 1.1 _RL myTime
38     INTEGER myIter
39     INTEGER myThid
40    
41     #ifdef NONLIN_FRSURF
42    
43 cnh 1.3 C !LOCAL VARIABLES:
44 jmc 1.1 C Local variables
45 cnh 1.3 C i,j,k,bi,bj :: loop counter
46     C rSurftmp :: free surface r-position that is used to compute hFac_surf
47     C adjust_nb_pt :: Nb of grid points where rSurf is adjusted (hFactInf)
48     C adjust_volum :: adjustment effect on the volume (domain size)
49 jmc 1.7 C numbWrite :: count the Number of warning written on STD-ERR file
50     C numbWrMax :: maximum Number of warning written on STD-ERR file
51 jmc 1.6 INTEGER i,j,bi,bj
52 jmc 1.7 INTEGER ks, numbWrite, numbWrMax
53 jmc 1.11 _RL hFactmp, adjust_nb_pt, adjust_volum
54 jmc 1.2 _RL rSurftmp(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
55 jmc 1.1 _RS hhm, hhp
56 jmc 1.13 c CHARACTER*(MAX_LEN_MBUF) suff
57 cnh 1.3 CEOP
58 jmc 1.7 DATA numbWrite / 0 /
59     numbWrMax = Nx*Ny
60 jmc 1.1
61     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
62    
63 jmc 1.2 adjust_nb_pt = 0.
64     adjust_volum = 0.
65    
66 jmc 1.1 DO bj=myByLo(myThid), myByHi(myThid)
67     DO bi=myBxLo(myThid), myBxHi(myThid)
68 jmc 1.16
69 gforget 1.15 C-- before updating hFac_surfC/S/W save current fields
70 jmc 1.18 DO j=1-OLy,sNy+OLy
71     DO i=1-OLx,sNx+OLx
72 gforget 1.15 hFac_surfNm1C(i,j,bi,bj) = hFac_surfC(i,j,bi,bj)
73     hFac_surfNm1S(i,j,bi,bj) = hFac_surfS(i,j,bi,bj)
74     hFac_surfNm1W(i,j,bi,bj) = hFac_surfW(i,j,bi,bj)
75     ENDDO
76     ENDDO
77 jmc 1.2
78     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
79 jmc 1.16 C-- Compute the new fractional thickness of surface level (kSurfC):
80 jmc 1.2
81     DO j=0,sNy+1
82     DO i=0,sNx+1
83     rSurftmp(i,j) = Ro_surf(i,j,bi,bj)+etaFld(i,j,bi,bj)
84 jmc 1.16 ks = kSurfC(i,j,bi,bj)
85 jmc 1.1 IF (ks.LE.Nr) THEN
86 jmc 1.2 IF (rSurftmp(i,j) .LT. Rmin_surf(i,j,bi,bj)) THEN
87     C-- Needs to do something :
88 jmc 1.7 IF (numbWrite.LE.numbWrMax) THEN
89 jmc 1.13 numbWrite = numbWrite + 1
90 jmc 1.19 hFactmp = h0FacC(i,j,ks,bi,bj)
91     & + ( rSurftmp(i,j) - Ro_surf(i,j,bi,bj) )*recip_drF(ks)
92 jmc 1.1 IF (hFactmp.LT.hFacInf) THEN
93 jmc 1.13 WRITE(errorMessageUnit,'(2A,6I4,I10)')
94 jmc 1.7 & 'WARNING: hFacC < hFacInf at:',
95 jmc 1.1 & ' i,j,k,bi,bj,Thid,Iter=',i,j,ks,bi,bj,myThid,myIter
96 jmc 1.2 ELSE
97 jmc 1.13 WRITE(errorMessageUnit,'(2A,6I4,I10)')
98 jmc 1.7 & 'WARNING: hFac < hFacInf near:',
99 jmc 1.2 & ' i,j,k,bi,bj,Thid,Iter=',i,j,ks,bi,bj,myThid,myIter
100 jmc 1.1 ENDIF
101 jmc 1.7 WRITE(errorMessageUnit,'(A,2F10.6,1PE14.6)')
102     & 'hFac_n-1,hFac_n,eta =',
103 jmc 1.2 & hfacC(i,j,ks,bi,bj), hFactmp, etaFld(i,j,bi,bj)
104 jmc 1.7 ENDIF
105 jmc 1.2 C-- Decide to STOP :
106 jmc 1.13 c WRITE(errorMessageUnit,'(A)')
107 jmc 1.7 c & 'STOP in CALC_SURF_DR : too SMALL hFac !'
108 jmc 1.13 c STOP 'ABNORMAL END: S/R CALC_SURF_DR'
109 jmc 1.2 C----------
110    
111     C-- Continue with Rmin_surf:
112     IF ( i.GE.1.AND.i.LE.sNx .AND.
113     & j.GE.1.AND.j.LE.sNy ) THEN
114     adjust_nb_pt = adjust_nb_pt + 1.
115 jmc 1.13 adjust_volum = adjust_volum
116 jmc 1.2 & + rA(i,j,bi,bj)*(Rmin_surf(i,j,bi,bj)-rSurftmp(i,j))
117     ENDIF
118     rSurftmp(i,j) = Rmin_surf(i,j,bi,bj)
119     C----------
120     ENDIF
121    
122     C-- Set hFac_surfC :
123 jmc 1.19 hFac_surfC(i,j,bi,bj) = h0FacC(i,j,ks,bi,bj)
124     & + ( rSurftmp(i,j) - Ro_surf(i,j,bi,bj)
125     & )*recip_drF(ks)*maskC(i,j,ks,bi,bj)
126 jmc 1.2
127     C-- Usefull warning when hFac becomes very large:
128 jmc 1.8 IF ( numbWrite.LE.numbWrMax .AND.
129     & hFac_surfC(i,j,bi,bj).GT.hFacSup ) THEN
130 jmc 1.13 numbWrite = numbWrite + 1
131     WRITE(errorMessageUnit,'(2A,6I4,I10)')
132 jmc 1.7 & 'WARNING: hFacC > hFacSup at:',
133 jmc 1.1 & ' i,j,k,bi,bj,Thid,Iter=',i,j,ks,bi,bj,myThid,myIter
134 jmc 1.13 WRITE(errorMessageUnit,'(A,2F10.6,1PE14.6)')
135 jmc 1.7 & 'hFac_n-1,hFac_n,eta =', hfacC(i,j,ks,bi,bj),
136     & hFac_surfC(i,j,bi,bj), etaFld(i,j,bi,bj)
137 jmc 1.8 ENDIF
138 jmc 1.1 C----------
139     ENDIF
140 jmc 1.2
141 jmc 1.1 ENDDO
142     ENDDO
143    
144     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
145     C-- Compute fractional thickness of surface level, for U & V point:
146    
147     DO j=1,sNy
148     DO i=1,sNx+1
149 jmc 1.16 ks = kSurfW(i,j,bi,bj)
150 jmc 1.1 IF (ks.LE.Nr) THEN
151 jmc 1.2 hhm = rF(ks)
152 jmc 1.16 IF(ks.EQ.kSurfC(i-1,j,bi,bj)) hhm = rSurftmp(i-1,j)
153 jmc 1.2 hhp = rF(ks)
154 jmc 1.16 IF(ks.EQ.kSurfC(i,j,bi,bj)) hhp = rSurftmp(i,j)
155 jmc 1.18 hFac_surfW(i,j,bi,bj) = h0FacW(i,j,ks,bi,bj)
156     & + ( MIN(hhm,hhp)
157     & - MIN( Ro_surf(i-1,j,bi,bj), Ro_surf(i,j,bi,bj) )
158     & )*recip_drF(ks)*maskW(i,j,ks,bi,bj)
159 jmc 1.1 ENDIF
160     ENDDO
161     ENDDO
162 jmc 1.2
163 jmc 1.1 DO j=1,sNy+1
164     DO i=1,sNx
165 jmc 1.16 ks = kSurfS(i,j,bi,bj)
166 jmc 1.1 IF (ks.LE.Nr) THEN
167 jmc 1.2 hhm = rF(ks)
168 jmc 1.16 IF(ks.EQ.kSurfC(i,j-1,bi,bj)) hhm = rSurftmp(i,j-1)
169 jmc 1.2 hhp = rF(ks)
170 jmc 1.16 IF(ks.EQ.kSurfC(i,j,bi,bj)) hhp = rSurftmp(i,j)
171 jmc 1.18 hFac_surfS(i,j,bi,bj) = h0FacS(i,j,ks,bi,bj)
172     & + ( MIN(hhm,hhp)
173     & - MIN( Ro_surf(i,j-1,bi,bj), Ro_surf(i,j,bi,bj) )
174     & )*recip_drF(ks)*maskS(i,j,ks,bi,bj)
175 jmc 1.1 ENDIF
176     ENDDO
177     ENDDO
178 jmc 1.2
179 jmc 1.16 #ifdef ALLOW_OBCS
180     C-- Apply OBC to hFac_surfW,S before the EXCH calls
181     IF ( useOBCS ) THEN
182     CALL OBCS_APPLY_SURF_DR(
183     I bi, bj, etaFld,
184     U hFac_surfC, hFac_surfW, hFac_surfS,
185 jmc 1.17 I myTime, myIter, myThid )
186 jmc 1.16 ENDIF
187     #endif /* ALLOW_OBCS */
188    
189 jmc 1.2 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
190    
191     C- end bi,bj loop.
192 jmc 1.1 ENDDO
193     ENDDO
194    
195 jmc 1.2 C-- Global diagnostic :
196 jmc 1.14 _GLOBAL_SUM_RL( adjust_nb_pt , myThid )
197 jmc 1.18 IF ( adjust_nb_pt.GE.1. ) THEN
198     _GLOBAL_SUM_RL( adjust_volum , myThid )
199 jmc 1.13 _BEGIN_MASTER( myThid )
200     WRITE(standardMessageUnit,'(2(A,I10),1PE16.8)')
201 jmc 1.7 & ' SURF_ADJUSTMENT: Iter=', myIter,
202     & ' Nb_pts,Vol=', nint(adjust_nb_pt), adjust_volum
203     _END_MASTER( myThid )
204 jmc 1.2 ENDIF
205    
206 jmc 1.14 _EXCH_XY_RS(hFac_surfC, myThid )
207 jmc 1.1 CALL EXCH_UV_XY_RS(hFac_surfW,hFac_surfS,.FALSE.,myThid)
208 jmc 1.5
209 jmc 1.2 C-----
210 jmc 1.16 C Note: testing kSurfW,S is equivalent to a full height mask
211 jmc 1.2 C ==> no need for applying the mask here.
212     C and with "partial thin wall" ==> mask could be applied in S/R UPDATE_SURF_DR
213     C-----
214 jmc 1.1
215 jmc 1.12 c IF ( myIter.GE.0 ) THEN
216     c WRITE(suff,'(I10.10)') myIter
217     c CALL WRITE_FLD_XY_RS( 'hFac_surfC.', suff, hFac_surfC,
218 jmc 1.13 c & myIter, myThid )
219 jmc 1.12 c ENDIF
220 jmc 1.1
221     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
222     #endif /* NONLIN_FRSURF */
223    
224     RETURN
225     END

  ViewVC Help
Powered by ViewVC 1.1.22