SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/OFFLIN/init_io_surf_oln.F90
Go to the documentation of this file.
00001 !     #########
00002       SUBROUTINE INIT_IO_SURF_OL_n(HPROGRAM,HMASK,HSCHEME,HACTION)
00003 !     ######################
00004 !
00005 !!****  *INIT_IO_SURF_OL* Keep in memory the netcdf ID of the output files
00006 !!
00007 !!    PURPOSE
00008 !!    -------
00009 !
00010 !!
00011 !!**  IMPLICIT ARGUMENTS
00012 !!    ------------------
00013 !!      None 
00014 !!
00015 !!    REFERENCE
00016 !!    ---------
00017 !!
00018 !!    AUTHOR
00019 !!    ------
00020 !!      F. Habets   *Meteo France*
00021 !!
00022 !!    MODIFICATIONS
00023 !!    -------------
00024 !!      modified 05/04 by P. LeMoigne *Meteo France*
00025 !!      modified 06/10 by S. Faroux *Meteo France*
00026 !!=================================================================
00027 !
00028 !*       0.   DECLARATIONS
00029 !             ------------
00030 !
00031 !
00032 USE MODD_OL_FILEID, ONLY : XVAR_TO_FILEOUT,         &
00033                            XID, XOUT,               &
00034                            XVAR_SURF, XID_SURF,     &
00035                            XVAR_NATURE, XID_NATURE, &
00036                            XVAR_SEA, XID_SEA,       &
00037                            XVAR_WATER, XID_WATER,   &
00038                            XVAR_TOWN, XID_TOWN  
00039 USE MODD_IO_SURF_OL
00040 !
00041 USE MODD_SURFEX_MPI, ONLY : NRANK, NPIO
00042 !
00043 USE MODN_IO_OFFLINE,    ONLY : XTSTEP_OUTPUT
00044 !
00045 USE MODI_GET_LUOUT
00046 USE MODI_READ_SURF
00047 USE MODI_GET_DIM_FULL_n
00048 USE MODI_GET_SIZE_FULL_n
00049 USE MODI_GET_TYPE_DIM_n
00050 USE MODI_INIT_IO_SURF_MASK_n
00051 USE MODI_INIT_OUTFN_FLAKE_n
00052 USE MODI_INIT_OUTFN_ISBA_n
00053 USE MODI_INIT_OUTFN_SEA_n
00054 USE MODI_INIT_OUTFN_SURF_ATM_n
00055 USE MODI_INIT_OUTFN_TEB_n
00056 USE MODI_INIT_OUTFN_WATER_n
00057 USE MODI_WRITE_SURF
00058 !
00059 USE MODD_SURFEX_MPI, ONLY : WLOG_MPI
00060 !
00061 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00062 USE PARKIND1  ,ONLY : JPRB
00063 !
00064 IMPLICIT NONE
00065 !
00066  CHARACTER(LEN=6),  INTENT(IN)  :: HPROGRAM 
00067  CHARACTER(LEN=6),  INTENT(IN)  :: HMASK    
00068  CHARACTER(LEN=6),  INTENT(IN)  :: HSCHEME 
00069  CHARACTER(LEN=5),  INTENT(IN)  :: HACTION 
00070 !
00071 REAL              :: ZDEN
00072 INTEGER           :: IRESP          ! IRESP  : return-code if a problem appears
00073  CHARACTER(LEN=100):: YCOMMENT       ! Comment string
00074 INTEGER           :: ILU,IRET, IL, IFULL
00075 INTEGER           :: ILUOUT
00076 REAL(KIND=JPRB)  :: ZHOOK_HANDLE
00077 !------------------------------------------------------------------------------ 
00078 IF (LHOOK) CALL DR_HOOK('INIT_IO_SURF_OL_N',0,ZHOOK_HANDLE)
00079 !
00080 LMASK = .TRUE.
00081 !
00082  CALL GET_LUOUT(HPROGRAM,ILUOUT)
00083 !
00084 !$OMP BARRIER
00085 !
00086 IF (HACTION=='READ') THEN
00087   CALL READ_SURF('OFFLIN','DIM_FULL',IFULL,IRET)
00088 ELSE 
00089   CALL GET_DIM_FULL_n(IFULL)
00090 ENDIF
00091 !
00092 ! size by MPI task. NINDEX is supposed to be initialized at this step.  
00093  CALL GET_SIZE_FULL_n('OFFLIN',IFULL,ILU)
00094 !
00095 IL = ILU
00096  CALL GET_TYPE_DIM_n(HMASK,IL)
00097  CALL INIT_IO_SURF_MASK_n(HMASK, IL, ILUOUT, ILU, NMASK)
00098 !
00099 IF (HACTION=='READ' .AND. LHOOK) CALL DR_HOOK('INIT_IO_SURF_OL_N',1,ZHOOK_HANDLE)
00100 IF (HACTION=='READ') RETURN
00101 !
00102 IF (NRANK==NPIO) THEN
00103   !
00104 !$OMP SINGLE 
00105   !
00106   IF (.NOT. LDEFINED_SURF_ATM) THEN         
00107     CALL INIT_OUTFN_SURF_ATM_n(HPROGRAM,ILUOUT)
00108     CALL ALLOCATE_FILL_VAR(XVAR_SURF, XID_SURF)
00109     LDEFINED_SURF_ATM=.TRUE.
00110   ENDIF
00111   !
00112   IF (HMASK=='NATURE' .AND. .NOT. LDEFINED_NATURE) THEN
00113     IF (HSCHEME=='ISBA  ') THEN 
00114       CALL INIT_OUTFN_ISBA_n(HPROGRAM,ILUOUT)
00115       CALL ALLOCATE_FILL_VAR(XVAR_NATURE, XID_NATURE)
00116     ENDIF
00117     LDEFINED_NATURE=.TRUE.
00118   ENDIF
00119   !
00120   IF (HMASK=='SEA   ' .AND. .NOT. LDEFINED_SEA) THEN
00121     IF (HSCHEME=='SEAFLX') THEN 
00122       CALL INIT_OUTFN_SEA_n(HPROGRAM,ILUOUT)
00123       CALL ALLOCATE_FILL_VAR(XVAR_SEA, XID_SEA)
00124     ENDIF
00125     LDEFINED_SEA=.TRUE.
00126   ENDIF
00127   !
00128   IF (HMASK=='WATER ' .AND. .NOT. LDEFINED_WATER) THEN
00129     IF (HSCHEME=='WATFLX') CALL INIT_OUTFN_WATER_n(HPROGRAM,ILUOUT)
00130     IF (HSCHEME=='FLAKE ') CALL INIT_OUTFN_FLAKE_n(HPROGRAM,ILUOUT)
00131     IF (HSCHEME=='WATFLX' .OR. HSCHEME=='FLAKE') CALL ALLOCATE_FILL_VAR(XVAR_WATER, XID_WATER)
00132     LDEFINED_WATER=.TRUE.
00133   ENDIF
00134   !
00135   IF (HMASK=='TOWN  ' .AND. .NOT. LDEFINED_TOWN) THEN
00136     IF (HSCHEME=='TEB   ') THEN 
00137       CALL INIT_OUTFN_TEB_n(HPROGRAM,ILUOUT)
00138       CALL ALLOCATE_FILL_VAR(XVAR_TOWN, XID_TOWN)
00139     ENDIF
00140     LDEFINED_TOWN=.TRUE.
00141   ENDIF
00142   !
00143 !$OMP END SINGLE
00144   !  
00145   YCOMMENT=''
00146   !
00147   IF (XTSTEP_OUTPUT == FLOOR(XTSTEP_OUTPUT/86400.)*86400) THEN 
00148     ZDEN = 86400.
00149   ELSEIF (XTSTEP_OUTPUT == FLOOR(XTSTEP_OUTPUT/3600.)*3600) THEN
00150     ZDEN = 3600.
00151   ELSEIF (XTSTEP_OUTPUT == FLOOR(XTSTEP_OUTPUT/60.)*60) THEN
00152     ZDEN = 60.
00153   ELSE
00154     ZDEN = 1.
00155   ENDIF
00156   !
00157   IF (.NOT.LTIME_WRITTEN(1)) THEN 
00158     XTYPE=1
00159     CALL WRITE_SURF(HPROGRAM,'time',XTSTEP_OUTPUT/ZDEN*XSTARTW,IRESP,HCOMMENT=YCOMMENT)
00160     LTIME_WRITTEN(1)=.TRUE.
00161   ENDIF
00162   !
00163   IF (HSCHEME.NE.'NONE  ') THEN
00164     !
00165     IF (HMASK=='NATURE' .AND. .NOT.LTIME_WRITTEN(2)) THEN
00166       XTYPE=2
00167       CALL WRITE_SURF(HPROGRAM,'time',XTSTEP_OUTPUT/ZDEN*XSTARTW,IRESP,HCOMMENT=YCOMMENT)
00168       LTIME_WRITTEN(2)=.TRUE.
00169     ENDIF
00170     !
00171     IF (HMASK=='SEA   ' .AND. .NOT.LTIME_WRITTEN(3)) THEN
00172       XTYPE=3
00173       CALL WRITE_SURF(HPROGRAM,'time',XTSTEP_OUTPUT/ZDEN*XSTARTW,IRESP,HCOMMENT=YCOMMENT)
00174       LTIME_WRITTEN(3)=.TRUE.
00175     ENDIF
00176     !
00177     IF (HMASK=='WATER ' .AND.  .NOT.LTIME_WRITTEN(4)) THEN  
00178       XTYPE=4
00179       CALL WRITE_SURF(HPROGRAM,'time',XTSTEP_OUTPUT/ZDEN*XSTARTW,IRESP,HCOMMENT=YCOMMENT)
00180       LTIME_WRITTEN(4)=.TRUE.
00181     ENDIF
00182     !
00183     IF (HMASK=='TOWN  ' .AND. .NOT.LTIME_WRITTEN(5)) THEN     
00184       XTYPE=5
00185       CALL WRITE_SURF(HPROGRAM,'time',XTSTEP_OUTPUT/ZDEN*XSTARTW,IRESP,HCOMMENT=YCOMMENT)
00186       LTIME_WRITTEN(5)=.TRUE.
00187     ENDIF
00188     !
00189   ENDIF
00190   !
00191 ENDIF
00192 !
00193 !------------------------------------------------------------------------------
00194 IF (LHOOK) CALL DR_HOOK('INIT_IO_SURF_OL_N',1,ZHOOK_HANDLE)
00195 CONTAINS 
00196 !------------------------------------------------------------------------------
00197 SUBROUTINE ALLOCATE_FILL_VAR(HVAR, NVAR)
00198   
00199  CHARACTER(LEN=20),DIMENSION(:), POINTER :: HVAR
00200 INTEGER*4, DIMENSION(:), POINTER :: NVAR
00201 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00202 
00203 IF (LHOOK) CALL DR_HOOK('ALLOCATE_FILL_VAR',0,ZHOOK_HANDLE)
00204 ALLOCATE(HVAR(XOUT))
00205 ALLOCATE(NVAR(XOUT))
00206 HVAR(:)=XVAR_TO_FILEOUT(1:XOUT)
00207 NVAR(:)=XID(1:XOUT)
00208 IF (LHOOK) CALL DR_HOOK('ALLOCATE_FILL_VAR',1,ZHOOK_HANDLE)
00209 
00210 END SUBROUTINE ALLOCATE_FILL_VAR
00211 !------------------------------------------------------------------------------
00212 !
00213 END SUBROUTINE INIT_IO_SURF_OL_n