From dcec1405cf0acd0c40f62d8f464752a105c18704 Mon Sep 17 00:00:00 2001 From: FrancescoAvanzi Date: Mon, 18 Dec 2023 09:55:07 +0100 Subject: [PATCH] change to process pid --- CHANGELOG.rst | 4 ++ S3M_Main.f90 | 10 ++-- S3M_Module_Data_Forcing_Gridded.f90 | 84 +++++++++++++++++++--------- S3M_Module_Data_Restart_Gridded.f90 | 26 +++++++-- S3M_Module_Data_Updating_Gridded.f90 | 83 ++++++++++++++++++--------- S3M_Module_Info_Gridded.f90 | 9 ++- S3M_Module_Tools_Generic.f90 | 18 +++++- S3M_infofile.txt | 26 ++++----- configure.sh | 6 +- 9 files changed, 182 insertions(+), 84 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 6f194c5..f2117ae 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -2,6 +2,10 @@ Changelog ========= +Version 5.3.0 (20231215) +======================== +- Improved handling of input, assimilation, and restard data to allow multiple, parallel runs on the same input data. The improved approach generates temporary copies of inpit files using process PID to avoid problems with concurrent reading of the same netCDF file. + Version 5.2.0 (20230208) ======================== - Improved handling of restard data, with a more rigorous check on the existence of both file and NC layers to avoid spurious results diff --git a/S3M_Main.f90 b/S3M_Main.f90 index 71ea36b..707653c 100644 --- a/S3M_Main.f90 +++ b/S3M_Main.f90 @@ -2,11 +2,11 @@ ! S3M !*********************************************************************************** ! -! brief S3M Snow Multidata Mapping and Modeling (Boni et al. 2010, Avanzi et al. 2022) +! brief S3M Snow Multidata Mapping and Modeling (Avanzi et al. 2022) ! ! history FRANCESCO AVANZI (CIMAFOUNDATION) -!+ 09/02/2023 -!+ v5p2r0 +!+ 15/12/2023 +!+ v5p3r0 ! !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -34,7 +34,7 @@ ! 4) Snow age, albedo, melt, and snowpack runoff ! 5) Ice thickness. -! S3M 5.2.0 is distributed through the CIMA Research Foundation - Department of Hydrology and Hydraulics GitHub repo at +! S3M 5.3.0 is distributed through the CIMA Research Foundation - Department of Hydrology and Hydraulics GitHub repo at ! https://github.com/c-hydro ! A complete manual regarding model installation, run, as well as pre- and post-processing can be found at: ! https://gmd.copernicus.org/articles/15/4853/2022/ @@ -42,7 +42,7 @@ !----------------------------------------------------------------------------------- ! COMMAND LINE (example) !----------------------------------------------------------------------------------- -! ./S3M_v5p2.x --> parameter(s): S3M_info_domain_DataDa_DataA.txt +! ./S3M_v5p3.x --> parameter(s): S3M_infofile.txt ! ! All compiling and debugging options for S3M are described at https://github.com/c-hydro/hmc-dev ! diff --git a/S3M_Module_Data_Forcing_Gridded.f90 b/S3M_Module_Data_Forcing_Gridded.f90 index a0ac273..a9c1656 100644 --- a/S3M_Module_Data_Forcing_Gridded.f90 +++ b/S3M_Module_Data_Forcing_Gridded.f90 @@ -3,7 +3,7 @@ ! Author(s): Fabio Delogu, Francesco Silvestro, Simone Gabellani, Francesco Avanzi ! ! Created on April 22, 2015, 5:19 PM -! Last update on Nov 19, 2020 08:30 AM +! Last update on Dec 15, 2023 09:30 AM ! ! Module to read forcing map. !------------------------------------------------------------------------------------------ @@ -38,7 +38,7 @@ module S3M_Module_Data_Forcing_Gridded S3M_Tools_Generic_SwitchGrid, & S3M_Tools_Generic_UnzipFile, & S3M_Tools_Generic_RemoveFile, & - check2Dvar + check2Dvar, getProcessID use S3M_Module_Tools_Time, only: S3M_Tools_Time_MonthVal @@ -314,7 +314,7 @@ subroutine S3M_Data_Forcing_Gridded_NC(iID, & integer(kind = 4) :: iID character(len = 256), intent(in) :: sPathData_Forcing - character(len = 700) :: sFileNameData_Forcing, sFileNameData_Forcing_Zip + character(len = 700) :: sFileNameData_Forcing, sFileNameData_Forcing_Zip, sFileNameData_Temp character(len = 700) :: sCommandUnzipFile, sCommandRemoveFile character(len = 256) :: sVarName integer(kind = 4), intent(in) :: iRows, iCols @@ -330,7 +330,7 @@ subroutine S3M_Data_Forcing_Gridded_NC(iID, & real(kind = 4), dimension(iRows, iCols), intent(out) :: a2dVarIncRad real(kind = 4), dimension(iRows, iCols), intent(out) :: a2dVarRelHum - character(len = 256):: sVarUnits + character(len = 256):: sVarUnits, sPID integer(kind = 4) :: iErr integer(kind = 4) :: iFileID @@ -342,6 +342,7 @@ subroutine S3M_Data_Forcing_Gridded_NC(iID, & a2dVarPrecip = -9999.0; a2dVarTa = -9999.0; a2dVarIncRad = -9999.0; a2dVarRelHum = -9999.0; sFileNameData_Forcing = ''; sFileNameData_Forcing_Zip = ''; sTimeMonth = '' + sFileNameData_Temp = ''; sPid = '' ! Checking date write(sTimeMonth,'(A,A,A)') sTime(1:4), sTime(6:7), sTime(9:10) @@ -357,12 +358,21 @@ subroutine S3M_Data_Forcing_Gridded_NC(iID, & !------------------------------------------------------------------------------------------ !------------------------------------------------------------------------------------------ + ! Get unique process ID + sPID = adjustl(getProcessID()) + ! Filename forcing (example: MeteoData_201404300000.nc.gz) sFileNameData_Forcing = trim(sPathData_Forcing)//"MeteoData_"// & sTime(1:4)//sTime(6:7)//sTime(9:10)// & sTime(12:13)//sTime(15:16)// & ".nc" - + + ! Create Filename with unique PID number to avoid simultaneously access to the same Forcing file + sFileNameData_Temp = trim(sPathData_Forcing)//"MeteoData_"// & + sTime(1:4)//sTime(6:7)//sTime(9:10)// & + sTime(12:13)//sTime(15:16)//'_'//trim(sPID)// & + ".nc" + ! Info netCDF filename call mprintf(.true., iINFO_Verbose, ' Get filename (forcing gridded): '//trim(sFileNameData_Forcing)//' ... ' ) !------------------------------------------------------------------------------------------ @@ -387,12 +397,12 @@ subroutine S3M_Data_Forcing_Gridded_NC(iID, & ! Unzip file call S3M_Tools_Generic_UnzipFile(oS3M_Namelist(iID)%sCommandUnzipFile, & sFileNameData_Forcing_Zip, & - sFileNameData_Forcing, .true.) + sFileNameData_Temp, .true.) !------------------------------------------------------------------------------------------ !------------------------------------------------------------------------------------------ ! Open netCDF file - iErr = nf90_open(trim(sFileNameData_Forcing), NF90_NOWRITE, iFileID) + iErr = nf90_open(trim(sFileNameData_Temp), NF90_NOWRITE, iFileID) if (iErr /= 0) then call mprintf(.true., iWARN, ' Problem opening uncompressed netCDF file: '// & trim(sFileNameData_Forcing)//' --> Undefined forcing data values' ) @@ -456,7 +466,7 @@ subroutine S3M_Data_Forcing_Gridded_NC(iID, & iErr = nf90_close(iFileID) ! Remove uncompressed file (to save space on disk) call S3M_Tools_Generic_RemoveFile(oS3M_Namelist(iID)%sCommandRemoveFile, & - sFileNameData_Forcing, .false.) + sFileNameData_Temp, .false.) !------------------------------------------------------------------------------------------ !------------------------------------------------------------------------------------------ @@ -490,7 +500,7 @@ subroutine S3M_Data_Forcing_Gridded_Binary(iID, iFlagTypeData_Forcing, & integer(kind = 4) :: iFlagTypeData_Forcing character(len = 256), intent(in) :: sPathData_Forcing - character(len = 700) :: sFileNameData_Forcing, sFileNameData_Forcing_Zip + character(len = 700) :: sFileNameData_Forcing, sFileNameData_Forcing_Zip, sFileNameData_Temp character(len = 700) :: sCommandUnzipFile character(len = 256) :: sVarName integer(kind = 4), intent(in) :: iRows, iCols @@ -506,7 +516,7 @@ subroutine S3M_Data_Forcing_Gridded_Binary(iID, iFlagTypeData_Forcing, & real(kind = 4), dimension(iRows, iCols), intent(out) :: a2dVarIncRad real(kind = 4), dimension(iRows, iCols), intent(out) :: a2dVarRelHum - character(len = 256):: sVarUnits + character(len = 256):: sVarUnits, sPID integer(kind = 4) :: iErr integer(kind = 4) :: iFileID, iScaleFactor_Forcing @@ -517,7 +527,7 @@ subroutine S3M_Data_Forcing_Gridded_Binary(iID, iFlagTypeData_Forcing, & ! Initialize variable(s) a2dVarPrecip = -9999.0; a2dVarTa = -9999.0; a2dVarIncRad = -9999.0; a2dVarRelHum = -9999.0; - sFileNameData_Forcing = ''; sFileNameData_Forcing_Zip = ''; sTimeMonth = '' + sFileNameData_Forcing = ''; sFileNameData_Forcing_Zip = ''; sFileNameData_Temp = ''; sTimeMonth = ''; sPid = '' ! Checking date write(sTimeMonth,'(A,A,A)') sTime(1:4), sTime(6:7), sTime(9:10) @@ -534,6 +544,9 @@ subroutine S3M_Data_Forcing_Gridded_Binary(iID, iFlagTypeData_Forcing, & !------------------------------------------------------------------------------------------ ! Info binary file(s) time step call mprintf(.true., iINFO_Verbose, ' Get (forcing gridded) at time '//trim(sTime)//' ... ') + + ! Get unique process ID + sPID = adjustl(getProcessID()) !------------------------------------------------------------------------------------------ !------------------------------------------------------------------------------------------ @@ -542,6 +555,11 @@ subroutine S3M_Data_Forcing_Gridded_Binary(iID, iFlagTypeData_Forcing, & sTime(1:4)//sTime(6:7)//sTime(9:10)// & sTime(12:13)//sTime(15:16)// & ".bin" + sFileNameData_Temp = trim(sPathData_Forcing)//"Rain_"// & + sTime(1:4)//sTime(6:7)//sTime(9:10)// & + sTime(12:13)//sTime(15:16)//'_'//trim(sPID)// & + ".bin" + call mprintf(.true., iINFO_Extra, ' Get filename (forcing gridded): '//trim(sFileNameData_Forcing) ) ! Checking file input availability @@ -555,18 +573,18 @@ subroutine S3M_Data_Forcing_Gridded_Binary(iID, iFlagTypeData_Forcing, & ! Unzip file call S3M_Tools_Generic_UnzipFile(oS3M_Namelist(iID)%sCommandUnzipFile, & sFileNameData_Forcing_Zip, & - sFileNameData_Forcing, .true.) + sFileNameData_Temp, .true.) ! Read binary data if (iFlagTypeData_Forcing == 1) then - call S3M_Tools_IO_Get2d_Binary_INT(sFileNameData_Forcing, a2dVar, iRows, iCols, iScaleFactor_Forcing, .true., iErr) + call S3M_Tools_IO_Get2d_Binary_INT(sFileNameData_Temp, a2dVar, iRows, iCols, iScaleFactor_Forcing, .true., iErr) elseif (iFlagTypeData_Forcing == 2) then - call S3M_Tools_IO_Get2d_Binary_DBL(sFileNameData_Forcing, a2dVar, iRows, iCols, iScaleFactor_Forcing, .true., iErr) + call S3M_Tools_IO_Get2d_Binary_DBL(sFileNameData_Temp, a2dVar, iRows, iCols, iScaleFactor_Forcing, .true., iErr) endif ! Remove uncompressed file (to save space on disk) call S3M_Tools_Generic_RemoveFile(oS3M_Namelist(iID)%sCommandRemoveFile, & - sFileNameData_Forcing, .false.) + sFileNameData_Temp, .false.) endif a2dVarPrecip = a2dVar @@ -578,6 +596,10 @@ subroutine S3M_Data_Forcing_Gridded_Binary(iID, iFlagTypeData_Forcing, & sTime(1:4)//sTime(6:7)//sTime(9:10)// & sTime(12:13)//sTime(15:16)// & ".bin" + sFileNameData_Temp = trim(sPathData_Forcing)//"Temperature_"// & + sTime(1:4)//sTime(6:7)//sTime(9:10)// & + sTime(12:13)//sTime(15:16)//'_'//trim(sPID)// & + ".bin" call mprintf(.true., iINFO_Extra, ' Get filename (forcing gridded): '//trim(sFileNameData_Forcing) ) ! Checking file input availability @@ -591,18 +613,18 @@ subroutine S3M_Data_Forcing_Gridded_Binary(iID, iFlagTypeData_Forcing, & ! Unzip file call S3M_Tools_Generic_UnzipFile(oS3M_Namelist(iID)%sCommandUnzipFile, & sFileNameData_Forcing_Zip, & - sFileNameData_Forcing, .true.) + sFileNameData_Temp, .true.) ! Read binary data if (iFlagTypeData_Forcing == 1) then - call S3M_Tools_IO_Get2d_Binary_INT(sFileNameData_Forcing, a2dVar, iRows, iCols, iScaleFactor_Forcing, .true., iErr) + call S3M_Tools_IO_Get2d_Binary_INT(sFileNameData_Temp, a2dVar, iRows, iCols, iScaleFactor_Forcing, .true., iErr) elseif (iFlagTypeData_Forcing == 2) then - call S3M_Tools_IO_Get2d_Binary_DBL(sFileNameData_Forcing, a2dVar, iRows, iCols, iScaleFactor_Forcing, .true., iErr) + call S3M_Tools_IO_Get2d_Binary_DBL(sFileNameData_Temp, a2dVar, iRows, iCols, iScaleFactor_Forcing, .true., iErr) endif ! Remove uncompressed file (to save space on disk) call S3M_Tools_Generic_RemoveFile(oS3M_Namelist(iID)%sCommandRemoveFile, & - sFileNameData_Forcing, .false.) + sFileNameData_Temp, .false.) endif a2dVarTa = a2dVar !------------------------------------------------------------------------------------------ @@ -613,6 +635,10 @@ subroutine S3M_Data_Forcing_Gridded_Binary(iID, iFlagTypeData_Forcing, & sTime(1:4)//sTime(6:7)//sTime(9:10)// & sTime(12:13)//sTime(15:16)// & ".bin" + sFileNameData_Temp = trim(sPathData_Forcing)//"Radiation_"// & + sTime(1:4)//sTime(6:7)//sTime(9:10)// & + sTime(12:13)//sTime(15:16)//'_'//trim(sPID)// & + ".bin" call mprintf(.true., iINFO_Extra, ' Get filename (forcing gridded): '//trim(sFileNameData_Forcing) ) ! Checking file input availability @@ -626,18 +652,18 @@ subroutine S3M_Data_Forcing_Gridded_Binary(iID, iFlagTypeData_Forcing, & ! Unzip file call S3M_Tools_Generic_UnzipFile(oS3M_Namelist(iID)%sCommandUnzipFile, & sFileNameData_Forcing_Zip, & - sFileNameData_Forcing, .true.) + sFileNameData_Temp, .true.) ! Read binary data if (iFlagTypeData_Forcing == 1) then - call S3M_Tools_IO_Get2d_Binary_INT(sFileNameData_Forcing, a2dVar, iRows, iCols, iScaleFactor_Forcing, .true., iErr) + call S3M_Tools_IO_Get2d_Binary_INT(sFileNameData_Temp, a2dVar, iRows, iCols, iScaleFactor_Forcing, .true., iErr) elseif (iFlagTypeData_Forcing == 2) then - call S3M_Tools_IO_Get2d_Binary_DBL(sFileNameData_Forcing, a2dVar, iRows, iCols, iScaleFactor_Forcing, .true., iErr) + call S3M_Tools_IO_Get2d_Binary_DBL(sFileNameData_Temp, a2dVar, iRows, iCols, iScaleFactor_Forcing, .true., iErr) endif ! Remove uncompressed file (to save space on disk) call S3M_Tools_Generic_RemoveFile(oS3M_Namelist(iID)%sCommandRemoveFile, & - sFileNameData_Forcing, .false.) + sFileNameData_Temp, .false.) endif a2dVarIncRad = a2dVar !------------------------------------------------------------------------------------------ @@ -648,6 +674,10 @@ subroutine S3M_Data_Forcing_Gridded_Binary(iID, iFlagTypeData_Forcing, & sTime(1:4)//sTime(6:7)//sTime(9:10)// & sTime(12:13)//sTime(15:16)// & ".bin" + sFileNameData_Temp = trim(sPathData_Forcing)//"RelUmid_"// & + sTime(1:4)//sTime(6:7)//sTime(9:10)// & + sTime(12:13)//sTime(15:16)//'_'//trim(sPID)// & + ".bin" call mprintf(.true., iINFO_Extra, ' Get filename (forcing gridded): '//trim(sFileNameData_Forcing) ) ! Checking file input availability @@ -661,18 +691,18 @@ subroutine S3M_Data_Forcing_Gridded_Binary(iID, iFlagTypeData_Forcing, & ! Unzip file call S3M_Tools_Generic_UnzipFile(oS3M_Namelist(iID)%sCommandUnzipFile, & sFileNameData_Forcing_Zip, & - sFileNameData_Forcing, .true.) + sFileNameData_Temp, .true.) ! Read binary data if (iFlagTypeData_Forcing == 1) then - call S3M_Tools_IO_Get2d_Binary_INT(sFileNameData_Forcing, a2dVar, iRows, iCols, iScaleFactor_Forcing, .true., iErr) + call S3M_Tools_IO_Get2d_Binary_INT(sFileNameData_Temp, a2dVar, iRows, iCols, iScaleFactor_Forcing, .true., iErr) elseif (iFlagTypeData_Forcing == 2) then - call S3M_Tools_IO_Get2d_Binary_DBL(sFileNameData_Forcing, a2dVar, iRows, iCols, iScaleFactor_Forcing, .true., iErr) + call S3M_Tools_IO_Get2d_Binary_DBL(sFileNameData_Temp, a2dVar, iRows, iCols, iScaleFactor_Forcing, .true., iErr) endif ! Remove uncompressed file (to save space on disk) call S3M_Tools_Generic_RemoveFile(oS3M_Namelist(iID)%sCommandRemoveFile, & - sFileNameData_Forcing, .false.) + sFileNameData_Temp, .false.) endif a2dVarRelHum = a2dVar !------------------------------------------------------------------------------------------ diff --git a/S3M_Module_Data_Restart_Gridded.f90 b/S3M_Module_Data_Restart_Gridded.f90 index 613fea7..28b5420 100644 --- a/S3M_Module_Data_Restart_Gridded.f90 +++ b/S3M_Module_Data_Restart_Gridded.f90 @@ -3,7 +3,7 @@ ! Author(s): Fabio Delogu, Francesco Silvestro, Simone Gabellani, Francesco Avanzi. ! ! Created on May 7, 2015, 1:27 PM -! Last update on February 09, 2023 10:30 AM +! Last update on December 15, 2023 11:20 AM ! ! Module to read restart data. !------------------------------------------------------------------------------------------ @@ -44,7 +44,7 @@ module S3M_Module_Data_Restart_Gridded S3M_Tools_Generic_UnzipFile, & S3M_Tools_Generic_RemoveFile, & transpose3Dvar, & - checkdomainvar + checkdomainvar, getProcessID ! Implicit none for all subroutines in this module implicit none @@ -271,7 +271,7 @@ subroutine S3M_Data_Restart_Gridded_NC(iID, & integer(kind = 4) :: iID character(len = 256), intent(in) :: sPathData_Restart - character(len = 700) :: sFileNameData_Restart, sFileNameData_Restart_Zip + character(len = 700) :: sFileNameData_Restart, sFileNameData_Restart_Zip, sFileNameData_Temp character(len = 700) :: sCommandUnzipFile character(len = 256) :: sVarName integer(kind = 4), intent(in) :: iRows, iCols @@ -295,7 +295,7 @@ subroutine S3M_Data_Restart_Gridded_NC(iID, & real(kind = 4), dimension(iRows, iCols), intent(out) :: a2dVarLat real(kind = 4), dimension(iRows, iCols), intent(out) :: a2dVarLon - character(len = 256) :: sVarUnits + character(len = 256) :: sVarUnits, sPID integer(kind = 4) :: iErr integer(kind = 4) :: iFileID integer(kind = 4) :: iFlagIceMassBalance @@ -313,6 +313,8 @@ subroutine S3M_Data_Restart_Gridded_NC(iID, & a2dVarLat = -9999.0; a2dVarLon = -9999.0; bCheckRestart = .false.; bCheckVar = .true.; + + sPID = ''; sFileNameData_Temp = '' !------------------------------------------------------------------------------------------ !------------------------------------------------------------------------------------------ @@ -320,6 +322,9 @@ subroutine S3M_Data_Restart_Gridded_NC(iID, & sCommandUnzipFile = oS3M_Namelist(iID)%sCommandUnzipFile ! Info start call mprintf(.true., iINFO_Extra, ' Data :: Restart gridded :: NetCDF ... ' ) + + ! Get unique process ID + sPID = adjustl(getProcessID()) !------------------------------------------------------------------------------------------ !------------------------------------------------------------------------------------------ @@ -328,6 +333,11 @@ subroutine S3M_Data_Restart_Gridded_NC(iID, & sTime(1:4)//sTime(6:7)//sTime(9:10)// & sTime(12:13)//sTime(15:16)// & ".nc" + ! Create Filename with unique PID number to avoid simultaneously access to the same Forcing file + sFileNameData_Temp = trim(sPathData_Restart)//"S3M_"// & + sTime(1:4)//sTime(6:7)//sTime(9:10)// & + sTime(12:13)//sTime(15:16)//'_'//trim(sPID)// & + ".nc" ! Info netCDF filename call mprintf(.true., iINFO_Basic, ' Get filename (restart gridded): '//trim(sFileNameData_Restart)//' ... ' ) @@ -350,12 +360,12 @@ subroutine S3M_Data_Restart_Gridded_NC(iID, & ! Unzip file call S3M_Tools_Generic_UnzipFile(sCommandUnzipFile, & sFileNameData_Restart_Zip, & - sFileNameData_Restart, .true.) + sFileNameData_Temp, .true.) !------------------------------------------------------------------------------------------ !------------------------------------------------------------------------------------------ ! Opening netCDF file - iErr = nf90_open(trim(sFileNameData_Restart), NF90_NOWRITE, iFileID) + iErr = nf90_open(trim(sFileNameData_Temp), NF90_NOWRITE, iFileID) if (iErr /= 0) then !------------------------------------------------------------------------------------------ @@ -538,6 +548,10 @@ subroutine S3M_Data_Restart_Gridded_NC(iID, & ! Closing netcdf file (drops db) iErr = nf90_close(iFileID) + + ! Remove uncompressed file (to save space on disk) + call S3M_Tools_Generic_RemoveFile(oS3M_Namelist(iID)%sCommandRemoveFile, & + sFileNameData_Temp, .false.) !------------------------------------------------------------------------------------------ !------------------------------------------------------------------------------------------ diff --git a/S3M_Module_Data_Updating_Gridded.f90 b/S3M_Module_Data_Updating_Gridded.f90 index 841a47a..a7da881 100644 --- a/S3M_Module_Data_Updating_Gridded.f90 +++ b/S3M_Module_Data_Updating_Gridded.f90 @@ -3,7 +3,7 @@ ! Author(s): Fabio Delogu, Valerio Basso, Francesco Avanzi. ! ! Created on December 19, 2017, 1:19 PM -! Last update on October 26, 2020 12:00 PM +! Last update on December 15, 2023 10:30 PM ! ! Module to read the snow-depth-assimilation data: SH (snow depth), SQA (quality), SCA, kernel. !------------------------------------------------------------------------------------------ @@ -38,7 +38,7 @@ module S3M_Module_Data_Updating_Gridded S3M_Tools_Generic_SwitchGrid, & S3M_Tools_Generic_UnzipFile, & S3M_Tools_Generic_RemoveFile, & - check2Dvar + check2Dvar, getProcessID use S3M_Module_Tools_Time, only: S3M_Tools_Time_MonthVal @@ -251,7 +251,7 @@ subroutine S3M_Data_Updating_Gridded_NC(iID, & integer(kind = 4) :: iID character(len = 256), intent(in) :: sPathData_Updating - character(len = 700) :: sFileNameData_Updating, sFileNameData_Updating_Zip + character(len = 700) :: sFileNameData_Updating, sFileNameData_Updating_Zip, sFileNameData_Temp character(len = 700) :: sCommandUnzipFile, sCommandRemoveFile character(len = 256) :: sVarName integer(kind = 4), intent(in) :: iRows, iCols @@ -267,7 +267,7 @@ subroutine S3M_Data_Updating_Gridded_NC(iID, & real(kind = 4), dimension(iRows, iCols), intent(out) :: a2dVarSnowHeight real(kind = 4), dimension(iRows, iCols), intent(out) :: a2dVarSnowKernel - character(len = 256):: sVarUnits + character(len = 256):: sVarUnits, sPID integer(kind = 4) :: iErr integer(kind = 4) :: iFileID @@ -279,7 +279,8 @@ subroutine S3M_Data_Updating_Gridded_NC(iID, & a2dVarSnowCA = -9999.0; a2dVarSnowCA = -9999.0; a2dVarSnowHeight = -9999.0; a2dVarSnowKernel = -9999.0; - sFileNameData_Updating = ''; sFileNameData_Updating_Zip = ''; sTimeMonth = '' + sFileNameData_Updating = ''; sFileNameData_Updating_Zip = ''; sFileNameData_Temp = ''; sTimeMonth = '' + sPID = '' ! Checking date write(sTimeMonth,'(A,A,A)') sTime(1:4), sTime(6:7), sTime(9:10) @@ -292,6 +293,9 @@ subroutine S3M_Data_Updating_Gridded_NC(iID, & ! Info start call mprintf(.true., iINFO_Extra, ' Data :: Updating gridded :: NetCDF ... ' ) + + ! Get unique process ID + sPID = adjustl(getProcessID()) !------------------------------------------------------------------------------------------ !------------------------------------------------------------------------------------------ @@ -300,6 +304,11 @@ subroutine S3M_Data_Updating_Gridded_NC(iID, & sTime(1:4)//sTime(6:7)//sTime(9:10)// & sTime(12:13)//sTime(15:16)// & ".nc" + ! Create Filename with unique PID number to avoid simultaneously access to the same Forcing file + sFileNameData_Temp = trim(sPathData_Updating)//"Updating_"// & + sTime(1:4)//sTime(6:7)//sTime(9:10)// & + sTime(12:13)//sTime(15:16)//'_'//trim(sPID)// & + ".nc" ! Info netCDF filename call mprintf(.true., iINFO_Verbose, ' Get filename (updating gridded): '//trim(sFileNameData_Updating)//' ... ' ) @@ -325,12 +334,12 @@ subroutine S3M_Data_Updating_Gridded_NC(iID, & ! Unzip file call S3M_Tools_Generic_UnzipFile(oS3M_Namelist(iID)%sCommandUnzipFile, & sFileNameData_Updating_Zip, & - sFileNameData_Updating, .true.) + sFileNameData_Temp, .true.) !------------------------------------------------------------------------------------------ !------------------------------------------------------------------------------------------ ! Open netCDF file - iErr = nf90_open(trim(sFileNameData_Updating), NF90_NOWRITE, iFileID) + iErr = nf90_open(trim(sFileNameData_Temp), NF90_NOWRITE, iFileID) if (iErr /= 0) then call mprintf(.true., iWARN, ' Problem opening uncompressed netCDF file: '// & trim(sFileNameData_Updating)//' --> Undefined updating data values' ) @@ -402,7 +411,7 @@ subroutine S3M_Data_Updating_Gridded_NC(iID, & iErr = nf90_close(iFileID) ! Remove uncompressed file (to save space on disk) call S3M_Tools_Generic_RemoveFile(oS3M_Namelist(iID)%sCommandRemoveFile, & - sFileNameData_Updating, .false.) + sFileNameData_Temp, .false.) !------------------------------------------------------------------------------------------ !------------------------------------------------------------------------------------------ @@ -436,7 +445,7 @@ subroutine S3M_Data_Updating_Gridded_Binary(iID, iFlagTypeData_Updating, & integer(kind = 4) :: iFlagTypeData_Updating character(len = 256), intent(in) :: sPathData_Updating - character(len = 700) :: sFileNameData_Updating, sFileNameData_Updating_Zip + character(len = 700) :: sFileNameData_Updating, sFileNameData_Updating_Zip, sFileNameData_Temp character(len = 700) :: sCommandUnzipFile character(len = 256) :: sVarName integer(kind = 4), intent(in) :: iRows, iCols @@ -452,7 +461,7 @@ subroutine S3M_Data_Updating_Gridded_Binary(iID, iFlagTypeData_Updating, & real(kind = 4), dimension(iRows, iCols), intent(out) :: a2dVarSnowHeight real(kind = 4), dimension(iRows, iCols), intent(out) :: a2dVarSnowKernel - character(len = 256):: sVarUnits + character(len = 256):: sVarUnits, sPID integer(kind = 4) :: iErr integer(kind = 4) :: iFileID, iScaleFactor_Update @@ -464,7 +473,8 @@ subroutine S3M_Data_Updating_Gridded_Binary(iID, iFlagTypeData_Updating, & a2dVarSnowCA = -9999.0; a2dVarSnowCA = -9999.0; a2dVarSnowKernel = -9999.0; a2dVarSnowHeight = -9999.0; - sFileNameData_Updating = ''; sFileNameData_Updating_Zip = ''; sTimeMonth = '' + sFileNameData_Updating = ''; sFileNameData_Updating_Zip = ''; sFileNameData_Temp = ''; sTimeMonth = '' + sPID = '' ! Checking date write(sTimeMonth,'(A,A,A)') sTime(1:4), sTime(6:7), sTime(9:10) @@ -477,6 +487,9 @@ subroutine S3M_Data_Updating_Gridded_Binary(iID, iFlagTypeData_Updating, & ! Info start call mprintf(.true., iINFO_Extra, ' Data :: Updating gridded :: Binary ... ' ) + + ! Get unique process ID + sPID = adjustl(getProcessID()) !------------------------------------------------------------------------------------------ !------------------------------------------------------------------------------------------ @@ -493,6 +506,10 @@ subroutine S3M_Data_Updating_Gridded_Binary(iID, iFlagTypeData_Updating, & sTime(1:4)//sTime(6:7)//sTime(9:10)// & sTime(12:13)//sTime(15:16)// & ".bin" + sFileNameData_Temp = trim(sPathData_Updating)//"SnowHeight_"// & + sTime(1:4)//sTime(6:7)//sTime(9:10)// & + sTime(12:13)//sTime(15:16)//'_'//trim(sPID)// & + ".bin" call mprintf(.true., iINFO_Extra, ' Get filename (updating gridded): '//trim(sPathData_Updating) ) ! Checking file input availability @@ -507,18 +524,18 @@ subroutine S3M_Data_Updating_Gridded_Binary(iID, iFlagTypeData_Updating, & ! Unzip file call S3M_Tools_Generic_UnzipFile(oS3M_Namelist(iID)%sCommandUnzipFile, & sFileNameData_Updating_Zip, & - sFileNameData_Updating, .true.) + sFileNameData_Temp, .true.) ! Read binary data if (iFlagTypeData_Updating == 1) then - call S3M_Tools_IO_Get2d_Binary_INT(sFileNameData_Updating, a2dVar, iRows, iCols, iScaleFactor_Update, .true., iErr) + call S3M_Tools_IO_Get2d_Binary_INT(sFileNameData_Temp, a2dVar, iRows, iCols, iScaleFactor_Update, .true., iErr) elseif (iFlagTypeData_Updating == 2) then - call S3M_Tools_IO_Get2d_Binary_DBL(sFileNameData_Updating, a2dVar, iRows, iCols, iScaleFactor_Update, .true., iErr) + call S3M_Tools_IO_Get2d_Binary_DBL(sFileNameData_Temp, a2dVar, iRows, iCols, iScaleFactor_Update, .true., iErr) endif ! Remove uncompressed file (to save space on disk) call S3M_Tools_Generic_RemoveFile(oS3M_Namelist(iID)%sCommandRemoveFile, & - sFileNameData_Updating, .false.) + sFileNameData_Temp, .false.) endif a2dVarSnowHeight = a2dVar !------------------------------------------------------------------------------------------ @@ -529,6 +546,10 @@ subroutine S3M_Data_Updating_Gridded_Binary(iID, iFlagTypeData_Updating, & sTime(1:4)//sTime(6:7)//sTime(9:10)// & sTime(12:13)//sTime(15:16)// & ".bin" + sFileNameData_Temp = trim(sPathData_Updating)//"Kernel_"// & + sTime(1:4)//sTime(6:7)//sTime(9:10)// & + sTime(12:13)//sTime(15:16)//'_'//trim(sPID)// & + ".bin" call mprintf(.true., iINFO_Extra, ' Get filename (updating gridded): '//trim(sFileNameData_Updating) ) ! Checking file input availability @@ -543,18 +564,18 @@ subroutine S3M_Data_Updating_Gridded_Binary(iID, iFlagTypeData_Updating, & ! Unzip file call S3M_Tools_Generic_UnzipFile(oS3M_Namelist(iID)%sCommandUnzipFile, & sFileNameData_Updating_Zip, & - sFileNameData_Updating, .true.) + sFileNameData_Temp, .true.) ! Read binary data if (iFlagTypeData_Updating == 1) then - call S3M_Tools_IO_Get2d_Binary_INT(sFileNameData_Updating, a2dVar, iRows, iCols, iScaleFactor_Update, .true., iErr) + call S3M_Tools_IO_Get2d_Binary_INT(sFileNameData_Temp, a2dVar, iRows, iCols, iScaleFactor_Update, .true., iErr) elseif (iFlagTypeData_Updating == 2) then - call S3M_Tools_IO_Get2d_Binary_DBL(sFileNameData_Updating, a2dVar, iRows, iCols, iScaleFactor_Update, .true., iErr) + call S3M_Tools_IO_Get2d_Binary_DBL(sFileNameData_Temp, a2dVar, iRows, iCols, iScaleFactor_Update, .true., iErr) endif ! Remove uncompressed file (to save space on disk) call S3M_Tools_Generic_RemoveFile(oS3M_Namelist(iID)%sCommandRemoveFile, & - sFileNameData_Updating, .false.) + sFileNameData_Temp, .false.) endif a2dVarSnowKernel = a2dVar !------------------------------------------------------------------------------------------ @@ -565,6 +586,10 @@ subroutine S3M_Data_Updating_Gridded_Binary(iID, iFlagTypeData_Updating, & sTime(1:4)//sTime(6:7)//sTime(9:10)// & sTime(12:13)//sTime(15:16)// & ".bin" + sFileNameData_Temp = trim(sPathData_Updating)//"SCA_"// & + sTime(1:4)//sTime(6:7)//sTime(9:10)// & + sTime(12:13)//sTime(15:16)//'_'//trim(sPID)// & + ".bin" call mprintf(.true., iINFO_Extra, ' Get filename (updating gridded): '//trim(sFileNameData_Updating) ) ! Checking file input availability @@ -579,18 +604,18 @@ subroutine S3M_Data_Updating_Gridded_Binary(iID, iFlagTypeData_Updating, & ! Unzip file call S3M_Tools_Generic_UnzipFile(oS3M_Namelist(iID)%sCommandUnzipFile, & sFileNameData_Updating_Zip, & - sFileNameData_Updating, .true.) + sFileNameData_Temp, .true.) ! Read binary data if (iFlagTypeData_Updating == 1) then - call S3M_Tools_IO_Get2d_Binary_INT(sFileNameData_Updating, a2dVar, iRows, iCols, iScaleFactor_Update, .true., iErr) + call S3M_Tools_IO_Get2d_Binary_INT(sFileNameData_Temp, a2dVar, iRows, iCols, iScaleFactor_Update, .true., iErr) elseif (iFlagTypeData_Updating == 2) then - call S3M_Tools_IO_Get2d_Binary_DBL(sFileNameData_Updating, a2dVar, iRows, iCols, iScaleFactor_Update, .true., iErr) + call S3M_Tools_IO_Get2d_Binary_DBL(sFileNameData_Temp, a2dVar, iRows, iCols, iScaleFactor_Update, .true., iErr) endif ! Remove uncompressed file (to save space on disk) call S3M_Tools_Generic_RemoveFile(oS3M_Namelist(iID)%sCommandRemoveFile, & - sFileNameData_Updating, .false.) + sFileNameData_Temp, .false.) endif a2dVarSnowCA = a2dVar !------------------------------------------------------------------------------------------ @@ -601,6 +626,10 @@ subroutine S3M_Data_Updating_Gridded_Binary(iID, iFlagTypeData_Updating, & sTime(1:4)//sTime(6:7)//sTime(9:10)// & sTime(12:13)//sTime(15:16)// & ".bin" + sFileNameData_Temp = trim(sPathData_Updating)//"SQA_"// & + sTime(1:4)//sTime(6:7)//sTime(9:10)// & + sTime(12:13)//sTime(15:16)//'_'//trim(sPID)// & + ".bin" call mprintf(.true., iINFO_Extra, ' Get filename (updating gridded): '//trim(sFileNameData_Updating) ) ! Checking file input availability @@ -615,17 +644,17 @@ subroutine S3M_Data_Updating_Gridded_Binary(iID, iFlagTypeData_Updating, & ! Unzip file call S3M_Tools_Generic_UnzipFile(oS3M_Namelist(iID)%sCommandUnzipFile, & sFileNameData_Updating_Zip, & - sFileNameData_Updating, .true.) + sFileNameData_Temp, .true.) ! Read binary data if (iFlagTypeData_Updating == 1) then - call S3M_Tools_IO_Get2d_Binary_INT(sFileNameData_Updating, a2dVar, iRows, iCols, iScaleFactor_Update, .true., iErr) + call S3M_Tools_IO_Get2d_Binary_INT(sFileNameData_Temp, a2dVar, iRows, iCols, iScaleFactor_Update, .true., iErr) elseif (iFlagTypeData_Updating == 2) then - call S3M_Tools_IO_Get2d_Binary_DBL(sFileNameData_Updating, a2dVar, iRows, iCols, iScaleFactor_Update, .true., iErr) + call S3M_Tools_IO_Get2d_Binary_DBL(sFileNameData_Temp, a2dVar, iRows, iCols, iScaleFactor_Update, .true., iErr) endif ! Remove uncompressed file (to save space on disk) call S3M_Tools_Generic_RemoveFile(oS3M_Namelist(iID)%sCommandRemoveFile, & - sFileNameData_Updating, .false.) + sFileNameData_Temp, .false.) endif a2dVarSnowQA = a2dVar !------------------------------------------------------------------------------------------ diff --git a/S3M_Module_Info_Gridded.f90 b/S3M_Module_Info_Gridded.f90 index f8aa579..3b3e0b9 100644 --- a/S3M_Module_Info_Gridded.f90 +++ b/S3M_Module_Info_Gridded.f90 @@ -3,7 +3,7 @@ ! Author(s): Fabio Delogu, Francesco Silvestro, Simone Gabellani, Francesco Avanzi. ! ! Created on May, 20 2014, 9:57 AM -! Last update on October 26, 2020 03:00 PM +! Last update on December 15, 2023 03:00 PM ! ! Module to get info gridded !------------------------------------------------------------------------------------ @@ -27,7 +27,8 @@ module S3M_Module_Info_Gridded S3M_Tools_Generic_UnzipFile, & reshape2DVar, & filter_array_unique, & - filter_array_condition + filter_array_condition, & + S3M_Tools_Generic_RemoveFile #ifdef LIB_NC use S3M_Module_Tools_IO, only: S3M_Tools_IO_Get2d_NC, & check @@ -326,6 +327,8 @@ subroutine S3M_Info_Gridded_GetDims_Forcing(iID, iRows, iCols) call check( nf90_get_att(iFileID, nf90_global, "nrows", iRows) ) ! Close netCDF file call check( nf90_close(iFileID) ) + call S3M_Tools_Generic_RemoveFile(oS3M_Namelist(iID)%sCommandRemoveFile, & + sFileName, .false.) ! Info call mprintf(.true., iINFO_Main, ' Define forcing data dims ... OK') @@ -545,6 +548,8 @@ subroutine S3M_Info_Gridded_GetGeo_Forcing(iID) ! Close nc file call check( nf90_close(iFileID) ) + call S3M_Tools_Generic_RemoveFile(oS3M_Namelist(iID)%sCommandRemoveFile, & + sFileName, .false.) ! Info call mprintf(.true., iINFO_Main, ' Define forcing geographical data ... OK ') diff --git a/S3M_Module_Tools_Generic.f90 b/S3M_Module_Tools_Generic.f90 index f13f916..3565115 100644 --- a/S3M_Module_Tools_Generic.f90 +++ b/S3M_Module_Tools_Generic.f90 @@ -1,8 +1,9 @@ !------------------------------------------------------------------------------------------ ! File: S3M_Module_Tools_Generic.f90 -! Author: Fabio Delogu. +! Author: Fabio Delogu, Francesco Avanzi. ! ! Created on March 24, 2014, 1:25 PM +! Last update on Dec 15, 2023 09:30 AM ! ! Module to define generic tools !------------------------------------------------------------------------------------------ @@ -21,6 +22,21 @@ module S3M_Module_Tools_Generic !------------------------------------------------------------------------------------------ contains + + !------------------------------------------------------------------------------------ + ! Method to get process PID + function getProcessID() result(str) + implicit none + + character(len=256) :: str + integer(kind = 4) :: pid + + ! Get Process ID + pid = getpid() + write (str, "(I10)") pid !length of PID number to be checked!!if different from I5 does not work + + endfunction getProcessID + !------------------------------------------------------------------------------------ !------------------------------------------------------------------------------------ ! Method to filter data and return only the unique values from vec diff --git a/S3M_infofile.txt b/S3M_infofile.txt index 7cf58af..cbbdb66 100644 --- a/S3M_infofile.txt +++ b/S3M_infofile.txt @@ -8,7 +8,7 @@ sDomainName = 'vda' ! Debug flag set (iDEBUG = 0; iDEBUG = 1) -iFlagDebugSet = 0 +iFlagDebugSet = 1 ! Debug flag level (iNFO_Basic = 0; iINFO_Main = 1; iINFO_Verbose = 2; iINFO_Extra = 3) iFlagDebugLevel = 3 @@ -20,7 +20,7 @@ iFlagTypeData_Updating_Gridded = 3 iFlagTypeData_Ass_SWE_Gridded = 3 ! Restart a run (1 = yes; 0 = no) -iFlagRestart = 0 +iFlagRestart = 1 ! Computing snow assimilation MODIS + Snow Height (1 = yes; 0 = no) iFlagSnowAssim = 1 ! Computing snow assimilation of SWE (1 = yes; 0 = no) @@ -32,7 +32,7 @@ iFlagThickFromTerrData = 1 ! Apply GlacierDebris Mask (0 = no; 1 = yes) iFlagGlacierDebris = 0 ! Output mode (0 = basic output layers; 1 = extended, all layers -- much slower) -iFlagOutputMode = 0 +iFlagOutputMode = 1 ! Assimilate only positive differences (0 = no; 1 = yes) iFlagAssOnlyPos = 0 ! ----------------------------------------------------------------------------------------------- @@ -48,7 +48,7 @@ a1iDimsForcing = 206, 446 ! DT INFO --------------------------------------------------------------------------------------- ! Simulation length [hours] -iSimLength = 8760 +iSimLength = 240 ! Model dT [seconds] iDtModel = 3600 ! Data forcing gridded dT [seconds] @@ -72,28 +72,28 @@ iScaleFactor_SWEass = 10 ! TIME INFO ------------------------------------------------------------------------------------- ! Start time (yyyymmddHHMM format) -sTimeStart = 201709010000 +sTimeStart = 202301010000 ! Re-start time (yyyymmddHHMM format) -sTimeRestart = 201708312300 +sTimeRestart = 202212312300 ! ----------------------------------------------------------------------------------------------- ! PATH(S) INFO ---------------------------------------------------------------------------------- ! DATA STATIC ! Static gridded data path [Variable(s) --> DEM, CN] -sPathData_Static_Gridded = '/home/Terrain/' +sPathData_Static_Gridded = '/home/francesco/Documents/NetBeans_Dev/S3M/dati/static/' ! DATA DYNAMIC ! Forcing gridded data path [Variable(s) --> Rain, AirTemperature, IncRadiation, RelHumidity] -sPathData_Forcing_Gridded = '/home/$yyyy/$mm/$dd/' +sPathData_Forcing_Gridded = '/home/francesco/Documents/NetBeans_Dev/S3M/dati/dynamic/$yyyy/$mm/$dd/' ! Updating gridded data path [Variable(s) --> SnowCoverArea, SnowQuality, SnowMask, SnowHeight, SnowKernel] -sPathData_Updating_Gridded = '/home/$yyyy/$mm/$dd/' +sPathData_Updating_Gridded = '/home/francesco/Documents/NetBeans_Dev/S3M/dati/updating/$yyyy/$mm/$dd/' ! Output gridded data path -sPathData_Output_Gridded = '/home/$yyyy/$mm/$dd/' +sPathData_Output_Gridded = '/home/francesco/Documents/NetBeans_Dev/S3M/output/$yyyy/$mm/$dd/' ! Restart gridded data path -sPathData_Restart_Gridded = '/home/Restart_240/' +sPathData_Restart_Gridded = '/home/francesco/Documents/NetBeans_Dev/S3M/dati/restart/' ! SWE assimilation gridded data path [Variable(s) --> SWE coming from external source, ex. ARPA VdA] sPathData_SWE_Assimilation_Gridded = '/home/$yyyy/$mm/$dd/' @@ -170,11 +170,11 @@ dRhoW = 1000 ! INFO MODEL ------------------------------------------------------------------------------------ ! Release version (x.x.x) -sReleaseVersion = '5.2.0' +sReleaseVersion = '5.3.0' ! Author(s) (Surname N.) sAuthorNames = 'Avanzi F., Gabellani S., Delogu F., Silvestro F.' ! Release Date (yyyy/mm/dd) -sReleaseDate = '2023/02/09' +sReleaseDate = '2023/12/15' ! ----------------------------------------------------------------------------------------------- / diff --git a/configure.sh b/configure.sh index bf9ad5a..05ce597 100755 --- a/configure.sh +++ b/configure.sh @@ -3,8 +3,8 @@ #----------------------------------------------------------------------------------------- # Script option(s) Script="S3M Library Builder" -Version="1.0.0" -Date='2020/11/18' +Version="1.1.0" +Date='2023/12/14' # Other option(s) Archive_Default="s3m_model-apps_codes_5.2.0.tar.gz" @@ -15,7 +15,7 @@ Lib_Dir_Exec_Default="$Lib_Dir_Deps_Default/s3m" # Compilation Mode Lib_Building_Default=false # Executable name -Exec_Default='S3M_Model_V5_2_0.x' +Exec_Default='S3M_Model_V5_3_0.x' #----------------------------------------------------------------------------------------- #-----------------------------------------------------------------------------------------