SURFEX v7.3
General documentation of Surfex
|
00001 ! ######################### 00002 SUBROUTINE READ_CSVDATA_TEB(HPROGRAM,HFILE) 00003 ! ######################### 00004 ! 00005 !! 00006 !! PURPOSE 00007 !! ------- 00008 !! 00009 !! METHOD 00010 !! ------ 00011 !! 00012 !! 00013 !! EXTERNAL 00014 !! -------- 00015 !! 00016 !! IMPLICIT ARGUMENTS 00017 !! ------------------ 00018 !! 00019 !! REFERENCE 00020 !! --------- 00021 !! 00022 !! AUTHOR 00023 !! ------ 00024 !! 00025 !! V. Masson Meteo-France 00026 !! 00027 !! MODIFICATION 00028 !! ------------ 00029 !! 00030 !! Original 05/2012 00031 ! 00032 !---------------------------------------------------------------------------- 00033 ! 00034 !* 0. DECLARATION 00035 ! ----------- 00036 ! 00037 USE MODD_CSTS, ONLY : XTT 00038 USE MODD_SURF_PAR, ONLY : XUNDEF 00039 USE MODD_TEB_n, ONLY : NROOF_LAYER, NWALL_LAYER, NROAD_LAYER 00040 USE MODD_BEM_n, ONLY : NFLOOR_LAYER 00041 ! 00042 USE MODD_BLD_DESCRIPTION 00043 ! 00044 USE MODI_OPEN_NAMELIST 00045 USE MODI_CLOSE_NAMELIST 00046 ! 00047 USE MODI_GET_LUOUT 00048 USE MODI_ABOR1_SFX 00049 ! 00050 ! 00051 USE YOMHOOK ,ONLY : LHOOK, DR_HOOK 00052 USE PARKIND1 ,ONLY : JPRB 00053 ! 00054 IMPLICIT NONE 00055 ! 00056 !* 0.1 Declaration of arguments 00057 ! ------------------------ 00058 ! 00059 CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM 00060 CHARACTER(LEN=28), INTENT(IN) :: HFILE ! file to read 00061 ! 00062 ! 00063 !* 0.2 Declaration of local variables 00064 ! ------------------------------ 00065 ! 00066 INTEGER :: ILUNAM ! logical unit of the file 00067 INTEGER :: ILUOUT ! logical unit of the output listing file 00068 CHARACTER(LEN=400) :: YSTRING 00069 CHARACTER(LEN=80) :: YSTRING1, YSTRING2, YSTRING3, YSTRING4, 00070 YSTRING5, YSTRING6, YSTRING7, YSTRING8, YSTRING9 00071 CHARACTER(LEN=30), DIMENSION(:), ALLOCATABLE :: YUSE_NAME ! building's use name 00072 CHARACTER(LEN=30), DIMENSION(:), ALLOCATABLE :: YBLD_NAME ! building name 00073 CHARACTER(LEN=30), DIMENSION(:), ALLOCATABLE :: YLAYER ! name of layer 00074 INTEGER :: I1 00075 INTEGER :: I2 00076 INTEGER :: JBLD ! loop counter on buildings 00077 INTEGER :: JAGE ! loop counter on building's ages 00078 INTEGER :: JLAYER ! loop counter on layers 00079 INTEGER :: IINDEX ! index in descriptive data arrays 00080 ! 00081 INTEGER :: IALL_HYP ! number of hypotheses for equipment 00082 INTEGER :: IHYP ! kept hypothese for equipment 00083 CHARACTER(LEN=10) :: YTYPE_OF_DATA ! 'STRUCTURE', 'EQUIPMENT' 00084 ! 00085 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00086 ! 00087 !------------------------------------------------------------------------------- 00088 !------------------------------------------------------------------------------- 00089 ! 00090 IF (LHOOK) CALL DR_HOOK('READ_CSVDATA_TEB',0,ZHOOK_HANDLE) 00091 ! 00092 !------------------------------------------------------------------------------- 00093 IF (LEN_TRIM(HFILE)==0) THEN 00094 IF (LHOOK) CALL DR_HOOK('READ_CSVDATA_TEB',1,ZHOOK_HANDLE) 00095 RETURN 00096 END IF 00097 ! 00098 CALL GET_LUOUT(HPROGRAM,ILUOUT) 00099 ! 00100 !------------------------------------------------------------------------------- 00101 ! 00102 !* 1. Opens the file 00103 ! -------------------- 00104 ! 00105 CALL OPEN_NAMELIST(HPROGRAM,ILUNAM,HFILE) 00106 ! 00107 !------------------------------------------------------------------------------- 00108 ! 00109 !* 2.1 Reads the number of building types and of construction dates 00110 ! ------------------------------------------------------------ 00111 ! 00112 CALL READ_CONF_IN_CSVFILE("Nb de types de batiments",NDESC_BLD) 00113 CALL READ_CONF_IN_CSVFILE("Nb de plages de dates",NDESC_AGE) 00114 CALL READ_CONF_IN_CSVFILE("Nb de types d_usages",NDESC_USE) 00115 ! 00116 NDESC_CODE = NDESC_BLD * NDESC_AGE 00117 ! 00118 !* 2.2 Reads the number of layers for description of the surfaces 00119 ! ---------------------------------------------------------- 00120 ! 00121 CALL READ_CONF_IN_CSVFILE("Nb de couches MUR",NDESC_WALL_LAYER) 00122 CALL READ_CONF_IN_CSVFILE("Nb de couches TOITURE",NDESC_ROOF_LAYER) 00123 CALL READ_CONF_IN_CSVFILE("Nb de couches PLANCHER",NDESC_FLOOR_LAYER) 00124 ! 00125 !------------------------------------------------------------------------------- 00126 ! 00127 !* 3. Reads the codes of the building construction (or renovation) dates 00128 ! ------------------------------------------------------------------ 00129 ! 00130 ALLOCATE(NDESC_AGE_LIST(NDESC_AGE)) 00131 ALLOCATE(NDESC_AGE_DATE(NDESC_AGE)) 00132 ! 00133 DO 00134 YSTRING1=' ' 00135 YSTRING2=' ' 00136 YSTRING3=' ' 00137 YSTRING4=' ' 00138 YSTRING5=' ' 00139 YSTRING6=' ' 00140 !* reads the record 00141 READ(ILUNAM,END=98,FMT='(A400)') YSTRING 00142 !* analyses if the record has been written in French convention 00143 CALL FRENCH_TO_ENGLISH(YSTRING) 00144 !* reads the string 00145 IF (LEN_TRIM(YSTRING)>0) & 00146 READ(YSTRING,FMT=*) YSTRING1, YSTRING2, YSTRING3, YSTRING4, YSTRING5, YSTRING6 00147 IF (YSTRING1=='DATE' .AND. YSTRING2(4:)=='plage de date') THEN 00148 READ(YSTRING,FMT=*) YSTRING1, YSTRING2, NDESC_AGE_LIST(:) 00149 END IF 00150 IF (YSTRING1=='DATE' .AND. YSTRING2(:)=='Date maximum') THEN 00151 READ(YSTRING,FMT=*) YSTRING1, YSTRING2, NDESC_AGE_DATE(:) 00152 END IF 00153 END DO 00154 ! 00155 98 REWIND(ILUNAM) 00156 ! 00157 ! 00158 ! 00159 !------------------------------------------------------------------------------- 00160 ! 00161 !* 3. Reads the codes of the building and building's use types 00162 ! -------------------------------------------------------- 00163 ! 00164 ALLOCATE(YBLD_NAME(NDESC_BLD)) 00165 ALLOCATE(YUSE_NAME(NDESC_USE)) 00166 ! 00167 ALLOCATE(NDESC_BLD_LIST(NDESC_BLD)) 00168 ALLOCATE(NDESC_CODE_LIST(NDESC_CODE)) 00169 ALLOCATE(NDESC_USE_LIST(NDESC_USE)) 00170 ! 00171 DO 00172 YSTRING1=' ' 00173 YSTRING2=' ' 00174 YSTRING3=' ' 00175 YSTRING4=' ' 00176 YSTRING5=' ' 00177 YSTRING6=' ' 00178 !* reads the record 00179 READ(ILUNAM,END=99,FMT='(A400)') YSTRING 00180 !* analyses if the record has been written in French convention 00181 CALL FRENCH_TO_ENGLISH(YSTRING) 00182 !* reads the string 00183 IF (LEN_TRIM(YSTRING)>0) & 00184 READ(YSTRING,FMT=*) YSTRING1, YSTRING2, YSTRING3, YSTRING4, YSTRING5, YSTRING6 00185 00186 IF (YSTRING1=='TYPES USAGES' .AND. YSTRING4=='TYPES BATIMENTS') THEN 00187 ! reads both use and building types 00188 DO JBLD=1,MAX(NDESC_BLD,NDESC_USE) 00189 READ(ILUNAM,FMT='(A400)') YSTRING 00190 CALL FRENCH_TO_ENGLISH(YSTRING) 00191 READ(YSTRING,FMT=*) YSTRING1, I1, YSTRING3, YSTRING4, I2, YSTRING6 00192 ! updates building types 00193 IF (JBLD<=NDESC_BLD) THEN 00194 YBLD_NAME(JBLD) = YSTRING4 00195 NDESC_BLD_LIST(JBLD) = I2 00196 DO JAGE=1,NDESC_AGE 00197 IINDEX = (JBLD-1)*NDESC_AGE + JAGE 00198 NDESC_CODE_LIST(IINDEX) = BLD_CODE(NDESC_BLD_LIST(JBLD),NDESC_AGE_LIST(JAGE)) 00199 END DO 00200 END IF 00201 ! updates building's use types 00202 IF (JBLD<=NDESC_USE) THEN 00203 YUSE_NAME (JBLD) = YSTRING1 00204 NDESC_USE_LIST(JBLD) = I1 00205 END IF 00206 END DO 00207 EXIT 00208 END IF 00209 END DO 00210 ! 00211 99 REWIND(ILUNAM) 00212 ! 00213 !------------------------------------------------------------------------------ 00214 ! 00215 !* 4. town parameters depending on building structure descriptions 00216 ! ------------------------------------------------------------------ 00217 ! 00218 YTYPE_OF_DATA = 'STRUCTURE' 00219 ! 00220 !* radiative properties 00221 ! 00222 ALLOCATE(XDESC_ALB_ROOF(NDESC_CODE)) 00223 CALL READ_IN_CSVFILE('TOITURE',YBLD_NAME,"Exterieur",'Albedo',XDESC_ALB_ROOF) 00224 00225 ALLOCATE(XDESC_ALB_WALL(NDESC_CODE)) 00226 CALL READ_IN_CSVFILE('MUR',YBLD_NAME,"Couche 1 (Ext)",'Albedo',XDESC_ALB_WALL) 00227 00228 ALLOCATE(XDESC_EMIS_ROOF(NDESC_CODE)) 00229 CALL READ_IN_CSVFILE('TOITURE',YBLD_NAME,"Exterieur",'Emissivite',XDESC_EMIS_ROOF) 00230 00231 ALLOCATE(XDESC_EMIS_WALL(NDESC_CODE)) 00232 CALL READ_IN_CSVFILE('MUR',YBLD_NAME,"Couche 1 (Ext)",'Emissivite',XDESC_EMIS_WALL) 00233 ! 00234 !* thermal properties for roof 00235 ! 00236 ALLOCATE(YLAYER(NDESC_ROOF_LAYER)) 00237 DO JLAYER=1,NDESC_ROOF_LAYER 00238 IF (JLAYER==1) THEN 00239 WRITE(YLAYER(JLAYER),FMT='(A)') 'Exterieur ' 00240 ELSEIF (JLAYER==NDESC_ROOF_LAYER) THEN 00241 WRITE(YLAYER(JLAYER),FMT='(A)') 'Interieur ' 00242 ELSE 00243 WRITE(YLAYER(JLAYER),FMT='(A)') 'Milieu ' 00244 END IF 00245 END DO 00246 ! 00247 ALLOCATE(XDESC_HC_ROOF(NDESC_CODE,NDESC_ROOF_LAYER)) 00248 ALLOCATE(XDESC_TC_ROOF(NDESC_CODE,NDESC_ROOF_LAYER)) 00249 ALLOCATE(XDESC_D_ROOF (NDESC_CODE,NDESC_ROOF_LAYER)) 00250 DO JLAYER=1,NDESC_ROOF_LAYER 00251 CALL READ_IN_CSVFILE('TOITURE',YBLD_NAME,YLAYER(JLAYER),'Chaleur specifique C',XDESC_HC_ROOF(:,JLAYER)) 00252 CALL READ_IN_CSVFILE('TOITURE',YBLD_NAME,YLAYER(JLAYER),'Conductivite',XDESC_TC_ROOF(:,JLAYER)) 00253 CALL READ_IN_CSVFILE('TOITURE',YBLD_NAME,YLAYER(JLAYER),'Epaisseur d',XDESC_D_ROOF(:,JLAYER)) 00254 END DO 00255 !* transformation from kJ.m-3.K-1 to J.m-3.K-1 00256 XDESC_HC_ROOF = XDESC_HC_ROOF * 1000. 00257 DEALLOCATE(YLAYER) 00258 ! 00259 !* thermal properties for wall 00260 ! 00261 ALLOCATE(YLAYER(NDESC_WALL_LAYER)) 00262 DO JLAYER=1,NDESC_WALL_LAYER 00263 IF (JLAYER==1) THEN 00264 WRITE(YLAYER(JLAYER),FMT='(A,I1,A)') 'Couche ',JLAYER,' (Ext)' 00265 ELSEIF (JLAYER==NDESC_WALL_LAYER) THEN 00266 WRITE(YLAYER(JLAYER),FMT='(A,I1,A)') 'Couche ',JLAYER,' (Int)' 00267 ELSE 00268 WRITE(YLAYER(JLAYER),FMT='(A,I1,A)') 'Couche ',JLAYER,' (Milieu)' 00269 END IF 00270 END DO 00271 ! 00272 ALLOCATE(XDESC_HC_WALL(NDESC_CODE,NDESC_WALL_LAYER)) 00273 ALLOCATE(XDESC_TC_WALL(NDESC_CODE,NDESC_WALL_LAYER)) 00274 ALLOCATE(XDESC_D_WALL (NDESC_CODE,NDESC_WALL_LAYER)) 00275 DO JLAYER=1,NDESC_WALL_LAYER 00276 CALL READ_IN_CSVFILE('MUR',YBLD_NAME,YLAYER(JLAYER),'Chaleur specifique C',XDESC_HC_WALL(:,JLAYER)) 00277 CALL READ_IN_CSVFILE('MUR',YBLD_NAME,YLAYER(JLAYER),'Conductivite',XDESC_TC_WALL(:,JLAYER)) 00278 CALL READ_IN_CSVFILE('MUR',YBLD_NAME,YLAYER(JLAYER),'Epaisseur d',XDESC_D_WALL(:,JLAYER)) 00279 END DO 00280 !* transformation from kJ.m-3.K-1 to J.m-3.K-1 00281 XDESC_HC_WALL = XDESC_HC_WALL * 1000. 00282 DEALLOCATE(YLAYER) 00283 ! 00284 ! 00285 !* thermal properties for floor 00286 ! 00287 ALLOCATE(YLAYER(NDESC_FLOOR_LAYER)) 00288 DO JLAYER=1,NDESC_FLOOR_LAYER 00289 IF (JLAYER==1) THEN 00290 WRITE(YLAYER(JLAYER),FMT='(A)') 'Superieur ' 00291 ELSEIF (JLAYER==NDESC_FLOOR_LAYER) THEN 00292 WRITE(YLAYER(JLAYER),FMT='(A)') 'Inferieur ' 00293 ELSE 00294 WRITE(YLAYER(JLAYER),FMT='(A)') 'Milieu ' 00295 END IF 00296 END DO 00297 ! 00298 ALLOCATE(XDESC_HC_FLOOR(NDESC_CODE,NDESC_FLOOR_LAYER)) 00299 ALLOCATE(XDESC_TC_FLOOR(NDESC_CODE,NDESC_FLOOR_LAYER)) 00300 ALLOCATE(XDESC_D_FLOOR (NDESC_CODE,NDESC_FLOOR_LAYER)) 00301 DO JLAYER=1,NDESC_FLOOR_LAYER 00302 CALL READ_IN_CSVFILE('PLANCHER',YBLD_NAME,YLAYER(JLAYER),'Chaleur specifique C',XDESC_HC_FLOOR(:,JLAYER)) 00303 CALL READ_IN_CSVFILE('PLANCHER',YBLD_NAME,YLAYER(JLAYER),'Conductivite',XDESC_TC_FLOOR(:,JLAYER)) 00304 CALL READ_IN_CSVFILE('PLANCHER',YBLD_NAME,YLAYER(JLAYER),'Epaisseur d',XDESC_D_FLOOR(:,JLAYER)) 00305 END DO 00306 !* transformation from kJ.m-3.K-1 to J.m-3.K-1 00307 XDESC_HC_FLOOR = XDESC_HC_FLOOR * 1000. 00308 DEALLOCATE(YLAYER) 00309 ! 00310 !* windows 00311 ! ------- 00312 ! 00313 ALLOCATE(XDESC_SHGC(NDESC_CODE)) 00314 CALL READ_IN_CSVFILE('ENVELOPPE',YBLD_NAME,"Vitrage",'Facteur solaire m',XDESC_SHGC) 00315 00316 ALLOCATE(XDESC_U_WIN(NDESC_CODE)) 00317 CALL READ_IN_CSVFILE('ENVELOPPE',YBLD_NAME,"Vitrage",'U-factor',XDESC_U_WIN) 00318 00319 ALLOCATE(XDESC_GR(NDESC_CODE)) 00320 CALL READ_IN_CSVFILE('ENVELOPPE',YBLD_NAME,"Vitrage",'Surface fenetre /surface facade',XDESC_GR) 00321 ! 00322 !------------------------------------------------------------------------------ 00323 ! 00324 !* 5. town parameters depending on building equipment descriptions 00325 ! ------------------------------------------------------------------ 00326 ! 00327 YTYPE_OF_DATA = 'EQUIPMENT' 00328 ! 00329 CALL READ_CONF_IN_CSVFILE("Nb d_hypotheses",IALL_HYP) 00330 ! 00331 !* Air conditionning systems 00332 ! 00333 CALL READ_HYP_IN_CSVFILE("Climatisation","Taux de rejets en toitures",IHYP) 00334 ALLOCATE(XDESC_F_WASTE_CAN(NDESC_CODE)) 00335 CALL READ_IN_CSVFILE('EQUIPEMENT',YBLD_NAME,"Climatisation",'Taux de rejets en toitures',XDESC_F_WASTE_CAN) 00336 XDESC_F_WASTE_CAN = XDESC_F_WASTE_CAN / 100. ! % => fraction 00337 ! 00338 CALL READ_HYP_IN_CSVFILE("Climatisation","Taux de rejets secs",IHYP) 00339 ALLOCATE(XDESC_F_WATER_COND(NDESC_CODE)) 00340 CALL READ_IN_CSVFILE('EQUIPEMENT',YBLD_NAME,"Climatisation",'Taux de rejets secs',XDESC_F_WATER_COND) 00341 XDESC_F_WATER_COND = XDESC_F_WATER_COND / 100. ! % => fraction 00342 ! 00343 CALL READ_HYP_IN_CSVFILE("Climatisation","Performance (COP)",IHYP) 00344 ALLOCATE(XDESC_COP_RAT(NDESC_CODE)) 00345 CALL READ_IN_CSVFILE('EQUIPEMENT',YBLD_NAME,"Climatisation",'Performance (COP)',XDESC_COP_RAT) 00346 ! 00347 ! 00348 !* Heating systems 00349 ! 00350 !CALL READ_HYP_IN_CSVFILE("Chauffage","Efficacite energetique",IHYP) 00351 ALLOCATE(XDESC_EFF_HEAT(NDESC_CODE)) 00352 !CALL READ_IN_CSVFILE('EQUIPEMENT',YBLD_NAME,"Chauffage",'Efficacite energetique',XDESC_EFF_HEAT) 00353 XDESC_EFF_HEAT = 0.9 00354 ! 00355 ! 00356 !* Sanitary ventilation 00357 CALL READ_HYP_IN_CSVFILE("Infiltration","Taux de renouvellement d_air",IHYP) 00358 ALLOCATE(XDESC_INF(NDESC_CODE)) 00359 CALL READ_IN_CSVFILE('EQUIPEMENT',YBLD_NAME,"Infiltration","Taux de renouvellement d_air",XDESC_INF) 00360 ! 00361 CALL READ_HYP_IN_CSVFILE("Ventilation Mecanique Controlee","Taux de renouvellement d_air",IHYP) 00362 ALLOCATE(XDESC_V_VENT(NDESC_CODE)) 00363 CALL READ_IN_CSVFILE('EQUIPEMENT',YBLD_NAME,"Ventilation Mecanique Controlee","Taux de renouvellement d_air",XDESC_V_VENT) 00364 ! 00365 !* Greenroof fraction 00366 CALL READ_HYP_IN_CSVFILE("Toits vegetalises","Implantation",IHYP) 00367 ALLOCATE(XDESC_GREENROOF(NDESC_CODE)) 00368 CALL READ_IN_CSVFILE('EQUIPEMENT',YBLD_NAME,"Toits vegetalises","Implantation",XDESC_GREENROOF) 00369 !------------------------------------------------------------------------------- 00370 00371 !------------------------------------------------------------------------------ 00372 ! 00373 !* 7. town parameters depending on building's use descriptions 00374 ! -------------------------------------------------------------- 00375 ! 00376 ! 00377 YTYPE_OF_DATA = 'USE' 00378 ! 00379 !* Temperature target for air conditionning 00380 CALL READ_HYP_IN_CSVFILE("Climatisation","Temp. de consigne",IHYP) 00381 ALLOCATE(XDESC_TCOOL_TARGET(NDESC_USE)) 00382 CALL READ_IN_CSVFILE('USAGE',YUSE_NAME,"Climatisation","Temp. de consigne",XDESC_TCOOL_TARGET) 00383 XDESC_TCOOL_TARGET = XDESC_TCOOL_TARGET + XTT ! °C => K 00384 ! 00385 !* Temperature target for domestic heating 00386 CALL READ_HYP_IN_CSVFILE("Chauffage","Temp. de consigne",IHYP) 00387 ALLOCATE(XDESC_THEAT_TARGET(NDESC_USE)) 00388 CALL READ_IN_CSVFILE('USAGE',YUSE_NAME,"Chauffage","Temp. de consigne",XDESC_THEAT_TARGET) 00389 XDESC_THEAT_TARGET = XDESC_THEAT_TARGET + XTT ! °C => K 00390 ! 00391 !* Internal gains 00392 CALL READ_HYP_IN_CSVFILE("Apports internes","Flux",IHYP) 00393 ALLOCATE(XDESC_QIN(NDESC_USE)) 00394 CALL READ_IN_CSVFILE('USAGE',YUSE_NAME,"Apports internes","Flux",XDESC_QIN) 00395 ! 00396 !* Latent fraction for internal gains 00397 CALL READ_HYP_IN_CSVFILE("Apports internes","Fraction latente",IHYP) 00398 ALLOCATE(XDESC_QIN_FLAT(NDESC_USE)) 00399 CALL READ_IN_CSVFILE('USAGE',YUSE_NAME,"Apports internes","Fraction latente",XDESC_QIN_FLAT) 00400 XDESC_QIN_FLAT = XDESC_QIN_FLAT / 100. ! % => fraction 00401 ! 00402 !* Solar protections 00403 CALL READ_HYP_IN_CSVFILE("Protection solaire","Facteur solaire m",IHYP) 00404 ALLOCATE(XDESC_SHGC_SH(NDESC_USE)) 00405 CALL READ_IN_CSVFILE('USAGE',YUSE_NAME,"Protection solaire","Facteur solaire m",XDESC_SHGC_SH) 00406 ! 00407 CALL READ_HYP_IN_CSVFILE("Protection solaire","Active",IHYP) 00408 ALLOCATE(XDESC_SHADE(NDESC_USE)) 00409 CALL READ_IN_CSVFILE('USAGE',YUSE_NAME,"Protection solaire","Active",XDESC_SHADE) 00410 ! 00411 !* Extra Natural ventilation (windows open or extra mechanical ventilation) 00412 CALL READ_HYP_IN_CSVFILE("Sur-ventilation","Type d_ouverture",IHYP) 00413 ALLOCATE(XDESC_NATVENT(NDESC_USE)) 00414 CALL READ_IN_CSVFILE('USAGE',YUSE_NAME,"Sur-ventilation","Type d_ouverture",XDESC_NATVENT) 00415 ! 00416 !------------------------------------------------------------------------------ 00417 ! 00418 !* 8. town parameters depending on urban structure 00419 ! -------------------------------------------------- 00420 ! 00421 NDESC_ROAD_LAYER = 3 00422 ! 00423 ALLOCATE(XDESC_ALB_ROAD(NDESC_CODE)) 00424 XDESC_ALB_ROAD = 0.08 00425 ALLOCATE(XDESC_EMIS_ROAD(NDESC_CODE)) 00426 XDESC_EMIS_ROAD = 0.94 00427 ALLOCATE(XDESC_HC_ROAD(NDESC_CODE,NDESC_ROAD_LAYER)) 00428 XDESC_HC_ROAD(:,1) = 1940000. 00429 XDESC_HC_ROAD(:,2:) = 1280000. 00430 ALLOCATE(XDESC_TC_ROAD(NDESC_CODE,NDESC_ROAD_LAYER)) 00431 XDESC_TC_ROAD(:,1) = 0.74 00432 XDESC_TC_ROAD(:,2:) = 0.25 00433 ALLOCATE(XDESC_D_ROAD(NDESC_CODE,NDESC_ROAD_LAYER)) 00434 XDESC_D_ROAD(:,1) = 0.05 00435 XDESC_D_ROAD(:,2) = 0.1 00436 XDESC_D_ROAD(:,3:) = 1. 00437 ! 00438 !------------------------------------------------------------------------------- 00439 ! 00440 CALL CLOSE_NAMELIST(HPROGRAM,ILUNAM) 00441 ! 00442 IF (LHOOK) CALL DR_HOOK('READ_CSVDATA_TEB',1,ZHOOK_HANDLE) 00443 !------------------------------------------------------------------------------- 00444 CONTAINS 00445 !------------------------------------------------------------------------------- 00446 ! 00447 FUNCTION BLD_CODE(KBLD,KAGE) 00448 INTEGER, INTENT(IN) :: KBLD ! building type number 00449 INTEGER, INTENT(IN) :: KAGE ! building construction period number 00450 INTEGER :: BLD_CODE ! building code combining type and age 00451 BLD_CODE = 100*KBLD+KAGE 00452 END FUNCTION BLD_CODE 00453 ! 00454 !------------------------------------------------------------------------------- 00455 ! 00456 !------------------------------------------------------------------------------- 00457 ! 00458 SUBROUTINE READ_CONF_IN_CSVFILE(HCODE1,KDATA) 00459 00460 CHARACTER(LEN=*), INTENT(IN) :: HCODE1 00461 INTEGER, INTENT(OUT):: KDATA 00462 CHARACTER(LEN=80) :: YERROR 00463 ! 00464 REWIND(ILUNAM) 00465 DO 00466 YSTRING1 = '' 00467 YSTRING2 = '' 00468 !* reads the record 00469 READ(ILUNAM,END=101,FMT='(A400)') YSTRING 00470 !* analyses if the record has been written in French convention 00471 CALL FRENCH_TO_ENGLISH(YSTRING) 00472 !* reads the string 00473 IF (LEN_TRIM(YSTRING)>0) & 00474 READ(YSTRING,FMT=*) YSTRING1, YSTRING2 00475 00476 IF (TRIM(YSTRING1)==TRIM(HCODE1)) THEN 00477 READ(YSTRING,*) YSTRING1, KDATA 00478 REWIND(ILUNAM) 00479 RETURN 00480 END IF 00481 END DO 00482 ! 00483 101 YERROR=TRIM(HCODE1)//' not found in file : '//TRIM(HFILE) 00484 CALL ABOR1_SFX(YERROR) 00485 ! 00486 END SUBROUTINE READ_CONF_IN_CSVFILE 00487 ! 00488 SUBROUTINE READ_HYP_IN_CSVFILE(HCODE1,HCODE2,KDATA) 00489 00490 CHARACTER(LEN=*), INTENT(IN) :: HCODE1 00491 CHARACTER(LEN=*), INTENT(IN) :: HCODE2 00492 INTEGER, INTENT(OUT):: KDATA 00493 CHARACTER(LEN=80) :: YERROR 00494 LOGICAL :: GCODE2 00495 ! 00496 REWIND(ILUNAM) 00497 DO 00498 YSTRING1 = '' 00499 YSTRING2 = '' 00500 !* reads the record 00501 READ(ILUNAM,END=101,FMT='(A400)') YSTRING 00502 !* analyses if the record has been written in French convention 00503 CALL FRENCH_TO_ENGLISH(YSTRING) 00504 !* reads the string 00505 IF (LEN_TRIM(YSTRING)>0) & 00506 READ(YSTRING,FMT=*) YSTRING1, YSTRING2 00507 00508 GCODE2 = TRIM(YSTRING2)==TRIM(HCODE2) 00509 IF (TRIM(YSTRING1)==TRIM(HCODE1) .AND. GCODE2) THEN 00510 READ(YSTRING,*) YSTRING1, YSTRING2, KDATA 00511 REWIND(ILUNAM) 00512 RETURN 00513 END IF 00514 END DO 00515 ! 00516 101 YERROR=TRIM(HCODE1)//' '//TRIM(HCODE2)//' not found in file : '//TRIM(HFILE) 00517 CALL ABOR1_SFX(YERROR) 00518 ! 00519 END SUBROUTINE READ_HYP_IN_CSVFILE 00520 ! 00521 SUBROUTINE READ_IN_CSVFILE(HCODE_ELEMENT,HCODE_TYPE,HCODE_ELEMENT2,HCODE_PARAM,PDATA) 00522 ! 00523 CHARACTER(LEN=*), INTENT(IN) :: HCODE_ELEMENT ! type of element 00524 CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: HCODE_TYPE ! building type or 00525 ! building's use type 00526 CHARACTER(LEN=*), INTENT(IN) :: HCODE_ELEMENT2 ! description of element 00527 CHARACTER(LEN=*), INTENT(IN) :: HCODE_PARAM ! name of Parameter 00528 REAL, DIMENSION(:), INTENT(OUT):: PDATA ! data read in the csv file 00529 ! 00530 REAL, DIMENSION(:), ALLOCATABLE :: ZDATA ! data array read in the file 00531 LOGICAL, DIMENSION(SIZE(HCODE_TYPE)) :: GINITIALIZED ! Flag to know if parameter 00532 ! ! has been initialized correctly 00533 LOGICAL :: GFOUND ! correct record has been found 00534 CHARACTER(LEN=80) :: YTYPE ! type of building or building's use 00535 ! ! in the csv file record 00536 CHARACTER(LEN=100) :: YERROR ! Character string for error message 00537 INTEGER :: IN1 ! number of building type or use 00538 INTEGER :: IN2 ! number of construction dates 00539 ! 00540 IF (YTYPE_OF_DATA=='STRUCTURE') THEN 00541 ALLOCATE(ZDATA(NDESC_AGE)) 00542 IN1=NDESC_BLD 00543 IN2=NDESC_AGE 00544 ELSE IF (YTYPE_OF_DATA=='EQUIPMENT') THEN 00545 ALLOCATE(ZDATA(IALL_HYP)) 00546 IN1=NDESC_BLD 00547 IN2=NDESC_AGE 00548 ELSE IF (YTYPE_OF_DATA=='USE') THEN 00549 ALLOCATE(ZDATA(IALL_HYP)) 00550 IN1=NDESC_USE 00551 IN2=1 00552 END IF 00553 ! 00554 PDATA = XUNDEF 00555 GINITIALIZED(:)=.FALSE. 00556 DO 00557 YSTRING1=' ' 00558 YSTRING2=' ' 00559 YSTRING3=' ' 00560 YSTRING4=' ' 00561 YSTRING5=' ' 00562 YSTRING6=' ' 00563 YSTRING7=' ' 00564 YSTRING8=' ' 00565 !* reads the record 00566 READ(ILUNAM,END=100,FMT='(A400)') YSTRING 00567 !* analyses if the record has been written in French convention 00568 CALL FRENCH_TO_ENGLISH(YSTRING) 00569 !* reads the string 00570 IF (LEN_TRIM(YSTRING)>0) & 00571 READ(YSTRING,FMT=*) YSTRING1, YSTRING2, YSTRING3, YSTRING4, YSTRING5, YSTRING6, YSTRING7 00572 ! 00573 IF (YTYPE_OF_DATA=='EQUIPMENT' .OR. YTYPE_OF_DATA=='USE') THEN 00574 GFOUND = TRIM(YSTRING1)==TRIM(HCODE_ELEMENT) .AND. TRIM(YSTRING6)==TRIM(HCODE_ELEMENT2) & 00575 .AND. TRIM(YSTRING7)==TRIM(HCODE_PARAM) 00576 ELSE IF (YTYPE_OF_DATA=='STRUCTURE') THEN 00577 GFOUND = TRIM(YSTRING1)==TRIM(HCODE_ELEMENT) .AND. TRIM(YSTRING4)==TRIM(HCODE_ELEMENT2) & 00578 .AND. TRIM(YSTRING5)==TRIM(HCODE_PARAM) 00579 ELSE 00580 GFOUND = .FALSE. 00581 END IF 00582 00583 IF (GFOUND) THEN 00584 !* reads the data in the record 00585 IF (YTYPE_OF_DATA=='EQUIPMENT' .OR. YTYPE_OF_DATA=='USE') THEN 00586 READ(YSTRING,FMT=*) YSTRING1, YSTRING2, YSTRING3, YSTRING4, YSTRING5, & 00587 YSTRING6, YSTRING7, YSTRING8, YSTRING9, ZDATA(:) 00588 ELSE IF (YTYPE_OF_DATA=='STRUCTURE') THEN 00589 READ(YSTRING,FMT=*) YSTRING1, YSTRING2, YSTRING3, YSTRING4, YSTRING5, & 00590 YSTRING6, YSTRING7, ZDATA(:) 00591 END IF 00592 !* in case of EQUIPMENT or USE data, one keeps the chosen hypothesis 00593 IF (YTYPE_OF_DATA=='EQUIPMENT' .OR. YTYPE_OF_DATA=='USE') ZDATA(:) = ZDATA(IHYP) 00594 !* one finds for which building type or building's use type the data is for 00595 IF (YTYPE_OF_DATA=='EQUIPMENT') YTYPE = YSTRING2 00596 IF (YTYPE_OF_DATA=='STRUCTURE') YTYPE = YSTRING2 00597 IF (YTYPE_OF_DATA=='USE ') YTYPE = YSTRING4 00598 ! 00599 DO JBLD=1,IN1 00600 IF (TRIM(HCODE_TYPE(JBLD))==TRIM(YTYPE) .OR. TRIM(YTYPE)=='Tous batiments') THEN 00601 !* one affects the data for this type of building for each construction dates 00602 DO JAGE=1,IN2 00603 IINDEX = (JBLD-1)*IN2 + JAGE 00604 PDATA(IINDEX) = ZDATA(MIN(JAGE,SIZE(ZDATA))) 00605 END DO 00606 GINITIALIZED(JBLD) = .TRUE. 00607 END IF 00608 END DO 00609 END IF 00610 IF (ALL(GINITIALIZED)) EXIT 00611 END DO 00612 ! 00613 100 REWIND(ILUNAM) 00614 DEALLOCATE(ZDATA) 00615 ! 00616 !* one checks if the data is available for all building's types 00617 IF (ANY(.NOT. GINITIALIZED)) THEN 00618 WRITE(ILUOUT,*) '*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*' 00619 WRITE(ILUOUT,*) 'While reading the csv data file for building parameters specification' 00620 WRITE(ILUOUT,*) '(file ',TRIM(HFILE),')' 00621 WRITE(ILUOUT,*) 'The field corresponding to the following ' 00622 WRITE(ILUOUT,*) 'identifiers:',TRIM(HCODE_ELEMENT),' ',TRIM(HCODE_ELEMENT2),' ',TRIM(HCODE_PARAM) 00623 WRITE(ILUOUT,*) 'has not been completely initialized.' 00624 WRITE(ILUOUT,*) 'The data for the following building types were not found:' 00625 IF (YTYPE_OF_DATA=='USE') THEN 00626 DO JBLD=1,IN1 00627 IF (.NOT. GINITIALIZED(JBLD)) WRITE(ILUOUT,*) '"',TRIM(YUSE_NAME(JBLD)),'"' 00628 END DO 00629 ELSE 00630 DO JBLD=1,IN1 00631 IF (.NOT. GINITIALIZED(JBLD)) WRITE(ILUOUT,*) '"',TRIM(YBLD_NAME(JBLD)),'"' 00632 END DO 00633 END IF 00634 WRITE(ILUOUT,*) '*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*' 00635 00636 YERROR='Initialization not complete for: '//TRIM(HCODE_ELEMENT)//' '//TRIM(HCODE_ELEMENT2)//' '//TRIM(HCODE_PARAM) 00637 CALL ABOR1_SFX(YERROR) 00638 END IF 00639 ! 00640 END SUBROUTINE READ_IN_CSVFILE 00641 !------------------------------------------------------------------------------- 00642 !------------------------------------------------------------------------------- 00643 SUBROUTINE FRENCH_TO_ENGLISH(HSTRING) 00644 CHARACTER(LEN=400), INTENT(INOUT) :: HSTRING ! csv record 00645 INTEGER :: JL 00646 LOGICAL :: GFRENCH 00647 ! 00648 GFRENCH = .FALSE. 00649 !* analyses if the record has been written in French convention 00650 ! French convention (separator is ; decimal symbol is ,) 00651 ! or English convention (separator is , decimal symbol is .) 00652 DO JL=1,400 00653 IF (HSTRING(JL:JL)==';') GFRENCH=.TRUE. 00654 END DO 00655 ! 00656 ! If French convention is used in the file, transforms it in English convention 00657 IF (GFRENCH) THEN 00658 DO JL=1,400 00659 IF (HSTRING(JL:JL)==',') HSTRING(JL:JL)='.' 00660 IF (HSTRING(JL:JL)==';') HSTRING(JL:JL)=',' 00661 END DO 00662 END IF 00663 ! 00664 END SUBROUTINE FRENCH_TO_ENGLISH 00665 !------------------------------------------------------------------------------- 00666 ! 00667 END SUBROUTINE READ_CSVDATA_TEB