diff --git a/build/source/actors/file_access_actor/cppwrap_fileAccess.f90 b/build/source/actors/file_access_actor/cppwrap_fileAccess.f90 index 1fe507c5dbea5a78b157a25e9fefdd24045709e2..db40b8b15f9389c1fff8a5ff0f3b9fadb580c64d 100644 --- a/build/source/actors/file_access_actor/cppwrap_fileAccess.f90 +++ b/build/source/actors/file_access_actor/cppwrap_fileAccess.f90 @@ -203,65 +203,6 @@ subroutine FileAccessActor_ReadForcing(handle_forcFileInfo, currentFile, stepsIn end subroutine FileAccessActor_ReadForcing -! subroutine Create_Output_File(& -! handle_ncid, & ! ncid of the output file -! numGRU, & ! number of GRUs assigned to this job -! startGRU, & ! Starting GRU indx for the job -! err) bind(C, name="Create_Output_File") -! USE globalData,only:fileout -! USE summaActors_FileManager,only:OUTPUT_PATH,OUTPUT_PREFIX ! define output file -! USE def_output_module,only:def_output ! module to define model output -! USE globalData,only:gru_struc -! USE var_lookup,only:maxVarFreq ! number of available output frequencies -! USE globalData,only:outputTimeStep -! USE globalData,only:finalizeStats -! USE var_lookup,only:iLookFreq ! named variables for the frequency structure - - -! implicit none -! type(c_ptr),intent(in), value :: handle_ncid ! ncid of the output file -! integer(c_int),intent(in) :: numGRU ! numGRUs for the entire job (for file creation) -! integer(c_int),intent(in) :: startGRU ! startGRU for the entire job (for file creation) -! integer(c_int),intent(inout) :: err ! Error code - -! ! local variables -! type(var_i),pointer :: ncid ! ncid of the output file -! character(LEN=256) :: startGRUString ! String Variable to convert startGRU -! character(LEN=256) :: numGRUString ! String Varaible to convert numGRU -! character(LEN=256) :: cmessage -! integer(i4b) :: iGRU - -! call c_f_pointer(handle_ncid, ncid) - -! ! allocate space for the output file ID array -! allocate(ncid%var(maxVarFreq)) -! ncid%var(:) = integerMissing - -! ! initialize finalizeStats for testing purposes -! allocate(outputTimeStep(numGRU)) -! do iGRU = 1, numGRU -! allocate(outputTimeStep(iGRU)%dat(maxVarFreq)) -! outputTimeStep(iGRU)%dat(:) = 1 -! end do - -! ! finalizeStats(:) = .false. -! ! finalizeStats(iLookFreq%timestep) = .true. -! ! initialize number of hru and gru in global data -! nGRUrun = numGRU -! nHRUrun = numGRU - -! write(unit=startGRUString,fmt=*)startGRU -! write(unit=numGRUString,fmt=*) numGRU -! fileout = trim(OUTPUT_PATH)//trim(OUTPUT_PREFIX)//"GRU"& -! //trim(adjustl(startGRUString))//"-"//trim(adjustl(numGRUString)) - -! ! def_output call will need to change to allow for numHRUs in future -! ! NA_Domain numGRU = numHRU, this is why we pass numGRU twice -! call def_output("summaVersion","buildTime","gitBranch","gitHash",numGRU,numGRU,& -! gru_struc(1)%hruInfo(1)%nSoil,fileout,ncid,err,cmessage) -! print*, "Creating Output File "//trim(fileout) -! end subroutine Create_Output_File - subroutine Write_HRU_Param(& handle_ncid, & indxGRU, & @@ -315,7 +256,6 @@ subroutine FileAccessActor_WriteOutput(& maxGRU, & ! index of HRU we are currently writing for err) bind(C, name="FileAccessActor_WriteOutput") USE def_output_module,only:def_output ! module to define model output - USE globalData,only:gru_struc USE var_lookup,only:maxVarFreq ! # of available output frequencies USE writeOutput_module,only:writeBasin,writeTime,writeData USE globalData,only:structInfo @@ -371,27 +311,27 @@ subroutine FileAccessActor_WriteOutput(& do iStruct=1,size(structInfo) select case(trim(structInfo(iStruct)%structName)) case('forc') - call writeData(ncid,outputTimeStep(minGRU)%dat(:),outputTimestepUpdate,maxLayers,minGRU,nSteps,& + call writeData(ncid,outputTimeStep(minGRU)%dat(:),outputTimestepUpdate,maxLayers,nSteps,& minGRU, maxGRU, numGRU, & forc_meta,outputStructure(1)%forcStat(1),outputStructure(1)%forcStruct(1),'forc', & forcChild_map,outputStructure(1)%indxStruct(1),err,cmessage) case('prog') - call writeData(ncid,outputTimeStep(minGRU)%dat(:),outputTimestepUpdate,maxLayers,minGRU,nSteps,& + call writeData(ncid,outputTimeStep(minGRU)%dat(:),outputTimestepUpdate,maxLayers,nSteps,& minGRU, maxGRU, numGRU, & prog_meta,outputStructure(1)%progStat(1),outputStructure(1)%progStruct(1),'prog', & progChild_map,outputStructure(1)%indxStruct(1),err,cmessage) case('diag') - call writeData(ncid,outputTimeStep(minGRU)%dat(:),outputTimestepUpdate,maxLayers,minGRU,nSteps,& + call writeData(ncid,outputTimeStep(minGRU)%dat(:),outputTimestepUpdate,maxLayers,nSteps,& minGRU, maxGRU, numGRU, & diag_meta,outputStructure(1)%diagStat(1),outputStructure(1)%diagStruct(1),'diag', & diagChild_map,outputStructure(1)%indxStruct(1),err,cmessage) case('flux') - call writeData(ncid,outputTimeStep(minGRU)%dat(:),outputTimestepUpdate,maxLayers,minGRU,nSteps,& + call writeData(ncid,outputTimeStep(minGRU)%dat(:),outputTimestepUpdate,maxLayers,nSteps,& minGRU, maxGRU, numGRU, & flux_meta,outputStructure(1)%fluxStat(1),outputStructure(1)%fluxStruct(1),'flux', & fluxChild_map,outputStructure(1)%indxStruct(1),err,cmessage) case('indx') - call writeData(ncid,outputTimeStep(minGRU)%dat(:),outputTimestepUpdate,maxLayers,minGRU,nSteps,& + call writeData(ncid,outputTimeStep(minGRU)%dat(:),outputTimestepUpdate,maxLayers,nSteps,& minGRU, maxGRU, numGRU, & indx_meta,outputStructure(1)%indxStat(1),outputStructure(1)%indxStruct(1),'indx', & indxChild_map,outputStructure(1)%indxStruct(1),err,cmessage) @@ -407,9 +347,7 @@ end subroutine subroutine FileAccessActor_DeallocateStructures(handle_forcFileInfo, handle_ncid) bind(C,name="FileAccessActor_DeallocateStructures") USE netcdf_util_module,only:nc_file_close - USE globalData,only:forcingDataStruct USE globalData,only:structInfo ! information on the data structures - USE globalData,only:vecTime USE globalData,only:outputTimeStep USE globalData,only:failedHRUs USE summaActors_deallocateOuptutStruct,only:deallocateOutputStruc @@ -423,8 +361,6 @@ subroutine FileAccessActor_DeallocateStructures(handle_forcFileInfo, handle_ncid character(LEN=256) :: cmessage character(LEN=256) :: message integer(i4b) :: err - integer(i4b) :: iFile - integer(i4b) :: iVar call c_f_pointer(handle_ncid, ncid) call c_f_pointer(handle_forcFileInfo, forcFileInfo) @@ -438,23 +374,10 @@ subroutine FileAccessActor_DeallocateStructures(handle_forcFileInfo, handle_ncid endif end do - ! Deallocate Forcing Structure - ! do iFile = 1, size(forcingDataStruct(:)) - ! do iVar = 1, size(forcingDataStruct(iFile)%var(:)) - ! if (allocated(forcingDataStruct(iFile)%var(iVar)%dataFromFile))then - ! deallocate(forcingDataStruct(iFile)%var(iVar)%dataFromFile) - ! endif - ! end do - ! deallocate(forcingDataStruct(iFile)%var_ix) - ! end do - ! deallocate(forcingDataStruct) - deallocate(forcFileInfo) - ! deallocate(outputStructure) deallocate(outputTimeStep) deallocate(ncid) deallocate(failedHRUs) - ! if(allocated(vecTime)) then; deallocate(vecTime); endif end subroutine FileAccessActor_DeallocateStructures diff --git a/build/source/actors/file_access_actor/file_access_actor.cpp b/build/source/actors/file_access_actor/file_access_actor.cpp index 66c8d4162a8b870e6b912193d7fb56e36ed2810d..b453461d8d25cae110cbede16b7d952163a595ce 100644 --- a/build/source/actors/file_access_actor/file_access_actor.cpp +++ b/build/source/actors/file_access_actor/file_access_actor.cpp @@ -225,17 +225,10 @@ void initalizeFileAccessActor(stateful_actor<file_access_state>* self) { initFailedHRUTracker(&self->state.numGRU); - // The CreateOutput Routine Can Fail So we may have to try it multiple times - int maxAttempt = 3; - for (int i = 0; i < maxAttempt; i++) { - def_output(self->state.handle_ncid, &self->state.startGRU, &self->state.numGRU, &self->state.numGRU, &err); - if (err == 0) { - break; - } - } + def_output(self->state.handle_ncid, &self->state.startGRU, &self->state.numGRU, &self->state.numGRU, &err); if (err != 0) { aout(self) << "ERROR: Create_OutputFile\n"; - std::string function = "Create_Output_File"; + std::string function = "def_output"; self->send(self->state.parent, file_access_actor_err_v, function); self->quit(); return; diff --git a/build/source/actors/job_actor/job_actor.cpp b/build/source/actors/job_actor/job_actor.cpp index 0378f1e53995372f4cc586b34ac837762dedfc1b..3cdef199e1cffaa686fa696dbaad62d954590c47 100644 --- a/build/source/actors/job_actor/job_actor.cpp +++ b/build/source/actors/job_actor/job_actor.cpp @@ -26,17 +26,25 @@ behavior job_actor(stateful_actor<job_state>* self, int startGRU, int numGRU, self->state.parent = parent; self->state.outputStrucSize = outputStrucSize; - if (parseSettings(self, configPath) == -1) { - aout(self) << "ERROR WITH JSON SETTINGS FILE!!!\n"; - self->quit(); - } else { - aout(self) << "\nSETTINGS FOR JOB_ACTOR\n" << - "File Manager Path = " << self->state.fileManager << "\n" << - "outputCSV = " << self->state.outputCSV << "\n"; - if (self->state.outputCSV) { - aout(self) << "csvPath = " << self->state.csvPath << "\n"; + self->state.fileManager = getSettings(self->state.configPath, "JobActor", "FileManagerPath", + self->state.fileManager).value_or(""); + self->state.outputCSV = getSettings(self->state.configPath, "JobActor", "outputCSV", + self->state.outputCSV).value_or(false); + if (self->state.outputCSV) { + self->state.csvPath = getSettings(self->state.configPath, "JobActor", "csvPath", + self->state.csvPath).value_or(""); + if (self->state.csvPath == ""){ // check if we found the value if not set outputCSV to false + self->state.outputCSV = false; } } + + // Print Settings + aout(self) << "\nSETTINGS FOR JOB_ACTOR\n" << + "File Manager Path = " << self->state.fileManager << "\n" << + "outputCSV = " << self->state.outputCSV << "\n"; + if (self->state.outputCSV) { + aout(self) << "csvPath = " << self->state.csvPath << "\n"; + } // Initalize global variables initJob(self); @@ -140,8 +148,6 @@ behavior job_actor(stateful_actor<job_state>* self, int startGRU, int numGRU, self->send(self, init_hru_v); }, - - [=](file_access_actor_done, double readDuration, double writeDuration) { int err = 0; if (debug) { @@ -194,48 +200,6 @@ behavior job_actor(stateful_actor<job_state>* self, int startGRU, int numGRU, } -int parseSettings(stateful_actor<job_state>* self, std::string configPath) { - json settings; - std::string SummaActorsSettings = "/Summa_Actors_Settings.json"; - std::ifstream settings_file(configPath + SummaActorsSettings); - settings_file >> settings; - settings_file.close(); - - if (settings.find("JobActor") != settings.end()) { - json JobActorConfig = settings["JobActor"]; - // Find the File Manager Path - if (JobActorConfig.find("FileManagerPath") != JobActorConfig.end()) { - self->state.fileManager = JobActorConfig["FileManagerPath"]; - } else { - aout(self) << "Error Finding FileManagerPath - Exiting as this is needed\n"; - return -1; - } - - // Find if we want to outputCSV - if (JobActorConfig.find("outputCSV") != JobActorConfig.end()) { - self->state.outputCSV = JobActorConfig["outputCSV"]; - } else { - aout(self) << "Error Finding outputCSV in JSON file - Reverting to Default Value\n"; - self->state.outputCSV = false; - } - - // Output Path of CSV - if (self->state.outputCSV) { - if (JobActorConfig.find("csvPath") != JobActorConfig.end()) { - self->state.csvPath = JobActorConfig["csvPath"]; - } else { - aout(self) << "Error Finding csvPath in JSON file = Reverting to Default Value \n"; - self->state.outputCSV = false; // we just choose not to output a csv - } - } - - return 0; - } else { - aout(self) << "Error Finding JobActor in JSON file - Exiting as there is no path for the fileManger\n"; - return -1; - } -} - void initJob(stateful_actor<job_state>* self) { std::string success = "Success"; // allows us to build the string if (self->state.outputCSV) { @@ -249,7 +213,6 @@ void initJob(stateful_actor<job_state>* self) { file.close(); } - int totalGRUs = 0; int totalHRUs = 0; int numHRUs = 0; diff --git a/build/source/engine/ffile_info.f90 b/build/source/engine/ffile_info.f90 index 1dcaccfef8020942adeb0b5dc45eb83941f14f8a..32ff3292667bf16f4cefa4a6e391c603b96aacf2 100755 --- a/build/source/engine/ffile_info.f90 +++ b/build/source/engine/ffile_info.f90 @@ -23,7 +23,6 @@ USE nrtype USE netcdf USE data_types USE globalData,only:integerMissing -USE globalData,only:ixHRUfile_min,ixHRUfile_max implicit none private public::ffile_info diff --git a/build/source/netcdf/writeOutput.f90 b/build/source/netcdf/writeOutput.f90 index f37dfa0c44776fb8d4202af43a3a07fe1e343ca7..5ae13865870d20c0dad4d44e2501f8bb8a0d60d4 100644 --- a/build/source/netcdf/writeOutput.f90 +++ b/build/source/netcdf/writeOutput.f90 @@ -150,7 +150,7 @@ end subroutine writeParm ! ************************************************************************************** ! public subroutine writeData: write model time-dependent data ! ************************************************************************************** -subroutine writeData(ncid,outputTimestep,outputTimestepUpdate,maxLayers,indxGRU,nSteps, & +subroutine writeData(ncid,outputTimestep,outputTimestepUpdate,maxLayers,nSteps, & minGRU, maxGRU, numGRU, & meta,stat,dat,structName,map,indx,err,message) USE data_types,only:var_info ! metadata type @@ -170,7 +170,6 @@ subroutine writeData(ncid,outputTimestep,outputTimestepUpdate,maxLayers,indxGRU, integer(i4b) ,intent(inout) :: outputTimestep(:) ! output time step integer(i4b) ,intent(inout) :: outputTimestepUpdate(:) ! number of HRUs in the run domain integer(i4b) ,intent(in) :: maxLayers ! maximum number of layers - integer(i4b) ,intent(in) :: indxGRU integer(i4b) ,intent(in) :: nSteps ! number of timeSteps integer(i4b) ,intent(in) :: minGRU ! minGRU index to write integer(i4b) ,intent(in) :: maxGRU ! maxGRU index to write - probably not needed