SUEWS API Site
Documentation of SUEWS source code
Data Types | Functions/Subroutines | Variables
ctrl_output Module Reference

Data Types

type  varattr
 

Functions/Subroutines

subroutine suews_output (irmax, iv, gridiv, iyr)
 
subroutine suews_output_txt_grp (iv, irmax, iyr, varlistx, gridiv, outlevel, outfreq_s)
 
subroutine suews_output_init (dataoutx, varlist, iyr, gridiv, outlevel)
 
subroutine formatfile_gen (dataoutx, varlist, iyr, gridiv, outlevel)
 
subroutine suews_output_agg (dataout_agg, dataoutx, varlist, irmax, outfreq_s)
 
subroutine suews_write_txt (dataoutx, varlist, iyr, gridiv, outlevel)
 
subroutine filename_gen (dataoutx, varlist, iyr, gridiv, fileoutx, opt_fmt)
 
subroutine unique (vec, vec_unique)
 
logical function initq_file (filename)
 
integer function count_lines (filename)
 

Variables

integer n
 
character(len=10), parameter fy = 'i0004,1X'
 
character(len=10), parameter ft = 'i0004,1X'
 
character(len=10), parameter fd = 'f08.4,1X'
 
character(len=10), parameter f94 = 'f09.4,1X'
 
character(len=10), parameter f104 = 'f10.4,1X'
 
character(len=10), parameter f106 = 'f10.6,1X'
 
character(len=10), parameter f146 = 'f14.6,1X'
 
character(len=1), parameter at = 'T'
 
character(len=1), parameter aa = 'A'
 
character(len=1), parameter as = 'S'
 
character(len=1), parameter al = 'L'
 
character(len=3) itext
 
type(varattr), dimension(1200) varlistall
 

Function/Subroutine Documentation

◆ count_lines()

integer function ctrl_output::count_lines ( character(len=*) filename)

Definition at line 1834 of file suews_ctrl_output.f95.

1835 ! count the number of valid lines in a file
1836 ! invalid line starting with -9
1837
1838 !========================================================================================
1839 IMPLICIT NONE
1840 CHARACTER(len=*) :: filename
1841 INTEGER :: nlines
1842 INTEGER :: io, iv
1843
1844 OPEN (10, file=filename, iostat=io, status='old')
1845
1846 ! if io error found, report iostat and exit
1847 IF (io /= 0) THEN
1848 print *, 'io', io, 'for', filename
1849 stop 'Cannot open file! '
1850 END IF
1851
1852 nlines = 0
1853 DO
1854 READ (10, *, iostat=io) iv
1855 IF (io < 0 .OR. iv == -9) EXIT
1856
1857 nlines = nlines + 1
1858 END DO
1859 CLOSE (10)
1860 nlines = nlines - 1 ! skip header

◆ filename_gen()

subroutine ctrl_output::filename_gen ( real(kind(1d0)), dimension(:, :), intent(in) dataoutx,
type(varattr), dimension(:), intent(in) varlist,
integer, intent(in) iyr,
integer, intent(in) gridiv,
character(len=365), intent(out) fileoutx,
integer, intent(in), optional opt_fmt )

Definition at line 1675 of file suews_ctrl_output.f95.

1676 USE datetime_module
1677
1678 IMPLICIT NONE
1679 REAL(KIND(1D0)), DIMENSION(:, :), INTENT(in) :: dataOutX ! to determine year & output frequency
1680 TYPE(varAttr), DIMENSION(:), INTENT(in) :: varList ! to determine output group
1681 INTEGER, INTENT(in) :: iyr ! to determine year
1682 INTEGER, INTENT(in) :: Gridiv ! to determine grid name as in SiteSelect
1683 INTEGER, INTENT(in), OPTIONAL :: opt_fmt ! to determine if a format file
1684 CHARACTER(len=365), INTENT(out) :: FileOutX ! the output file name
1685
1686 CHARACTER(len=20) :: str_out_min, str_grid, &
1687 str_date, str_year, str_doy, str_grp, str_sfx
1688 INTEGER :: year_int, DOY_int, val_fmt, delta_t_min
1689 TYPE(datetime) :: dt1, dt2
1690 TYPE(timedelta) :: dt_x
1691
1692 ! initialise with a default value
1693 val_fmt = -999
1694
1695 IF (PRESENT(opt_fmt)) val_fmt = opt_fmt
1696
1697 ! PRINT*, varList(:)%header
1698 ! PRINT*, 'dataOutX(1)',dataOutX(1,:)
1699
1700 ! date:
1701 doy_int = int(dataoutx(1, 2))
1702 WRITE (str_doy, '(i3.3)') doy_int
1703
1704! #ifdef nc
1705! ! year for nc use that in dataOutX
1706! year_int = INT(dataOutX(1, 1))
1707! WRITE (str_year, '(i4)') year_int
1708! str_date = '_'//TRIM(ADJUSTL(str_year))
1709! ! add DOY as a specifier
1710! IF (ncMode == 1) str_date = TRIM(ADJUSTL(str_date))//TRIM(ADJUSTL(str_DOY))
1711! #endif
1712
1713 ! year for txt use specified value to avoid conflicts when crossing years
1714 year_int = iyr
1715 WRITE (str_year, '(i4)') year_int
1716 str_date = '_'//trim(adjustl(str_year))
1717
1718 ! output frequency in minute:
1719 IF (varlist(6)%group == 'DailyState') THEN
1720 str_out_min = '' ! ignore this for DailyState
1721 ELSE
1722 ! derive output frequency from output arrays
1723 ! dt_x=
1724 dt1 = datetime(int(dataoutx(1, 1)), 1, 1) + &
1725 timedelta(days=int(dataoutx(1, 2) - 1), &
1726 hours=int(dataoutx(1, 3)), &
1727 minutes=int(dataoutx(1, 4)))
1728
1729 dt2 = datetime(int(dataoutx(2, 1)), 1, 1) + &
1730 timedelta(days=int(dataoutx(2, 2) - 1), &
1731 hours=int(dataoutx(2, 3)), &
1732 minutes=int(dataoutx(2, 4)))
1733
1734 dt_x = dt2 - dt1
1735 delta_t_min = int(dt_x%total_seconds()/60)
1736 WRITE (str_out_min, '(i4)') delta_t_min
1737 str_out_min = '_'//trim(adjustl(str_out_min))
1738 END IF
1739
1740 ! group: output type
1741 str_grp = varlist(6)%group
1742 IF (len(trim(str_grp)) > 0) str_grp = '_'//trim(adjustl(str_grp))
1743
1744 ! grid name:
1745 WRITE (str_grid, '(i10)') grididmatrix(gridiv)
1746! #ifdef nc
1747! IF (ncMode == 1) str_grid = '' ! grid name not needed by nc files
1748! #endif
1749
1750 ! suffix:
1751 str_sfx = '.txt'
1752! #ifdef nc
1753! IF (ncMode == 1) str_sfx = '.nc'
1754! #endif
1755
1756 ! filename: FileOutX
1757 fileoutx = trim(fileoutputpath)// &
1758 trim(filecode)// &
1759 trim(adjustl(str_grid))// &
1760 trim(adjustl(str_date))// &
1761 trim(adjustl(str_grp))// &
1762 trim(adjustl(str_out_min))// &
1763 trim(adjustl(str_sfx))
1764
1765 ! filename: format
1766 IF (val_fmt == 1) THEN
1767 fileoutx = trim(fileoutputpath)// &
1768 trim(filecode)// &
1769 trim(adjustl(str_grp))// &
1770 '_OutputFormat.txt'
1771 END IF
1772

References data_in::filecode, data_in::fileoutputpath, and allocatearray::grididmatrix.

Referenced by formatfile_gen(), suews_output_init(), and suews_write_txt().

Here is the caller graph for this function:

◆ formatfile_gen()

subroutine ctrl_output::formatfile_gen ( real(kind(1d0)), dimension(:, :), intent(in) dataoutx,
type(varattr), dimension(:), intent(in) varlist,
integer, intent(in) iyr,
integer, intent(in) gridiv,
integer, intent(in) outlevel )

Definition at line 1431 of file suews_ctrl_output.f95.

1432 IMPLICIT NONE
1433 REAL(KIND(1D0)), DIMENSION(:, :), INTENT(in) :: dataOutX
1434 TYPE(varAttr), DIMENSION(:), INTENT(in) :: varList
1435 INTEGER, INTENT(in) :: iyr, Gridiv, outLevel
1436
1437 TYPE(varAttr), DIMENSION(:), ALLOCATABLE :: varListSel
1438 INTEGER :: xx, err, fn, i
1439 CHARACTER(len=365) :: FileOutX
1440 CHARACTER(len=100*300) :: str_cat
1441 CHARACTER(len=100) :: str_x = ''
1442 CHARACTER(len=3) :: itextX
1443
1444 ! get filename
1445 CALL filename_gen(dataoutx, varlist, iyr, gridiv, fileoutx, 1)
1446
1447 !select variables to output
1448 xx = count((varlist%level <= outlevel), dim=1)
1449 ALLOCATE (varlistsel(xx), stat=err)
1450 IF (err /= 0) print *, "varListSel: Allocation request denied"
1451 varlistsel = pack(varlist, mask=(varlist%level <= outlevel))
1452
1453 ! create file
1454 fn = 9
1455 OPEN (fn, file=trim(adjustl(fileoutx)), status='unknown')
1456
1457 ! write out format strings
1458 ! column number:
1459 str_cat = ''
1460 DO i = 1, SIZE(varlistsel)
1461 WRITE (itextx, '(i3)') i
1462 IF (i == 1) THEN
1463 str_cat = trim(adjustl(itextx))
1464 ELSE
1465 str_cat = trim(str_cat)//';'//adjustl(itextx)
1466 END IF
1467 END DO
1468 WRITE (fn, '(a)') trim(str_cat)
1469
1470 ! header:
1471 str_cat = ''
1472 DO i = 1, SIZE(varlistsel)
1473 str_x = varlistsel(i)%header
1474 IF (i == 1) THEN
1475 str_cat = trim(adjustl(str_x))
1476 ELSE
1477 str_cat = trim(str_cat)//';'//adjustl(str_x)
1478 END IF
1479 END DO
1480 WRITE (fn, '(a)') trim(str_cat)
1481
1482 ! long name:
1483 str_cat = ''
1484 DO i = 1, SIZE(varlistsel)
1485 str_x = varlistsel(i)%longNm
1486 IF (i == 1) THEN
1487 str_cat = trim(adjustl(str_x))
1488 ELSE
1489 str_cat = trim(str_cat)//';'//adjustl(str_x)
1490 END IF
1491 END DO
1492 WRITE (fn, '(a)') trim(str_cat)
1493
1494 ! unit:
1495 str_cat = ''
1496 DO i = 1, SIZE(varlistsel)
1497 str_x = varlistsel(i)%unit
1498 IF (i == 1) THEN
1499 str_cat = trim(adjustl(str_x))
1500 ELSE
1501 str_cat = trim(str_cat)//';'//adjustl(str_x)
1502 END IF
1503 END DO
1504 WRITE (fn, '(a)') trim(str_cat)
1505
1506 ! format:
1507 str_cat = ''
1508 DO i = 1, SIZE(varlistsel)
1509 str_x = varlistsel(i)%fmt
1510 IF (i == 1) THEN
1511 str_cat = trim(adjustl(str_x))
1512 ELSE
1513 str_cat = trim(str_cat)//';'//adjustl(str_x)
1514 END IF
1515 END DO
1516 WRITE (fn, '(a)') trim(str_cat)
1517
1518 ! aggregation method:
1519 str_cat = ''
1520 DO i = 1, SIZE(varlistsel)
1521 str_x = varlistsel(i)%aggreg
1522 IF (i == 1) THEN
1523 str_cat = trim(adjustl(str_x))
1524 ELSE
1525 str_cat = trim(str_cat)//';'//adjustl(str_x)
1526 END IF
1527 END DO
1528 WRITE (fn, '(a)') trim(str_cat)
1529
1530 ! close file
1531 CLOSE (fn)
1532
1533 ! clean up
1534 IF (ALLOCATED(varlistsel)) DEALLOCATE (varlistsel, stat=err)
1535 IF (err /= 0) print *, "varListSel: Deallocation request denied"
1536

References filename_gen().

Referenced by suews_output_init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ initq_file()

logical function ctrl_output::initq_file ( character(len=365), intent(in) filename)

Definition at line 1814 of file suews_ctrl_output.f95.

1815 IMPLICIT NONE
1816 CHARACTER(len=365), INTENT(in) :: FileName ! the output file name
1817 LOGICAL :: existQ
1818 CHARACTER(len=1000) :: longstring
1819
1820 INQUIRE (file=trim(filename), exist=existq)
1821 IF (existq) THEN
1822 OPEN (10, file=trim(filename))
1823 READ (10, '(a)') longstring
1824 ! print*, 'longstring: ',longstring
1825 IF (verify(longstring, 'Year') == 0) initq_file = .false.
1826 CLOSE (unit=10)
1827 ELSE
1828 initq_file = .false.
1829 END IF
1830

References initq_file().

Referenced by initq_file().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ suews_output()

subroutine ctrl_output::suews_output ( integer, intent(in) irmax,
integer, intent(in) iv,
integer, intent(in) gridiv,
integer, intent(in) iyr )

Definition at line 1172 of file suews_ctrl_output.f95.

1173 IMPLICIT NONE
1174 INTEGER, INTENT(in) :: irMax
1175! #ifdef nc
1176! INTEGER, INTENT(in), OPTIONAL ::iv, Gridiv, iyr
1177! #else
1178 INTEGER, INTENT(in) :: iv, Gridiv, iyr
1179! #endif
1180
1181 INTEGER :: n_group_use, err, outLevel, i
1182 TYPE(varAttr), DIMENSION(:), ALLOCATABLE :: varListX
1183 CHARACTER(len=10) :: groupList0(10)
1184 CHARACTER(len=10), DIMENSION(:), ALLOCATABLE :: grpList
1185 LOGICAL :: groupCond(10)
1186
1187 ! determine outLevel
1188 SELECT CASE (writeoutoption)
1189 CASE (0) !all (not snow-related)
1190 outlevel = 1
1191 CASE (1) !all plus snow-related
1192 outlevel = 2
1193 CASE (2) !minimal output
1194 outlevel = 0
1195 END SELECT
1196
1197 ! determine groups to output
1198 ! TODO: needs to be smarter, automate this filtering
1199 grouplist0(1) = 'SUEWS'
1200 grouplist0(2) = 'BEERS'
1201 grouplist0(3) = 'BL'
1202 grouplist0(4) = 'snow'
1203 grouplist0(5) = 'ESTM'
1204 grouplist0(6) = 'DailyState'
1205 grouplist0(7) = 'RSL'
1206 grouplist0(8) = 'debug'
1207 grouplist0(9) = 'SPARTACUS'
1208 grouplist0(10) = 'EHC'
1209 groupcond = [ &
1210 .true., &
1211 .true., &
1212 cbluse >= 1, &
1213 snowuse >= 1, &
1214 storageheatmethod == 4 .OR. storageheatmethod == 14, &
1215 .true., &
1216 .true., &
1217 .true., &
1218 .true., &
1219 storageheatmethod == 5 &
1220 ]
1221 n_group_use = count(groupcond)
1222
1223 ! PRINT*, grpList0,xx
1224
1225 ALLOCATE (grplist(n_group_use), stat=err)
1226 IF (err /= 0) print *, "grpList: Allocation request denied"
1227
1228 grplist = pack(grouplist0, mask=groupcond)
1229
1230 ! PRINT*, grpList,SIZE(grpList, dim=1)
1231
1232 ! loop over all groups
1233 DO i = 1, SIZE(grplist), 1
1234 !PRINT*, 'i',i
1235 n_group_use = count(varlistall%group == trim(grplist(i)), dim=1)
1236 ! PRINT*, 'number of variables:',xx, 'in group: ',grpList(i)
1237 ! print*, 'all group names: ',varList%group
1238 ALLOCATE (varlistx(5 + n_group_use), stat=err)
1239 IF (err /= 0) print *, "varListX: Allocation request denied"
1240 ! datetime
1241 varlistx(1:5) = varlistall(1:5)
1242 ! variable
1243 varlistx(6:5 + n_group_use) = pack(varlistall, mask=(varlistall%group == trim(grplist(i))))
1244
1245 IF (trim(varlistx(SIZE(varlistx))%group) /= 'DailyState') THEN
1246 ! all output arrays but DailyState
1247 ! all output frequency option:
1248 ! as forcing:
1249 IF (resolutionfilesout == tstep .OR. keeptstepfilesout == 1) THEN
1250 CALL suews_output_txt_grp(iv, irmax, iyr, varlistx, gridiv, outlevel, tstep)
1251 END IF
1252 ! as specified ResolutionFilesOut:
1253 IF (resolutionfilesout /= tstep) THEN
1254 CALL suews_output_txt_grp(iv, irmax, iyr, varlistx, gridiv, outlevel, resolutionfilesout)
1255 END IF
1256 ELSE
1257 ! DailyState array, which does not need aggregation
1258 CALL suews_output_txt_grp(iv, irmax, iyr, varlistx, gridiv, outlevel, tstep)
1259
1260 END IF
1261
1262 IF (ALLOCATED(varlistx)) DEALLOCATE (varlistx, stat=err)
1263 IF (err /= 0) print *, "varListX: Deallocation request denied"
1264 ! PRINT*, 'i',i,'end'
1265
1266 END DO

References data_in::cbluse, data_in::keeptstepfilesout, data_in::resolutionfilesout, data_in::snowuse, data_in::storageheatmethod, suews_output_txt_grp(), sues_data::tstep, varlistall, and data_in::writeoutoption.

Here is the call graph for this function:

◆ suews_output_agg()

subroutine ctrl_output::suews_output_agg ( real(kind(1d0)), dimension(:, :), intent(out), allocatable dataout_agg,
real(kind(1d0)), dimension(:, :), intent(in) dataoutx,
type(varattr), dimension(:), intent(in) varlist,
integer, intent(in) irmax,
integer, intent(in) outfreq_s )

Definition at line 1540 of file suews_ctrl_output.f95.

1541 IMPLICIT NONE
1542 REAL(KIND(1D0)), DIMENSION(:, :), INTENT(in) :: dataOutX
1543 TYPE(varAttr), DIMENSION(:), INTENT(in) :: varList
1544 INTEGER, INTENT(in) :: irMax, outFreq_s
1545 REAL(KIND(1D0)), DIMENSION(:, :), ALLOCATABLE, INTENT(out) :: dataOut_agg
1546
1547 INTEGER :: nlinesOut, i, j, x
1548 REAL(KIND(1D0)) :: dataOut_aggX(1:SIZE(varList))
1549 REAL(KIND(1D0)), DIMENSION(:, :), ALLOCATABLE :: dataOut_agg0
1550 nlinesout = int(nsh/(60.*60/outfreq_s))
1551 ! nGrid=SIZE(dataOutX, dim=3)
1552
1553 ALLOCATE (dataout_agg(int(irmax/nlinesout), SIZE(varlist)))
1554 ALLOCATE (dataout_agg0(nlinesout, SIZE(varlist)))
1555
1556 DO i = nlinesout, irmax, nlinesout
1557 x = i/nlinesout
1558 dataout_agg0 = dataoutx(i - nlinesout + 1:i, :)
1559 DO j = 1, SIZE(varlist), 1
1560 IF (diagnose == 1) THEN
1561 print *, "aggregating variable ", j, " of ", varlist(j)%header, 'in group ', varlist(j)%group
1562 END IF
1563 ! aggregating different variables
1564 SELECT CASE (varlist(j)%aggreg)
1565 CASE (at) !time columns, aT
1566 dataout_aggx(j) = dataout_agg0(nlinesout, j)
1567 CASE (aa) !average, aA
1568 dataout_aggx(j) = sum(dataout_agg0(:, j))/nlinesout
1569 CASE (as) !sum, aS
1570 dataout_aggx(j) = sum(dataout_agg0(:, j))
1571 CASE (al) !last value, aL
1572 dataout_aggx(j) = dataout_agg0(nlinesout, j)
1573 END SELECT
1574
1575 IF (diagnose == 1 .AND. i == irmax) THEN
1576 ! IF ( i==irMax ) THEN
1577 print *, 'raw data of ', j, ':'
1578 print *, dataout_agg0(:, j)
1579 print *, 'aggregated with method: ', varlist(j)%aggreg
1580 print *, dataout_aggx(j)
1581 print *, ''
1582 END IF
1583 END DO
1584 dataout_agg(x, :) = dataout_aggx
1585 END DO
1586

References aa, al, as, at, data_in::diagnose, and sues_data::nsh.

Referenced by suews_output_txt_grp().

Here is the caller graph for this function:

◆ suews_output_init()

subroutine ctrl_output::suews_output_init ( real(kind(1d0)), dimension(:, :), intent(in) dataoutx,
type(varattr), dimension(:), intent(in) varlist,
integer, intent(in) iyr,
integer, intent(in) gridiv,
integer, intent(in) outlevel )

Definition at line 1367 of file suews_ctrl_output.f95.

1368 IMPLICIT NONE
1369 REAL(KIND(1D0)), DIMENSION(:, :), INTENT(in) :: dataOutX
1370 TYPE(varAttr), DIMENSION(:), INTENT(in) :: varList
1371 INTEGER, INTENT(in) :: iyr, Gridiv, outLevel
1372
1373 TYPE(varAttr), DIMENSION(:), ALLOCATABLE :: varListSel
1374 INTEGER :: xx, err, fn, i, nargs
1375 CHARACTER(len=365) :: FileOutX
1376 CHARACTER(len=3) :: itextX
1377 CHARACTER(len=6) :: args(5)
1378 CHARACTER(len=16*SIZE(varList)) :: FormatOut
1379 CHARACTER(len=16) :: formatX
1380 CHARACTER(len=16), DIMENSION(:), ALLOCATABLE :: headerOut
1381
1382 ! select variables to output
1383 xx = count((varlist%level <= outlevel), dim=1)
1384 WRITE (itextx, '(i3)') xx
1385 ALLOCATE (varlistsel(xx), stat=err)
1386 IF (err /= 0) print *, "varListSel: Allocation request denied"
1387 varlistsel = pack(varlist, mask=(varlist%level <= outlevel))
1388
1389 ! generate file name
1390 CALL filename_gen(dataoutx, varlist, iyr, gridiv, fileoutx)
1391
1392 ! store right-aligned headers
1393 ALLOCATE (headerout(xx), stat=err)
1394 IF (err /= 0) print *, "headerOut: Allocation request denied"
1395
1396 ! create format string:
1397 DO i = 1, SIZE(varlistsel)
1398 CALL parse(varlistsel(i)%fmt, 'if.,', args, nargs)
1399 formatx = adjustl('(a'//trim(args(2))//',1x)')
1400 ! adjust headers to right-aligned
1401 WRITE (headerout(i), formatx) adjustr(trim(adjustl(varlistsel(i)%header)))
1402 IF (i == 1) THEN
1403 formatout = adjustl(trim(formatx))
1404 ELSE
1405 formatout = trim(formatout)//' '//adjustl(trim(formatx))
1406 END IF
1407 END DO
1408 formatout = '('//trim(adjustl(formatout))//')'
1409
1410 ! create file
1411 fn = 9
1412 OPEN (fn, file=trim(adjustl(fileoutx)), status='unknown')
1413 ! PRINT*, 'FileOutX in SUEWS_Output_Init: ',FileOutX
1414
1415 ! write out headers
1416 WRITE (fn, formatout) headerout
1417 CLOSE (fn)
1418
1419 ! write out format file
1420 CALL formatfile_gen(dataoutx, varlist, iyr, gridiv, outlevel)
1421
1422 ! clean up
1423 IF (ALLOCATED(varlistsel)) DEALLOCATE (varlistsel, stat=err)
1424 IF (err /= 0) print *, "varListSel: Deallocation request denied"
1425 IF (ALLOCATED(headerout)) DEALLOCATE (headerout, stat=err)
1426 IF (err /= 0) print *, "headerOut: Deallocation request denied"
1427

References filename_gen(), formatfile_gen(), and strings::parse().

Referenced by suews_output_txt_grp().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ suews_output_txt_grp()

subroutine ctrl_output::suews_output_txt_grp ( integer, intent(in) iv,
integer, intent(in) irmax,
integer, intent(in) iyr,
type(varattr), dimension(:), intent(in) varlistx,
integer, intent(in) gridiv,
integer, intent(in) outlevel,
integer, intent(in) outfreq_s )

Definition at line 1270 of file suews_ctrl_output.f95.

1271 IMPLICIT NONE
1272
1273 TYPE(varAttr), DIMENSION(:), INTENT(in) :: varListX
1274 INTEGER, INTENT(in) :: iv, irMax, iyr, Gridiv, outLevel, outFreq_s
1275
1276 INTEGER :: err
1277 INTEGER :: n_var
1278
1279 INTEGER, DIMENSION(:), ALLOCATABLE :: id_seq ! id sequence as in the dataOutX/dataOutX_agg
1280 REAL(KIND(1D0)), DIMENSION(:, :), ALLOCATABLE :: dataOutX
1281 REAL(KIND(1D0)), DIMENSION(:, :), ALLOCATABLE :: dataOutX_agg
1282
1283 ! number of varialbes for output
1284 n_var = SIZE(varlistx)
1285
1286 IF (.NOT. ALLOCATED(dataoutx)) THEN
1287 ALLOCATE (dataoutx(irmax, n_var), stat=err)
1288 IF (err /= 0) print *, "dataOutX: Allocation request denied"
1289 END IF
1290
1291 ! determine dataOutX array according to variable group
1292 SELECT CASE (trim(varlistx(n_var)%group))
1293 CASE ('SUEWS') !default
1294 dataoutx = dataoutsuews(1:irmax, 1:n_var, gridiv)
1295
1296 CASE ('BEERS') !SOLWEIG
1297 dataoutx = dataoutbeers(1:irmax, 1:n_var, gridiv)
1298 ! dataOutX = dataOutSOLWEIG(1:irMax, 1:n_var, Gridiv)
1299
1300 CASE ('BL') !BL
1301 dataoutx = dataoutbl(1:irmax, 1:n_var, gridiv)
1302
1303 CASE ('snow') !snow
1304 dataoutx = dataoutsnow(1:irmax, 1:n_var, gridiv)
1305
1306 CASE ('ESTM') !ESTM
1307 dataoutx = dataoutestm(1:irmax, 1:n_var, gridiv)
1308
1309 CASE ('RSL') !RSL
1310 dataoutx = dataoutrsl(1:irmax, 1:n_var, gridiv)
1311
1312 CASE ('debug') !debug
1313 dataoutx = dataoutdebug(1:irmax, 1:n_var, gridiv)
1314
1315 CASE ('SPARTACUS') !SPARTACUS
1316 dataoutx = dataoutspartacus(1:irmax, 1:n_var, gridiv)
1317
1318 CASE ('EHC') !EHC
1319 dataoutx = dataoutehc(1:irmax, 1:n_var, gridiv)
1320
1321 CASE ('DailyState') !DailyState
1322 ! get correct day index
1323 CALL unique(int(pack(dataoutsuews(1:irmax, 2, gridiv), &
1324 mask=(dataoutsuews(1:irmax, 3, gridiv) == 23 &
1325 .AND. dataoutsuews(1:irmax, 4, gridiv) == (nsh - 1.)/nsh*60))), &
1326 id_seq)
1327
1328 IF (ALLOCATED(dataoutx)) THEN
1329 DEALLOCATE (dataoutx)
1330 IF (err /= 0) print *, "dataOutX: Deallocation request denied"
1331 END IF
1332
1333 IF (.NOT. ALLOCATED(dataoutx)) THEN
1334 ALLOCATE (dataoutx(SIZE(id_seq), n_var), stat=err)
1335 IF (err /= 0) print *, "dataOutX: Allocation request denied"
1336 END IF
1337
1338 dataoutx = dataoutdailystate(id_seq, 1:n_var, gridiv)
1339 ! print*, id_seq
1340 ! print*, dataOutDailyState(id_seq,1:SIZE(varListX),Gridiv)
1341 ! print*, 1/(nsh-nsh)
1342 END SELECT
1343
1344 ! aggregation:
1345 ! aggregation is done for every group but 'DailyState'
1346 IF (trim(varlistx(SIZE(varlistx))%group) /= 'DailyState') THEN
1347
1348 CALL suews_output_agg(dataoutx_agg, dataoutx, varlistx, irmax, outfreq_s)
1349 ELSE
1350 IF (.NOT. ALLOCATED(dataoutx_agg)) THEN
1351 ALLOCATE (dataoutx_agg(SIZE(dataoutx, dim=1), SIZE(varlistx)), stat=err)
1352 IF (err /= 0) print *, ": Allocation request denied"
1353 END IF
1354 dataoutx_agg = dataoutx
1355 END IF
1356
1357 ! output:
1358 ! initialise file when processing first metblock
1359 IF (iv == 1) CALL suews_output_init(dataoutx_agg, varlistx, iyr, gridiv, outlevel)
1360
1361 ! append the aggregated data to the specific txt file
1362 CALL suews_write_txt(dataoutx_agg, varlistx, iyr, gridiv, outlevel)
1363

References allocatearray::dataoutbeers, allocatearray::dataoutbl, allocatearray::dataoutdailystate, allocatearray::dataoutdebug, allocatearray::dataoutehc, allocatearray::dataoutestm, allocatearray::dataoutrsl, allocatearray::dataoutsnow, allocatearray::dataoutspartacus, allocatearray::dataoutsuews, sues_data::nsh, suews_output_agg(), suews_output_init(), suews_write_txt(), and unique().

Referenced by suews_output().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ suews_write_txt()

subroutine ctrl_output::suews_write_txt ( real(kind(1d0)), dimension(:, :), intent(in) dataoutx,
type(varattr), dimension(:), intent(in) varlist,
integer, intent(in) iyr,
integer, intent(in) gridiv,
integer, intent(in) outlevel )

Definition at line 1590 of file suews_ctrl_output.f95.

1591 IMPLICIT NONE
1592 REAL(KIND(1D0)), DIMENSION(:, :), INTENT(in) :: dataOutX
1593 TYPE(varAttr), DIMENSION(:), INTENT(in) :: varList
1594 INTEGER, INTENT(in) :: iyr, Gridiv, outLevel
1595
1596 REAL(KIND(1D0)), DIMENSION(:, :), ALLOCATABLE :: dataOutSel
1597 TYPE(varAttr), DIMENSION(:), ALLOCATABLE :: varListSel
1598 CHARACTER(len=365) :: FileOutX
1599 INTEGER :: fn, i, xx, err
1600 INTEGER :: sizeVarListSel, sizedataOutX
1601 CHARACTER(len=12*SIZE(varList)) :: FormatOut
1602 ! LOGICAL :: initQ_file
1603 formatout = ''
1604
1605 IF (diagnose == 1) WRITE (*, *) 'Writting data of group: ', varlist(SIZE(varlist))%group
1606
1607 !select variables to output
1608 sizevarlistsel = count((varlist%level <= outlevel), dim=1)
1609 ALLOCATE (varlistsel(sizevarlistsel), stat=err)
1610 IF (err /= 0) print *, "varListSel: Allocation request denied"
1611 varlistsel = pack(varlist, mask=(varlist%level <= outlevel))
1612
1613 ! copy data accordingly
1614 sizedataoutx = SIZE(dataoutx, dim=1)
1615 ALLOCATE (dataoutsel(sizedataoutx, sizevarlistsel), stat=err)
1616 IF (err /= 0) print *, "dataOutSel: Allocation request denied"
1617 ! print*, SIZE(varList%level),PACK((/(i,i=1,SIZE(varList%level))/), varList%level <= outLevel)
1618 ! print*, irMax,shape(dataOutX)
1619 dataoutsel = dataoutx(:, pack((/(i, i=1, SIZE(varlist%level))/), varlist%level <= outlevel))
1620 ! do i = 1, 5
1621 ! print*, 'first several lines of dataOutX:', i, dataOutX(i,:)
1622
1623 ! end do
1624
1625 ! create format string:
1626 DO i = 1, sizevarlistsel
1627 ! PRINT*,''
1628 ! PRINT*,i
1629 ! PRINT*, LEN_TRIM(FormatOut),TRIM(FormatOut)
1630 ! PRINT*, LEN_TRIM(TRIM(FormatOut)//','),TRIM(FormatOut)//','
1631 IF (i == 1) THEN
1632 ! FormatOut=ADJUSTL(varListSel(i)%fmt)
1633 formatout = varlistsel(i)%fmt
1634 ELSE
1635
1636 ! FormatOut=TRIM(FormatOut)//','//ADJUSTL(varListSel(i)%fmt)
1637 formatout = trim(formatout)//','//trim(varlistsel(i)%fmt)
1638 END IF
1639 ! PRINT*,''
1640 ! PRINT*,i
1641 ! PRINT*, 'FormatOut',FormatOut
1642 END DO
1643 formatout = '('//trim(adjustl(formatout))//')'
1644
1645 ! get filename
1646 CALL filename_gen(dataoutsel, varlistsel, iyr, gridiv, fileoutx)
1647 ! PRINT*, 'FileOutX in SUEWS_Write_txt: ',FileOutX
1648
1649 ! test if FileOutX has been initialised
1650 ! IF ( .NOT. initQ_file(FileOutX) ) THEN
1651 ! CALL SUEWS_Output_Init(dataOutSel,varListSel,Gridiv,outLevel)
1652 ! END IF
1653
1654 ! write out data
1655 fn = 50
1656 OPEN (fn, file=trim(fileoutx), position='append') !,err=112)
1657 DO i = 1, sizedataoutx
1658 ! PRINT*, 'Writting line',i
1659 ! PRINT*, 'FormatOut in writing',FormatOut
1660 ! PRINT*, dataOutSel(i,1:sizeVarListSel)
1661 WRITE (fn, formatout) &
1662 (int(dataoutsel(i, xx)), xx=1, 4), &
1663 (dataoutsel(i, xx), xx=5, sizevarlistsel)
1664 END DO
1665 CLOSE (fn)
1666
1667 IF (ALLOCATED(varlistsel)) DEALLOCATE (varlistsel, stat=err)
1668 IF (err /= 0) print *, "varListSel: Deallocation request denied"
1669
1670 IF (ALLOCATED(dataoutsel)) DEALLOCATE (dataoutsel, stat=err)
1671 IF (err /= 0) print *, "dataOutSel: Deallocation request denied"
1672

References data_in::diagnose, and filename_gen().

Referenced by suews_output_txt_grp().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ unique()

subroutine ctrl_output::unique ( integer, dimension(:), intent(in) vec,
integer, dimension(:), intent(out), allocatable vec_unique )

Definition at line 1775 of file suews_ctrl_output.f95.

1776 ! Return only the unique values from vec.
1777
1778 IMPLICIT NONE
1779
1780 INTEGER, DIMENSION(:), INTENT(in) :: vec
1781 INTEGER, DIMENSION(:), ALLOCATABLE, INTENT(out) :: vec_unique
1782
1783 INTEGER :: i, num
1784 LOGICAL, DIMENSION(SIZE(vec)) :: mask
1785
1786 mask = .false.
1787
1788 DO i = 1, SIZE(vec)
1789
1790 !count the number of occurrences of this element:
1791 num = count(vec(i) == vec)
1792
1793 IF (num == 1) THEN
1794 !there is only one, flag it:
1795 mask(i) = .true.
1796 ELSE
1797 !flag this value only if it hasn't already been flagged:
1798 IF (.NOT. any(vec(i) == vec .AND. mask)) mask(i) = .true.
1799 END IF
1800
1801 END DO
1802
1803 !return only flagged elements:
1804 ALLOCATE (vec_unique(count(mask)))
1805 vec_unique = pack(vec, mask)
1806
1807 !if you also need it sorted, then do so.
1808 ! For example, with slatec routine:
1809 !call ISORT (vec_unique, [0], size(vec_unique), 1)
1810

Referenced by suews_output_txt_grp().

Here is the caller graph for this function:

Variable Documentation

◆ aa

character(len=1), parameter ctrl_output::aa = 'A'

Definition at line 48 of file suews_ctrl_output.f95.

Referenced by suews_output_agg().

◆ al

character(len=1), parameter ctrl_output::al = 'L'

Definition at line 48 of file suews_ctrl_output.f95.

Referenced by suews_output_agg().

◆ as

character(len=1), parameter ctrl_output::as = 'S'

Definition at line 48 of file suews_ctrl_output.f95.

Referenced by suews_output_agg().

◆ at

character(len=1), parameter ctrl_output::at = 'T'

Definition at line 48 of file suews_ctrl_output.f95.

48 CHARACTER(len=1), PARAMETER :: & ! Define aggregation methods here
49 aT = 'T', & !time columns
50 aa = 'A', & !average
51 as = 'S', & !sum
52 al = 'L' !last value

Referenced by suews_output_agg().

◆ f104

character(len=10), parameter ctrl_output::f104 = 'f10.4,1X'

Definition at line 39 of file suews_ctrl_output.f95.

◆ f106

character(len=10), parameter ctrl_output::f106 = 'f10.6,1X'

Definition at line 39 of file suews_ctrl_output.f95.

◆ f146

character(len=10), parameter ctrl_output::f146 = 'f14.6,1X'

Definition at line 39 of file suews_ctrl_output.f95.

◆ f94

character(len=10), parameter ctrl_output::f94 = 'f09.4,1X'

Definition at line 39 of file suews_ctrl_output.f95.

◆ fd

character(len=10), parameter ctrl_output::fd = 'f08.4,1X'

Definition at line 39 of file suews_ctrl_output.f95.

◆ ft

character(len=10), parameter ctrl_output::ft = 'i0004,1X'

Definition at line 39 of file suews_ctrl_output.f95.

◆ fy

character(len=10), parameter ctrl_output::fy = 'i0004,1X'

Definition at line 39 of file suews_ctrl_output.f95.

39 CHARACTER(len=10), PARAMETER :: & !Define useful formats here
40 fy = 'i0004,1X', & !4 digit integer for year
41 ft = 'i0004,1X', & !3 digit integer for id, it, imin
42 fd = 'f08.4,1X', & !3 digits + 4 dp for dectime
43 f94 = 'f09.4,1X', & !standard output format: 4 dp + 4 digits
44 f104 = 'f10.4,1X', & !standard output format: 4 dp + 5 digits
45 f106 = 'f10.6,1X', & !standard output format: 6 dp + 3 digits
46 f146 = 'f14.6,1X' !standard output format: 6 dp + 7 digits

◆ itext

character(len=3) ctrl_output::itext

Definition at line 54 of file suews_ctrl_output.f95.

54 CHARACTER(len=3) :: itext

◆ n

integer ctrl_output::n

Definition at line 37 of file suews_ctrl_output.f95.

37 INTEGER :: n

◆ varlistall

type(varattr), dimension(1200) ctrl_output::varlistall

Definition at line 68 of file suews_ctrl_output.f95.

68 TYPE(varAttr) :: varListAll(1200)

Referenced by suews_driver::output_name_n(), suews_driver::output_size(), and suews_output().