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

Contents of /MITgcm/model/src/ini_vertical_grid.F

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


Revision 1.17 - (show annotations) (download)
Wed Nov 29 04:39:06 2006 UTC (17 years, 6 months ago) by jmc
Branch: MAIN
Changes since 1.16: +96 -58 lines
setting both delR & delRc => no assumption on vertical grid (center@middle
 or interface@middle) ; + allow to load delR & delRc from (binary) file.

1 C $Header: /u/gcmpack/MITgcm/model/src/ini_vertical_grid.F,v 1.16 2006/11/28 22:49:29 jmc Exp $
2 C $Name: $
3
4 #include "CPP_OPTIONS.h"
5
6 CBOP
7 C !ROUTINE: INI_VERTICAL_GRID
8 C !INTERFACE:
9 SUBROUTINE INI_VERTICAL_GRID( myThid )
10
11 C !DESCRIPTION: \bv
12 C *==========================================================*
13 C | SUBROUTINE INI_VERTICAL_GRID
14 C | o Initialise vertical gridding arrays
15 C *==========================================================*
16 C \ev
17
18 C !USES:
19 IMPLICIT NONE
20 C === Global variables ===
21 #include "SIZE.h"
22 #include "EEPARAMS.h"
23 #include "PARAMS.h"
24 #include "GRID.h"
25
26 C !INPUT/OUTPUT PARAMETERS:
27 C == Routine arguments ==
28 C myThid :: my Thread Id number
29 INTEGER myThid
30
31 C !LOCAL VARIABLES:
32 C == Local variables ==
33 C k :: loop index
34 C msgBuf :: Informational/error meesage buffer
35 INTEGER k
36 _RL tmpRatio, checkRatio1, checkRatio2
37 CHARACTER*(MAX_LEN_MBUF) msgBuf
38 CEOP
39
40 _BEGIN_MASTER(myThid)
41
42 C-- Set factors required for mixing pressure and meters as vertical coordinate.
43 C rkSign is a "sign" parameter which is used where the orientation of the vertical
44 C coordinate (pressure or meters) relative to the vertical index (k) is important.
45 C rkSign = -1 applies when k and the coordinate are in the opposite sense.
46 C rkSign = 1 applies when k and the coordinate are in the same sense.
47 rkSign = -1. _d 0
48 gravitySign = -1. _d 0
49 IF ( usingPCoords ) THEN
50 gravitySign = 1. _d 0
51 ENDIF
52
53 IF ( .NOT.(setCenterDr.OR.setInterFDr) ) THEN
54 WRITE(msgBuf,'(A)')
55 & 'S/R INI_VERTICAL_GRID: neither delR nor delRc are defined'
56 CALL PRINT_ERROR( msgBuf, myThid )
57 WRITE(msgBuf,'(A)')
58 & 'S/R INI_VERTICAL_GRID: Need at least 1 of the 2 (delR,delRc)'
59 CALL PRINT_ERROR( msgBuf, myThid )
60 STOP 'ABNORMAL END: S/R INI_VERTICAL_GRID'
61 ENDIF
62
63 C--- Set Level r-thickness (drF) and Center r-distances (drC)
64 IF (setInterFDr) THEN
65 C-- Interface r-distances are defined:
66 DO k=1,Nr
67 drF(k) = delR(k)
68 ENDDO
69 C- Check that all thickness are > 0 :
70 DO k=1,Nr
71 IF (delR(k).LE.0.) THEN
72 WRITE(msgBuf,'(A,I4,A,E16.8)')
73 & 'S/R INI_VERTICAL_GRID: delR(k=',k,' )=',delR(k)
74 CALL PRINT_ERROR( msgBuf, myThid )
75 WRITE(msgBuf,'(A)')
76 & 'S/R INI_VERTICAL_GRID: Vert. grid spacing MUST BE > 0'
77 CALL PRINT_ERROR( msgBuf, myThid )
78 STOP 'ABNORMAL END: S/R INI_VERTICAL_GRID'
79 ENDIF
80 ENDDO
81 ELSE
82 C-- Interface r-distances undefined:
83 C assume Interface at middle between 2 Center
84 drF(1) = delRc(1)
85 DO k=2,Nr
86 drF(k-1) = 0.5 _d 0 *delRc(k) + drF(k-1)
87 drF( k ) = 0.5 _d 0 *delRc(k)
88 ENDDO
89 drF(Nr) = delRc(Nr+1) + drF(Nr)
90 ENDIF
91
92 IF (setCenterDr) THEN
93 C-- Cell Center r-distances are defined:
94 DO k=1,Nr
95 drC(k) = delRc(k)
96 ENDDO
97 C- Check that all thickness are > 0 :
98 DO k=1,Nr+1
99 IF (delRc(k).LE.0.) THEN
100 WRITE(msgBuf,'(A,I4,A,E16.8)')
101 & 'S/R INI_VERTICAL_GRID: delRc(k=',k,' )=',delRc(k)
102 CALL PRINT_ERROR( msgBuf, myThid )
103 WRITE(msgBuf,'(A)')
104 & 'S/R INI_VERTICAL_GRID: Vert. grid spacing MUST BE > 0'
105 CALL PRINT_ERROR( msgBuf, myThid )
106 STOP 'ABNORMAL END: S/R INI_VERTICAL_GRID'
107 ENDIF
108 ENDDO
109 ELSE
110 C-- Cell Center r-distances undefined:
111 C assume Center at middle between 2 Interfaces
112 drC(1) = 0.5 _d 0 *delR(1)
113 DO k=2,Nr
114 drC(k) = 0.5 _d 0 *(delR(k-1)+delR(k))
115 ENDDO
116 ENDIF
117
118 C--- Set r-position of interFace (rF) and cell-Center (rC):
119 rF(1) = Ro_SeaLevel
120 DO k=1,Nr
121 rF(k+1) = rF(k) + rkSign*drF(k)
122 ENDDO
123 rC(1) = rF(1) + rkSign*drC(1)
124 DO k=2,Nr
125 rC(k) = rC(k-1) + rkSign*drC(k)
126 ENDDO
127
128 C--- Check vertical discretization :
129 checkRatio2 = 100.
130 checkRatio1 = 1. _d 0 / checkRatio2
131 DO k=1,Nr
132 tmpRatio = 0.
133 IF ( (rC(k)-rF(k+1)) .NE. 0. )
134 & tmpRatio = (rF(k)-rC(k)) / (rC(k)-rF(k+1))
135 IF ( tmpRatio.LT.checkRatio1 .OR. tmpRatio.GT.checkRatio2 ) THEN
136 c write(0,*) 'drF=',drF
137 c write(0,*) 'drC=',drC
138 c write(0,*) 'rF=',rF
139 c write(0,*) 'rC=',rC
140 WRITE(msgBuf,'(A,I4,A,E16.8)')
141 & 'S/R INI_VERTICAL_GRID: Invalid relative position, level k=',
142 & k, ' :', tmpRatio
143 CALL PRINT_ERROR( msgBuf, myThid )
144 WRITE(msgBuf,'(A,1PE14.6,A,2E14.6)')
145 & 'S/R INI_VERTICAL_GRID: rC=', rC(k),
146 & ' , rF(k,k+1)=',rF(k),rF(k+1)
147 CALL PRINT_ERROR( msgBuf, myThid )
148 STOP 'ABNORMAL END: S/R INI_VERTICAL_GRID'
149 ENDIF
150 ENDDO
151
152 C- Calculate reciprol vertical grid spacing :
153 DO k=1,Nr
154 recip_drC(k) = 1. _d 0/drC(k)
155 recip_drF(k) = 1. _d 0/drF(k)
156 ENDDO
157
158 _END_MASTER(myThid)
159 _BARRIER
160
161 RETURN
162 END

  ViewVC Help
Powered by ViewVC 1.1.22