diff --git a/build/includes/file_access_actor/file_access_actor.hpp b/build/includes/file_access_actor/file_access_actor.hpp index 57e0156b7d95fe6712773941e7e6604a2181564f..2c87019f702addc487659ef5a230acef2ac41b24 100644 --- a/build/includes/file_access_actor/file_access_actor.hpp +++ b/build/includes/file_access_actor/file_access_actor.hpp @@ -13,8 +13,8 @@ * File Access Actor Fortran Functions *********************************************/ extern "C" { - void defOutputFortran(void* handle_ncid, int* num_gru, int* num_hru, - int* err); + void defOutputFortran(void* handle_ncid, int* start_gru, int* num_gru, + int* num_hru, int* file_gru, int* err); void fileAccessActor_init_fortran(void* handle_forcing_file_info, int* num_forcing_files, int* num_timesteps, diff --git a/build/includes/job_actor/job_actor.hpp b/build/includes/job_actor/job_actor.hpp index cab8e6471aeea49df0050b6133f6167fd7e32a5f..73ff1d8490f6481a9aa87dad14484f5bcae8de7b 100644 --- a/build/includes/job_actor/job_actor.hpp +++ b/build/includes/job_actor/job_actor.hpp @@ -21,7 +21,7 @@ *********************************************/ extern "C" { void job_init_fortran(char const* file_manager, int* start_gru_index, - int* num_gru, int* num_hru, int* err); + int* num_gru, int* num_hru, int* file_gru, int* err); void deallocateJobActor(int* err); } diff --git a/build/source/file_access_actor/cppwrap_fileAccess.f90 b/build/source/file_access_actor/cppwrap_fileAccess.f90 index 8a4ebdff14197668892a4adddfa9ed632c98e01c..b6aacef607f8ac05eb4dfcf321c4cf6898001ce4 100644 --- a/build/source/file_access_actor/cppwrap_fileAccess.f90 +++ b/build/source/file_access_actor/cppwrap_fileAccess.f90 @@ -209,7 +209,7 @@ subroutine fileAccessActor_init_fortran(& ! Variables for forcing attrFile = trim(SETTINGS_PATH)//trim(LOCAL_ATTRIBUTES) call read_attrb(trim(attrFile),num_gru,outputStructure(1)%attrStruct,& - outputStructure(1)%typeStruct,outputStructure(1)%idStruct,err,message) + outputStructure(1)%typeStruct,outputStructure(1)%idStruct,err,message) if(err/=0)then; print*,trim(message); return; endif @@ -363,12 +363,13 @@ subroutine fileAccessActor_init_fortran(& ! Variables for forcing if(err/=0)then; print*, message; return; endif end subroutine fileAccessActor_init_fortran -subroutine defOutputFortran(handle_output_ncid, num_gru, num_hru, err) & - bind(C, name="defOutputFortran") +subroutine defOutputFortran(handle_output_ncid, start_gru, num_gru, num_hru, & + file_gru, err) bind(C, name="defOutputFortran") USE globalData,only:nGRUrun,nHRUrun USE globalData,only:fileout,output_fileSuffix USE globalData,only:ncid USE globalData,only:integerMissing + USE globalData,only:iRunMode,iRunModeFull,iRunModeGRU,iRunModeHRU ! define the running modes USE summaFileManager,only:OUTPUT_PATH,OUTPUT_PREFIX ! define output file @@ -380,16 +381,36 @@ subroutine defOutputFortran(handle_output_ncid, num_gru, num_hru, err) & ! Dummy Variables type(c_ptr),intent(in), value :: handle_output_ncid + integer(c_int),intent(in) :: start_gru integer(c_int),intent(in) :: num_gru integer(c_int),intent(in) :: num_hru + integer(c_int),intent(in) :: file_gru integer(c_int),intent(out) :: err ! Local Variables type(var_i),pointer :: output_ncid + character(len=128) :: fmtGruOutput ! a format string used to write start and end GRU in output file names + character(len=256) :: message ! error message call c_f_pointer(handle_output_ncid, output_ncid) + output_fileSuffix = '' + if (output_fileSuffix(1:1) /= '_') output_fileSuffix='_'//trim(output_fileSuffix) + if (output_fileSuffix(len_trim(output_fileSuffix):len_trim(output_fileSuffix)) == '_') output_fileSuffix(len_trim(output_fileSuffix):len_trim(output_fileSuffix)) = ' ' + select case (iRunMode) + case(iRunModeGRU) + ! left zero padding for startGRU and endGRU + write(fmtGruOutput,"(i0)") ceiling(log10(real(file_gru)+0.1)) ! maximum width of startGRU and endGRU + fmtGruOutput = "i"//trim(fmtGruOutput)//"."//trim(fmtGruOutput) ! construct the format string for startGRU and endGRU + fmtGruOutput = "('_G',"//trim(fmtGruOutput)//",'-',"//trim(fmtGruOutput)//")" + write(output_fileSuffix((len_trim(output_fileSuffix)+1):len(output_fileSuffix)),fmtGruOutput) start_gru,start_gru+num_gru-1 + case(iRunModeHRU) + write(output_fileSuffix((len_trim(output_fileSuffix)+1):len(output_fileSuffix)),"('_H',i0)") checkHRU + end select + + + nGRUrun = num_gru nHRUrun = num_hru fileout = trim(OUTPUT_PATH)//trim(OUTPUT_PREFIX)//trim(output_fileSuffix) diff --git a/build/source/file_access_actor/file_access_actor.cpp b/build/source/file_access_actor/file_access_actor.cpp index 512c891be0578e7941e25b41e9bebdadd5f9d965..732af9d2affcc1d0d80f1f412cb67afd76077d71 100644 --- a/build/source/file_access_actor/file_access_actor.cpp +++ b/build/source/file_access_actor/file_access_actor.cpp @@ -67,12 +67,12 @@ behavior file_access_actor(stateful_actor<file_access_state>* self, fa_settings.num_timesteps_in_output_buffer, self->state.num_steps); return { - [=](def_output) { + [=](def_output, int file_gru) { aout(self) << "Creating Output File\n"; int num_hru = self->state.num_gru; // Filler for num_hrus int err = 0; - defOutputFortran(self->state.handle_ncid, &self->state.num_gru, &num_hru, - &err); + defOutputFortran(self->state.handle_ncid, &self->state.start_gru, + &self->state.num_gru, &num_hru, &file_gru, &err); if (self->state.err != 0) { aout(self) << "ERROR: Defining Output\n"; self->quit(); diff --git a/build/source/job_actor/job_actor.cpp b/build/source/job_actor/job_actor.cpp index 63d90505c877f227cd816a3a1f1ff80212fab73c..26c83e4976230284ab589450dbc9f2425bb4f40f 100644 --- a/build/source/job_actor/job_actor.cpp +++ b/build/source/job_actor/job_actor.cpp @@ -60,9 +60,10 @@ behavior job_actor(stateful_actor<job_state>* self, - read_icond_nlayers - Allocates time structures */ + int file_gru = 0; job_init_fortran(self->state.job_actor_settings.file_manager_path.c_str(), - &self->state.start_gru, &self->state.num_gru, - &self->state.num_hru, &err); + &self->state.start_gru, &self->state.num_gru, &self->state.num_hru, + &file_gru, &err); if (err != 0) { aout(self) << "\nERROR: Job_Actor - job_init_fortran\n"; return {}; @@ -72,7 +73,7 @@ behavior job_actor(stateful_actor<job_state>* self, self->state.file_access_actor = self->spawn(file_access_actor, self->state.start_gru, self->state.num_gru, self->state.file_access_actor_settings, self); - self->send(self->state.file_access_actor, def_output_v); + self->send(self->state.file_access_actor, def_output_v, file_gru); aout(self) << "Job Actor Initialized \n"; diff --git a/build/source/job_actor/job_actor.f90 b/build/source/job_actor/job_actor.f90 index 4d5f09943b0e1daf36928e8cd2990db621e7bb7f..f06d610b91831deac022380c3fb17126c4a46abe 100644 --- a/build/source/job_actor/job_actor.f90 +++ b/build/source/job_actor/job_actor.f90 @@ -13,7 +13,7 @@ module job_actor contains subroutine job_init_fortran(file_manager, start_gru, num_gru,& - num_hru, err) bind(C, name="job_init_fortran") + num_hru, file_gru, err) bind(C, name="job_init_fortran") USE nrtype ! variable types, etc. USE summaFileManager,only:summa_SetTimesDirsAndFiles ! sets directories and filenames @@ -50,13 +50,13 @@ subroutine job_init_fortran(file_manager, start_gru, num_gru,& integer(c_int),intent(inout) :: start_gru integer(c_int),intent(inout) :: num_gru integer(c_int),intent(inout) :: num_hru + integer(c_int),intent(out) :: file_gru integer(c_int),intent(out) :: err ! local variables character(len=256) :: summaFileManagerIn character(len=256) :: restartFile ! restart file name character(len=256) :: attrFile ! attributes file name - integer(i4b) :: fileGRU ! [used for filenames] number of GRUs in the input file integer(i4b) :: fileHRU ! [used for filenames] number of HRUs in the input file character(len=128) :: fmtGruOutput ! a format string used to write start and end GRU in output file names @@ -86,31 +86,11 @@ subroutine job_init_fortran(file_manager, start_gru, num_gru,& attrFile = trim(SETTINGS_PATH)//trim(LOCAL_ATTRIBUTES) select case (iRunMode) case(iRunModeFull); err=20; message='iRunModeFull not implemented for Actors Code' - case(iRunModeGRU ); call read_dimension(trim(attrFile),fileGRU,fileHRU,num_gru,num_hru,err,message,startGRU=start_gru) + case(iRunModeGRU ); call read_dimension(trim(attrFile),file_gru,fileHRU,num_gru,num_hru,err,message,startGRU=start_gru) case(iRunModeHRU ); err=20; message='iRunModeHRU not implemented for Actors Code' end select if(err/=0)then; print*, trim(message); return; endif - ! **************************************************************************** - ! *** define the suffix for the model output file - ! *** OUTPUT_PREFIX'_'output_fileSuffix'_'startGRU-endGRU_outfreq.nc or - ! *** OUTPUT_PREFIX'_'output_fileSuffix'_'HRU_outfreq.nc - ! **************************************************************************** - output_fileSuffix = '' - if (output_fileSuffix(1:1) /= '_') output_fileSuffix='_'//trim(output_fileSuffix) - if (output_fileSuffix(len_trim(output_fileSuffix):len_trim(output_fileSuffix)) == '_') output_fileSuffix(len_trim(output_fileSuffix):len_trim(output_fileSuffix)) = ' ' - select case (iRunMode) - case(iRunModeGRU) - ! left zero padding for startGRU and endGRU - write(fmtGruOutput,"(i0)") ceiling(log10(real(fileGRU)+0.1)) ! maximum width of startGRU and endGRU - fmtGruOutput = "i"//trim(fmtGruOutput)//"."//trim(fmtGruOutput) ! construct the format string for startGRU and endGRU - fmtGruOutput = "('_G',"//trim(fmtGruOutput)//",'-',"//trim(fmtGruOutput)//")" - write(output_fileSuffix((len_trim(output_fileSuffix)+1):len(output_fileSuffix)),fmtGruOutput) start_gru,start_gru+num_gru-1 - case(iRunModeHRU) - write(output_fileSuffix((len_trim(output_fileSuffix)+1):len(output_fileSuffix)),"('_H',i0)") checkHRU - end select - - ! ***************************************************************************** ! *** read the number of snow and soil layers ! ***************************************************************************** diff --git a/build/source/job_actor/node_actor.cpp b/build/source/job_actor/node_actor.cpp index b4d2e2577cfade4cb2e76ae1523e522c35d27549..0cec05cc5111e9a95ab5fdf2a6f241bb95f508e8 100644 --- a/build/source/job_actor/node_actor.cpp +++ b/build/source/job_actor/node_actor.cpp @@ -59,10 +59,10 @@ behavior node_actor(stateful_actor<node_state>* self, self->state.num_gru = num_gru; self->state.gru_container.num_gru_in_run_domain = num_gru; - int err; + int err, file_gru; job_init_fortran(self->state.job_actor_settings.file_manager_path.c_str(), &self->state.start_gru, &self->state.num_gru, &self->state.num_gru, - &err); + &file_gru, &err); if (err != 0) { aout(self) << "\nERROR: Job_Actor - job_init_fortran\n"; self->quit(); @@ -71,8 +71,8 @@ behavior node_actor(stateful_actor<node_state>* self, // Spawn the file_access_actor. self->state.file_access_actor = self->spawn(file_access_actor, self->state.start_gru, self->state.num_gru, - self->state.file_access_actor_settings, - self); + self->state.file_access_actor_settings, self); + self->send(self->state.file_access_actor, def_output_v, file_gru); }, [=](init_file_access_actor, int num_timesteps) {