SURFEX v7.3
General documentation of Surfex
|
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