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

Diff of /MITgcm/model/src/ini_model_io.F

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

revision 1.6 by edhill, Wed Sep 22 21:19:44 2004 UTC revision 1.28 by jmc, Mon May 11 02:29:32 2009 UTC
# Line 1  Line 1 
1  C $Header$  C $Header$
2  C $Name$  C $Name$
3    
 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|  
   
4  #include "PACKAGES_CONFIG.h"  #include "PACKAGES_CONFIG.h"
5  #include "CPP_OPTIONS.h"  #include "CPP_OPTIONS.h"
6    
7  CBOP  CBOP
8  C     !ROUTINE: INI_MODEL_IO  C     !ROUTINE: INI_MODEL_IO
9    
10  C     !INTERFACE:  C     !INTERFACE:
11        SUBROUTINE INI_MODEL_IO( myThid )        SUBROUTINE INI_MODEL_IO( myThid )
12    
13  C     !DESCRIPTION: \bv  C     !DESCRIPTION:
14  C     ini_model_io() is where run-time/experiment specific data are passed  C     Pass specific setup data for mdsio/rw.
 C     to any I/O packages ready that will be used for I/O of model state  
 C     variables.  
 C     This is specifically for setting up once only information such as  
 C     shape/size of variables, units, etc... and is only for state variables.  
 C     \ev  
   
 C     !CALLING SEQUENCE:  
 C     PACKAGES_INIT_FIXED  
 C       |  
 C       |-- MNC_INIT  
15    
16    C     !USES:
17        IMPLICIT NONE        IMPLICIT NONE
18  #include "SIZE.h"  #include "SIZE.h"
 #include "GRID.h"  
19  #include "EEPARAMS.h"  #include "EEPARAMS.h"
20    #include "EESUPPORT.h"
21  #include "PARAMS.h"  #include "PARAMS.h"
22  #ifdef ALLOW_MNC  #include "RESTART.h"
23  #include "MNC_PARAMS.h"  #ifdef ALLOW_EXCH2
24  #endif  c#include "W2_EXCH2_SIZE.h"
25    # include "W2_EXCH2_TOPOLOGY.h"
26    # include "W2_EXCH2_PARAMS.h"
27    #endif /* ALLOW_EXCH2 */
28    #ifdef ALLOW_MDSIO
29    # include "MDSIO_SCPU.h"
30    #endif /* ALLOW_MDSIO */
31    
32  C     !INPUT/OUTPUT PARAMETERS:  C     !INPUT/OUTPUT PARAMETERS:
33  C     myThid -  Number of this instances  C     myThid :: my Thread Id number
34        INTEGER myThid        INTEGER myThid
35    
36    C     !FUNCTIONS
37          INTEGER  ILNBLNK
38          EXTERNAL ILNBLNK
39    
40    C     !LOCAL VARIABLES:
41    C     msgBuf :: Informational/error meesage buffer
42          CHARACTER*(MAX_LEN_MBUF) msgBuf
43          CHARACTER*(MAX_LEN_FNAM) namBuf
44          INTEGER   iL, pIL
45    #ifdef ALLOW_EXCH2
46          INTEGER xySize
47    #endif /* ALLOW_EXCH2 */
48    #ifdef ALLOW_USE_MPI
49          INTEGER iG,jG,np
50    #endif /* ALLOW_USE_MPI */
51    #ifdef ALLOW_MDSIO
52          INTEGER i
53    #endif /* ALLOW_MDSIO */
54  CEOP  CEOP
55    
56    C-    Safety check:
57          IF ( nPx*nPy.NE.1 .AND. globalFiles ) THEN
58            _BEGIN_MASTER( myThid )
59    c       WRITE(msgBuf,'(2A)')
60    c    &   'INI_MODEL_IO: globalFiles=TRUE is not safe',
61    c    &   ' in Multi-processors (MPI) run'
62    c       CALL PRINT_ERROR( msgBuf , myThid)
63    c       WRITE(msgBuf,'(2A)')
64    c    &   'INI_MODEL_IO: use instead "useSingleCpuIO=.TRUE."'
65    c       CALL PRINT_ERROR( msgBuf , myThid)
66    c       STOP 'ABNORMAL END: S/R INI_MODEL_IO'
67    C------
68    C   GlobalFiles option with Multi-processors execution (with MPI) is not
69    C   safe: dependending on the platform & compiler, it may produce:
70    C    - incomplete output files (wrong size)
71    C    - wrong isolated values in some output files
72    C    - missing tiles (all zeros) in some output files.
73    C   A safe alternative is to set "useSingleCpuIO=.TRUE." in file "data",
74    C     namelist PARAM01  (and to keep the default value of globalFiles=FALSE)
75    C   or if you are really sure that the globalFile works well on our platform
76    C     & compiler, comment out the above "stop"
77    C-----
78            WRITE(msgBuf,'(2A)')
79         &   '** WARNING ** INI_MODEL_IO: globalFiles=TRUE is not safe',
80         &   ' in Multi-processors (MPI) run'
81            CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
82         &                      SQUEEZE_RIGHT , myThid)
83            WRITE(msgBuf,'(2A)') '** WARNING ** INI_MODEL_IO:',
84         &   ' use instead "useSingleCpuIO=.TRUE."'
85            CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
86         &                      SQUEEZE_RIGHT , myThid)
87            _END_MASTER( myThid )
88          ENDIF
89    
90    C-    Check size of IO buffers:
91          IF ( useSingleCpuIO ) THEN
92    c       xySize = Nx*Ny
93    #if defined(ALLOW_EXCH2) && !defined(MISSING_TILE_IO)
94            xySize = exch2_global_Nx*exch2_global_Ny
95            IF ( xySize.GT.W2_ioBufferSize ) THEN
96              WRITE(msgBuf,'(A,I10)')
97         &     'INI_MODEL_IO: W2_ioBufferSize=',W2_ioBufferSize
98              CALL PRINT_ERROR( msgBuf, myThid )
99              WRITE(msgBuf,'(A,I10,A)')
100         &     ' <', xySize,' = Size of Global 2-D map'
101              CALL PRINT_ERROR( msgBuf, myThid )
102              WRITE(msgBuf,'(2A)') ' Must increase "W2_ioBufferSize"',
103         &                         ' in "W2_EXCH2_SIZE.h" + recompile'
104              CALL PRINT_ERROR( msgBuf, myThid )
105              STOP 'ABNORMAL END: S/R INI_MODEL_IO (buffer size)'
106            ENDIF
107    #else /* defined(ALLOW_EXCH2) && !defined(MISSING_TILE_IO) */
108    #ifdef ALLOW_USE_MPI
109    C-  Although using mpi_myX,YGlobalLo is more general, if they happen
110    C   to be different from iG,jG then mapping into global 2D array is
111    C   very likely to go wrong ; check and stop.
112             DO np = 1,nPx*nPy
113              iG = MOD(np-1,nPx)
114              jG = (np-1)/nPx
115              iG = 1+iG*nSx*sNx
116              jG = 1+jG*nSy*sNy
117              IF ( mpi_myXGlobalLo(np).NE.iG ) THEN
118               WRITE(msgBuf,'(2A,I4,A,I8,A,I8,A)') 'INI_MODEL_IO: ',
119         &      'myXGlobalLo(np=',np,')=', mpi_myXGlobalLo(np),
120         &       ' <>',iG,' =iGLo'
121               CALL PRINT_ERROR( msgBuf, myThid )
122              ENDIF
123              IF ( mpi_myYGlobalLo(np).NE.jG ) THEN
124               WRITE(msgBuf,'(2A,I4,A,I8,A,I8,A)') 'INI_MODEL_IO: ',
125         &      'myYGlobalLo(np=',np,')=', mpi_myYGlobalLo(np),
126         &       ' <>',jG,' =jGLo'
127               CALL PRINT_ERROR( msgBuf, myThid )
128              ENDIF
129              IF ( mpi_myXGlobalLo(np).NE.iG .OR.
130         &         mpi_myYGlobalLo(np).NE.jG ) THEN
131               STOP 'ABNORMAL END: S/R INI_MODEL_IO wrong iGLo,jGLo'
132              ENDIF
133             ENDDO
134    #endif /* ALLOW_USE_MPI */
135    #endif /* defined(ALLOW_EXCH2) && !defined(MISSING_TILE_IO) */
136          ENDIF
137    C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
138    
139    C-    Only Master-thread updates IO-parameter in Common blocks:
140          _BEGIN_MASTER( myThid )
141    
142    C-    Initialise AB starting level
143    C      notes: those could be modified when reading a pickup that does
144    C             correspond to what is actually needed.
145          tempStartAB = nIter0
146          saltStartAB = nIter0
147          mom_StartAB = nIter0
148          nHydStartAB = nIter0
149          IF ( startFromPickupAB2 ) tempStartAB = MIN( nIter0 , 1 )
150          saltStartAB = tempStartAB
151          mom_StartAB = tempStartAB
152    
153    C-    Initialise Alternating pickup-suffix
154          nCheckLev         = 1
155          checkPtSuff(1)    = 'ckptA'
156          checkPtSuff(2)    = 'ckptB'
157    
158    C-    Flags specific to RW and MDSIO
159    
160    C-    now we make local directories with myProcessStr appended
161          IF ( mdsioLocalDir .NE. ' ' ) THEN
162            iL = ILNBLNK( mdsioLocalDir )
163            WRITE(namBuf,'(3A)')
164         &         ' mkdir -p ', mdsioLocalDir(1:iL),myProcessStr(1:4)
165            pIL = 1 + ILNBLNK( namBuf )
166            WRITE(standardMessageUnit,'(3A)')
167         &  '==> SYSTEM CALL (from INI_MODEL_IO): >',namBuf(1:pIL),'<'
168            CALL SYSTEM( namBuf(1:pIL) )
169            namBuf(1:iL) = mdsioLocalDir(1:iL)
170            WRITE(mdsioLocalDir,'(3A)') namBuf(1:iL),myProcessStr(1:4),'/'
171          ENDIF
172    
173    C-    Initialise MFLDS variables in common block
174          CALL READ_MFLDS_INIT( myThid )
175    
 C     Flags specific to RW and MDSIO  
176  C     Set globalFiles flag for READ_WRITE_FLD package  C     Set globalFiles flag for READ_WRITE_FLD package
177        CALL SET_WRITE_GLOBAL_FLD( globalFiles )        CALL SET_WRITE_GLOBAL_FLD( globalFiles )
178  C     Set globalFiles flag for READ_WRITE_REC package  C     Set globalFiles flag for READ_WRITE_REC package
179        CALL SET_WRITE_GLOBAL_REC( globalFiles )        CALL SET_WRITE_GLOBAL_REC( globalFiles )
180  C     Set globalFiles flag for READ_WRITE_REC package  C     Set globalFiles flag for READ_WRITE_PICKUP
181        CALL SET_WRITE_GLOBAL_PICKUP( globalFiles )        CALL SET_WRITE_GLOBAL_PICKUP( globalFiles )
182    
183          _END_MASTER( myThid )
184    C-    Everyone else must wait for the IO-parameters to be set
185          _BARRIER
186    
187    C-    MDSIO IO-buffers initialisation
188    #ifdef ALLOW_MDSIO
189          IF ( useSingleCpuIO ) THEN
190            _BEGIN_MASTER( myThid )
191            DO i=1,xyBuffer_size
192              xy_buffer_r8(i) = 0. _d 0
193              xy_buffer_r4(i) = 0.
194            ENDDO
195            _END_MASTER( myThid )
196          ENDIF
197    #endif /* ALLOW_MDSIO */
198    
199    C-    MNC model-io initialisation
200    
201  #ifdef ALLOW_MNC  #ifdef ALLOW_MNC
202        IF (useMNC) THEN        IF (useMNC) THEN
203    
204  C     Define coordinates for all MNC files ---------------------------------  C       Write units/set precision/etc for I/O of variables/arrays
205  C     XC  C       belonging to the core dynamical model
206        CALL MNC_CW_ADD_VNAME('XC', 'Cen_xy_Hn__-__-', 3,4, myThid)          CALL INI_MNC_VARS( myThid )
       CALL MNC_CW_ADD_VATTR_TEXT('XC','description',  
      &     'X coordinate of cell center (T-P point)',myThid)  
       CALL MNC_CW_ADD_VATTR_TEXT('XC',  
      &     'units', 'degree_east', myThid)  
   
 C     YC  
       CALL MNC_CW_ADD_VNAME('YC', 'Cen_xy_Hn__-__-', 3,4, myThid)  
       CALL MNC_CW_ADD_VATTR_TEXT('YC','description',  
      &     'Y coordinate of cell center (T-P point)',myThid)  
       CALL MNC_CW_ADD_VATTR_TEXT('YC',  
      &     'units', 'degree_north', myThid)  
   
 C     XU  
       CALL MNC_CW_ADD_VNAME('XU', 'U_xy_Hn__-__-', 3,4, myThid)  
       CALL MNC_CW_ADD_VATTR_TEXT('XU','description',  
      &     'X coordinate of U point',myThid)  
       CALL MNC_CW_ADD_VATTR_TEXT('XU',  
      &     'units', 'degree_east', myThid)  
   
 C     YU  
       CALL MNC_CW_ADD_VNAME('YU', 'U_xy_Hn__-__-', 3,4, myThid)  
       CALL MNC_CW_ADD_VATTR_TEXT('YU','description',  
      &     'Y coordinate of U point',myThid)  
       CALL MNC_CW_ADD_VATTR_TEXT('YU',  
      &     'units', 'degree_north', myThid)  
   
 C     XV  
       CALL MNC_CW_ADD_VNAME('XV', 'V_xy_Hn__-__-', 3,4, myThid)  
       CALL MNC_CW_ADD_VATTR_TEXT('XV','description',  
      &     'X coordinate of V point',myThid)  
       CALL MNC_CW_ADD_VATTR_TEXT('XV',  
      &     'units', 'degree_east', myThid)  
   
 C     YV  
       CALL MNC_CW_ADD_VNAME('YV', 'V_xy_Hn__-__-', 3,4, myThid)  
       CALL MNC_CW_ADD_VATTR_TEXT('YV','description',  
      &     'Y coordinate of V point',myThid)  
       CALL MNC_CW_ADD_VATTR_TEXT('YV',  
      &     'units', 'degree_north', myThid)  
   
 C     XG  
       CALL MNC_CW_ADD_VNAME('XG', 'Cor_xy_Hn__-__-', 3,4, myThid)  
       CALL MNC_CW_ADD_VATTR_TEXT('XG','description',  
      &     'X coordinate of cell corner (Vorticity point)',myThid)  
       CALL MNC_CW_ADD_VATTR_TEXT('XG',  
      &     'units', 'degree_east', myThid)  
   
 C     YG  
       CALL MNC_CW_ADD_VNAME('YG', 'Cor_xy_Hn__-__-', 3,4, myThid)  
       CALL MNC_CW_ADD_VATTR_TEXT('YG','description',  
      &     'Y coordinate of cell corner (Vorticity point)',myThid)  
       CALL MNC_CW_ADD_VATTR_TEXT('YG',  
      &     'units', 'degree_north', myThid)  
   
 C     RC  
       CALL MNC_CW_ADD_VNAME('RC', '-_-_--__C__-', 0,0, myThid)  
       CALL MNC_CW_ADD_VATTR_TEXT('RC','description',  
      &     'R coordinate of cell center',myThid)  
       CALL MNC_CW_ADD_VATTR_TEXT('RC',  
      &     'units', 'm', myThid)  
   
 C     RF  
       CALL MNC_CW_ADD_VNAME('RF', '-_-_--__I__-', 0,0, myThid)  
       CALL MNC_CW_ADD_VATTR_TEXT('RF','description',  
      &     'R coordinate of cell interface',myThid)  
       CALL MNC_CW_ADD_VATTR_TEXT('RF',  
      &     'units', 'm', myThid)  
 C     End define coordinates for all MNC files ----------------------------  
   
   
 C     Create MNC definitions for DYNVARS.h variables  
       CALL MNC_CW_ADD_VNAME('iter', '-_-_--__-__t', 0,0, myThid)  
       CALL MNC_CW_ADD_VATTR_TEXT('iter',  
      &     'long_name','iteration_count', myThid)  
   
       CALL MNC_CW_ADD_VNAME('model_time', '-_-_--__-__t', 0,0, myThid)  
       CALL MNC_CW_ADD_VATTR_TEXT('model_time',  
      &     'long_name','Model Time', myThid)  
       CALL MNC_CW_ADD_VATTR_TEXT('model_time','units','s', myThid)  
   
       CALL MNC_CW_ADD_VNAME('U', 'U_xy_Hn__C__t', 4,5, myThid)  
       CALL MNC_CW_ADD_VATTR_TEXT('U','units','m/s', myThid)  
       CALL MNC_CW_ADD_VATTR_TEXT('U',  
      &     'coordinates','XU YU RC iter', myThid)  
   
       CALL MNC_CW_ADD_VNAME('V', 'V_xy_Hn__C__t', 4,5, myThid)  
       CALL MNC_CW_ADD_VATTR_TEXT('V','units','m/s', myThid)  
       CALL MNC_CW_ADD_VATTR_TEXT('V',  
      &     'coordinates','XV YV RC iter', myThid)  
   
       CALL MNC_CW_ADD_VNAME('T', 'Cen_xy_Hn__C__t', 4,5, myThid)  
       CALL MNC_CW_ADD_VATTR_TEXT('T','units','degC', myThid)  
       CALL MNC_CW_ADD_VATTR_TEXT('T','long_name',  
      &     'potential_temperature', myThid)  
       CALL MNC_CW_ADD_VATTR_TEXT('T',  
      &     'coordinates','XC YC RC iter', myThid)  
   
       CALL MNC_CW_ADD_VNAME('S', 'Cen_xy_Hn__C__t', 4,5, myThid)  
       CALL MNC_CW_ADD_VATTR_TEXT('S','long_name',  
      &     'salinity', myThid)  
       CALL MNC_CW_ADD_VATTR_TEXT('S',  
      &     'coordinates','XC YC RC iter', myThid)  
   
       CALL MNC_CW_ADD_VNAME('gUnm1', 'U_xy_Hn__C__t', 4,5, myThid)  
       CALL MNC_CW_ADD_VNAME('gVnm1', 'V_xy_Hn__C__t', 4,5, myThid)  
       CALL MNC_CW_ADD_VNAME('gTnm1', 'Cen_xy_Hn__C__t', 4,5, myThid)  
       CALL MNC_CW_ADD_VNAME('gSnm1', 'Cen_xy_Hn__C__t', 4,5, myThid)  
   
       CALL MNC_CW_ADD_VNAME('Eta', 'Cen_xy_Hn__-__t', 3,4, myThid)  
       CALL MNC_CW_ADD_VATTR_TEXT('Eta','long_name',  
      &     'free-surface_r-anomaly', myThid)  
       CALL MNC_CW_ADD_VATTR_TEXT('Eta','units','m', myThid)  
       CALL MNC_CW_ADD_VATTR_TEXT('Eta',  
      &     'coordinates','XC YC RC iter', myThid)  
   
       CALL MNC_CW_ADD_VNAME('EtaH', 'Cen_xy_Hn__-__t', 3,4, myThid)  
       CALL MNC_CW_ADD_VATTR_TEXT('EtaH','long_name',  
      &     'column-thickness_r-anomaly', myThid)  
       CALL MNC_CW_ADD_VATTR_TEXT('EtaH','units','m', myThid)  
       CALL MNC_CW_ADD_VATTR_TEXT('EtaH',  
      &     'coordinates','XC YC RC iter', myThid)  
       CALL MNC_CW_ADD_VNAME('dEtaHdt', 'Cen_xy_Hn__-__t', 3,4, myThid)  
   
       CALL MNC_CW_ADD_VNAME('W', 'Cen_xy_Hn__C__t', 4,5, myThid)  
       CALL MNC_CW_ADD_VATTR_TEXT('W','units','m/s', myThid)  
       CALL MNC_CW_ADD_VATTR_TEXT('W',  
      &     'coordinates','XC YC RC iter', myThid)  
   
       CALL MNC_CW_ADD_VNAME('phiHyd', 'Cen_xy_Hn__C__t', 4,5, myThid)  
       CALL MNC_CW_ADD_VNAME('phiHydLow', 'Cen_xy_Hn__-__t', 3,4, myThid)  
       CALL MNC_CW_ADD_VNAME('phi_nh', 'Cen_xy_Hn__C__t', 4,5, myThid)  
       CALL MNC_CW_ADD_VNAME('gW', 'Cen_xy_Hn__C__t', 4,5, myThid)  
   
       CALL MNC_CW_ADD_VATTR_TEXT('T',  
      &     'coordinates','XC YC RC iter', myThid)  
   
 C     Write coordinates to "state" file  
       CALL MNC_CW_SET_UDIM('state', 0, myThid)  
       CALL MNC_CW_RS_W('R','state',0,0,'XC',xC, myThid)  
       CALL MNC_CW_RS_W('R','state',0,0,'YC',yC, myThid)  
       CALL MNC_CW_RS_W('R','state',0,0,'XU',xG, myThid)  
       CALL MNC_CW_RS_W('R','state',0,0,'YU',yC, myThid)  
       CALL MNC_CW_RS_W('R','state',0,0,'XV',xC, myThid)  
       CALL MNC_CW_RS_W('R','state',0,0,'YV',yG, myThid)  
       CALL MNC_CW_RS_W('R','state',0,0,'XG',xG, myThid)  
       CALL MNC_CW_RS_W('R','state',0,0,'YG',yG, myThid)  
       CALL MNC_CW_RS_W('R','state',0,0,'RC',rC, myThid)  
       CALL MNC_CW_RS_W('R','state',0,0,'RF',rF, myThid)  
207    
208        ENDIF  #ifdef ALLOW_AUTODIFF
209            CALL AUTODIFF_INI_MODEL_IO( myThid )
210  #endif  #endif
211    
212          ENDIF
213    #endif /* ALLOW_MNC */
214    
215  C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|  C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
216    
217        RETURN        RETURN

Legend:
Removed from v.1.6  
changed lines
  Added in v.1.28

  ViewVC Help
Powered by ViewVC 1.1.22