diff --git a/build/includes/file_access_actor/file_access_actor_subroutine_wrappers.hpp b/build/includes/file_access_actor/file_access_actor_subroutine_wrappers.hpp index 03c7e93507ce59e5671f1239db82353510ea42bf..d2f750866bd887fbb30ec3b0920800a2c238c903 100644 --- a/build/includes/file_access_actor/file_access_actor_subroutine_wrappers.hpp +++ b/build/includes/file_access_actor/file_access_actor_subroutine_wrappers.hpp @@ -38,7 +38,7 @@ extern "C" { void readParamFileAccessActor(int* start_gru, int* num_gru, int* err); - void writeParamToNetCDF(void* handle_ncid, int* index_gru, int* index_hru, + void writeParamToNetCDF(void* handle_ncid, int* index_gru, int* index_hru, void* handle_attr_struct, void* handle_type_struct, void* handle_mpar_struct, void* handle_bpar_struct, int* err); } diff --git a/build/includes/hru_actor/hru_actor_subroutine_wrappers.hpp b/build/includes/hru_actor/hru_actor_subroutine_wrappers.hpp index e85004ee1cce03439c1341b5ba951abfe94b4bc9..bebaf0e0011cdc7d899d23d3bddc0069c21dabf2 100644 --- a/build/includes/hru_actor/hru_actor_subroutine_wrappers.hpp +++ b/build/includes/hru_actor/hru_actor_subroutine_wrappers.hpp @@ -96,4 +96,13 @@ extern "C" { int* indxGRU, int* indxHRU, void* handle_attrStruct, void* handle_typeStruct, void* handle_mparStruct, void* handle_bparStruct, int* err); + + void prepareOutput(int* model_timestep, void* handle_force_stat, void* handle_prog_stat, + void* handle_diag_stat, void* handle_flux_stat, void* handle_indx_stat, + void* handle_bvar_stat, void* handle_time_struct, void* handle_forc_struct, + void* handle_attr_struct, void* handle_type_struct, void* handle_indx_struct, + void* handle_mpar_struct, void* handle_prog_struct, void* handle_diag_struct, + void* handle_flux_struct, void* handle_bpar_struct, void* handle_bvar_struct, + void* stat_counter, void* output_timestep, void* reset_stats, void* finalize_stats, + void* finish_time, void* old_time, int* err); } \ No newline at end of file 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 d1003deb85b6b409d4345be08f46ea0127cef791..b81fdba66b23bf0731765ebc445d64633fef0a30 100644 --- a/build/source/actors/file_access_actor/file_access_actor.cpp +++ b/build/source/actors/file_access_actor/file_access_actor.cpp @@ -57,24 +57,21 @@ behavior file_access_actor(stateful_actor<file_access_state>* self, int startGRU std::vector<int> type_struct, std::vector<std::vector<double>> mpar_struct, std::vector<double> bpar_struct) { int err = 0; + + // create structures to populate in Fortran void *handle_attr_struct = new_handle_var_d(); void *handle_type_struct = new_handle_var_i(); void *handle_mpar_struct = new_handle_var_dlength(); void *handle_bpar_struct = new_handle_var_d(); - + // populate the newly created Fortran structures set_var_d(attr_struct, handle_attr_struct); set_var_i(type_struct, handle_type_struct); set_var_dlength(mpar_struct, handle_mpar_struct); set_var_d(bpar_struct, handle_bpar_struct); - + // write the populated data to netCDF writeParamToNetCDF(self->state.handle_ncid, &index_gru, &index_hru, handle_attr_struct, handle_type_struct, handle_mpar_struct, handle_bpar_struct, &err); - - // Write_HRU_Param(self->state.handle_ncid, &index_gru, &index_hru, &err); - // if (err != 0) { - // aout(self) << "ERROR: Write_HRU_PARAM -- For HRU = " << index_hru << "\n"; - // } }, [=](access_forcing, int currentFile, caf::actor refToRespondTo) { @@ -139,6 +136,18 @@ behavior file_access_actor(stateful_actor<file_access_state>* self, int startGRU } }, + [=](write_output, int index_gru, int index_hru, std::vector<int> finalize_stats, + std::vector<std::vector<double>> forc_stat, std::vector<double> forc_struct, + std::vector<std::vector<double>> prog_stat, std::vector<std::vector<double>> prog_struct, + std::vector<std::vector<double>> diag_stat, std::vector<std::vector<double>> diag_struct, + std::vector<std::vector<double>> flux_stat, std::vector<std::vector<double>> flux_struct, + std::vector<std::vector<double>> indx_stat, std::vector<std::vector<int>> indx_struct, + std::vector<int> outptu_timestep) { + + + + }, + [=](write_output, int indxGRU, int indxHRU, int numStepsToWrite, caf::actor refToRespondTo) { int err; diff --git a/build/source/actors/file_access_actor/file_access_actor.f90 b/build/source/actors/file_access_actor/file_access_actor.f90 index 5af004c2983ee4d1da4c5154442f269e06163ba5..d164fd829dbf04add88e2ec83af63012d0f8737d 100644 --- a/build/source/actors/file_access_actor/file_access_actor.f90 +++ b/build/source/actors/file_access_actor/file_access_actor.f90 @@ -80,8 +80,121 @@ subroutine writeParamToNetCDF(handle_ncid, & end subroutine writeParamToNetCDF -subroutine writeDataToNetCDF() bind(C, name="writeDataToNetCDF") -implicit none +subroutine writeDataToNetCDF(handle_ncid, & + index_gru, & + index_hru, & + handle_finalize_stats, & + handle_forc_stat, & + handle_forc_struct, & + handle_prog_stat, & + handle_prog_struct, & + handle_diag_stat, & + handle_diag_struct, & + handle_flux_stat, & + handle_flux_struct, & + handle_indx_stat, & + handle_indx_struct, & + handle_output_timestep,& + err) bind(C, name="writeDataToNetCDF") + USE globalData, only:forc_meta, prog_meta, diag_meta, flux_meta, indx_meta + USE globalData, only:forcChild_map, progChild_map, diagChild_map, fluxChild_map, indxChild_map + USE globalData,only:maxLayers ! maximum number of layers + USE globalData,only:structInfo + USE writeOutput_module,only:writeParm + USE writeOutput_module,only:writeDataNew + + implicit none + ! dummy variables + type(c_ptr), intent(in), value :: handle_ncid + integer(c_int), intent(in) :: index_gru + integer(c_int), intent(in) :: index_hru + type(c_ptr), intent(in), value :: handle_finalize_stats + type(c_ptr), intent(in), value :: handle_forc_stat + type(c_ptr), intent(in), value :: handle_forc_struct + type(c_ptr), intent(in), value :: handle_prog_stat + type(c_ptr), intent(in), value :: handle_prog_struct + type(c_ptr), intent(in), value :: handle_diag_stat + type(c_ptr), intent(in), value :: handle_diag_struct + type(c_ptr), intent(in), value :: handle_flux_stat + type(c_ptr), intent(in), value :: handle_flux_struct + type(c_ptr), intent(in), value :: handle_indx_stat + type(c_ptr), intent(in), value :: handle_indx_struct + type(c_ptr), intent(in), value :: handle_output_timestep + integer(c_int), intent(out) :: err + ! local pointers + type(var_i), pointer :: ncid + type(flagVec), pointer :: finalize_stats + type(var_dlength),pointer :: forc_stat + type(var_d),pointer :: forc_struct + type(var_dlength),pointer :: prog_stat + type(var_dlength),pointer :: prog_struct + type(var_dlength),pointer :: diag_stat + type(var_dlength),pointer :: diag_struct + type(var_dlength),pointer :: flux_stat + type(var_dlength),pointer :: flux_struct + type(var_dlength),pointer :: indx_stat + type(var_ilength),pointer :: indx_struct + type(var_i),pointer :: output_timestep + ! local_variables + integer(i4b) :: numGRU=1 + integer(i4b) :: nSteps=1 + integer(i4b) :: iStruct + character(LEN=256) :: cmessage + character(LEN=256) :: message + ! --------------------------------------------------------------------------------------- + ! * Convert From C++ to Fortran + ! --------------------------------------------------------------------------------------- + call c_f_pointer(handle_ncid, ncid) + call c_f_pointer(handle_finalize_stats, finalize_stats) + call c_f_pointer(handle_forc_stat, forc_stat) + call c_f_pointer(handle_forc_struct, forc_struct) + call c_f_pointer(handle_prog_stat, prog_stat) + call c_f_pointer(handle_prog_struct, prog_struct) + call c_f_pointer(handle_diag_stat, diag_stat) + call c_f_pointer(handle_diag_struct, diag_struct) + call c_f_pointer(handle_flux_stat, flux_stat) + call c_f_pointer(handle_flux_struct, flux_struct) + call c_f_pointer(handle_indx_stat, indx_stat) + call c_f_pointer(handle_indx_struct, indx_struct) + call c_f_pointer(handle_output_timestep, output_timestep) + + message="file_access_actor.f90 - writeDataToNetCDF" + do iStruct=1,size(structInfo) + select case(trim(structInfo(iStruct)%structName)) + case('forc') + call writeDataNew(ncid, finalize_stats%dat(:), output_timestep%var(:),maxLayers,& + index_gru, numGRU, & + forc_meta,forc_stat,forc_struct,'forc', & + forcChild_map,indx_struct,err,cmessage) + case('prog') + call writeDataNew(ncid, finalize_stats%dat(:), output_timestep%var(:),maxLayers,& + index_gru, numGRU, & + prog_meta,prog_stat,prog_struct,'prog', & + progChild_map,indx_struct,err,cmessage) + case('diag') + call writeDataNew(ncid, finalize_stats%dat(:), output_timestep%var(:),maxLayers,& + index_gru, numGRU, & + diag_meta, diag_stat, diag_struct,'diag', & + diagChild_map,indx_struct,err,cmessage) + case('flux') + call writeDataNew(ncid, finalize_stats%dat(:), output_timestep%var(:),maxLayers,& + index_gru, numGRU, & + flux_meta,flux_stat,flux_struct,'flux', & + fluxChild_map,indx_struct,err,cmessage) + case('indx') + call writeDataNew(ncid, finalize_stats%dat(:), output_timestep%var(:),maxLayers,& + index_gru, numGRU, & + indx_meta,indx_stat, indx_struct, 'indx', & + indxChild_map,indx_struct,err,cmessage) + end select + if(err/=0)then + message=trim(message)//trim(cmessage)//'['//trim(structInfo(iStruct)%structName)//']' + print*, message + return + endif + end do ! (looping through structures) + + end subroutine writeDataToNetCDF subroutine writeBasinToNetCDF() bind(C, name="writeBasinToNetCDF") diff --git a/build/source/actors/hru_actor/hru_actor.cpp b/build/source/actors/hru_actor/hru_actor.cpp index 467c59e2d573d5f00ff0320f2ea24de757e424b3..7784fa9d9851c8d14071af31f9af394ddca31336 100644 --- a/build/source/actors/hru_actor/hru_actor.cpp +++ b/build/source/actors/hru_actor/hru_actor.cpp @@ -61,15 +61,7 @@ behavior hru_actor(stateful_actor<hru_state>* self, int refGRU, int indxGRU, [=](start_hru) { self->state.hru_timing.updateStartPoint("total_duration"); - - int err; - - err = 0; - // Write Paramaters to OutputStruc - // Write_Param_C(&self->state.indxGRU, &self->state.indxHRU, - // self->state.handle_attrStruct, self->state.handle_typeStruct, - // self->state.handle_mparStruct, self->state.handle_bparStruct, - // &err); + int err = 0; std::vector<double> attr_struct_array = get_var_d(self->state.handle_attrStruct); std::vector<int> type_struct_array = get_var_i(self->state.handle_typeStruct); std::vector<std::vector<double>> mpar_struct_array = get_var_dlength(self->state.handle_mparStruct); @@ -112,9 +104,6 @@ behavior hru_actor(stateful_actor<hru_state>* self, int refGRU, int indxGRU, }, - - - [=](done_write) { self->state.hru_timing.updateStartPoint("total_duration"); @@ -364,34 +353,31 @@ int Run_HRU(stateful_actor<hru_state>* self) { self->state.hru_timing.updateEndPoint("run_physics_duration"); self->state.hru_timing.updateStartPoint("write_output_duration"); - WriteOutput(&self->state.indxHRU, - &self->state.indxGRU, - &self->state.timestep, - self->state.handle_forcStat, - self->state.handle_progStat, - self->state.handle_diagStat, - self->state.handle_fluxStat, - self->state.handle_indxStat, - self->state.handle_bvarStat, - self->state.handle_timeStruct, - self->state.handle_forcStruct, - self->state.handle_attrStruct, - self->state.handle_typeStruct, - self->state.handle_indxStruct, - self->state.handle_mparStruct, - self->state.handle_progStruct, - self->state.handle_diagStruct, - self->state.handle_fluxStruct, - self->state.handle_bparStruct, - self->state.handle_bvarStruct, - self->state.handle_statCounter, - self->state.handle_outputTimeStep, - self->state.handle_resetStats, - self->state.handle_finalizeStats, - self->state.handle_finshTime, - self->state.handle_oldTime, - &self->state.outputStep, - &self->state.err); + prepareOutput(&self->state.timestep, + self->state.handle_forcStat, + self->state.handle_progStat, + self->state.handle_diagStat, + self->state.handle_fluxStat, + self->state.handle_indxStat, + self->state.handle_bvarStat, + self->state.handle_timeStruct, + self->state.handle_forcStruct, + self->state.handle_attrStruct, + self->state.handle_typeStruct, + self->state.handle_indxStruct, + self->state.handle_mparStruct, + self->state.handle_progStruct, + self->state.handle_diagStruct, + self->state.handle_fluxStruct, + self->state.handle_bparStruct, + self->state.handle_bvarStruct, + self->state.handle_statCounter, + self->state.handle_outputTimeStep, + self->state.handle_resetStats, + self->state.handle_finalizeStats, + self->state.handle_finshTime, + self->state.handle_oldTime, + &self->state.err); if (self->state.err != 0) { aout(self) << "Error: WriteOutput - HRU = " << self->state.indxHRU << " - indxGRU = " << self->state.indxGRU << " - refGRU = " << self->state.refGRU << diff --git a/build/source/actors/hru_actor/hru_actor.f90 b/build/source/actors/hru_actor/hru_actor.f90 index 04811c62a7e0d28004f420b75578f77588df8604..2ad3473d43aff2f3eb0d054ce7b69f2ff1643ba6 100644 --- a/build/source/actors/hru_actor/hru_actor.f90 +++ b/build/source/actors/hru_actor/hru_actor.f90 @@ -24,34 +24,33 @@ end subroutine getSummaVariableInfo subroutine prepareOutput(& modelTimeStep, & ! statistics variables - forcStat, & ! model forcing data - progStat, & ! model prognostic (state) variables - diagStat, & ! model diagnostic variables - fluxStat, & ! model fluxes - indxStat, & ! model indices - bvarStat, & ! basin-average variables + handle_forcStat, & ! model forcing data + handle_progStat, & ! model prognostic (state) variables + handle_diagStat, & ! model diagnostic variables + handle_fluxStat, & ! model fluxes + handle_indxStat, & ! model indices + handle_bvarStat, & ! basin-average variables ! primary data structures (scalars) - timeStruct, & ! x%var(:) -- model time data - forcStruct, & ! x%var(:) -- model forcing data - attrStruct, & ! x%var(:) -- local attributes for each HRU - typeStruct, & ! x%var(:) -- local classification of soil veg etc. for each HRU + handle_timeStruct, & ! x%var(:) -- model time data + handle_forcStruct, & ! x%var(:) -- model forcing data + handle_attrStruct, & ! x%var(:) -- local attributes for each HRU + handle_typeStruct, & ! x%var(:) -- local classification of soil veg etc. for each HRU ! primary data structures (variable length vectors) - indxStruct, & ! x%var(:)%dat -- model indices - mparStruct, & ! x%var(:)%dat -- model parameters - progStruct, & ! x%var(:)%dat -- model prognostic (state) variables - diagStruct, & ! x%var(:)%dat -- model diagnostic variables - fluxStruct, & ! x%var(:)%dat -- model fluxes + handle_indxStruct, & ! x%var(:)%dat -- model indices + handle_mparStruct, & ! x%var(:)%dat -- model parameters + handle_progStruct, & ! x%var(:)%dat -- model prognostic (state) variables + handle_diagStruct, & ! x%var(:)%dat -- model diagnostic variables + handle_fluxStruct, & ! x%var(:)%dat -- model fluxes ! basin-average structures - bparStruct, & ! x%var(:) -- basin-average parameters - bvarStruct, & ! x%var(:)%dat -- basin-average variables - statCounter, & - outputTimeStep, & ! x%var(:) - resetStats, & ! x%var(:) - finalizeStats, & ! x%var(:) - finshTime, & ! x%var(:) -- end time for the model simulation - oldTime, & ! x%var(:) -- time for the previous model time step - outputStep, & ! index into the output Struc - err, message) + handle_bparStruct, & ! x%var(:) -- basin-average parameters + handle_bvarStruct, & ! x%var(:)%dat -- basin-average variables + handle_statCounter, & + handle_outputTimeStep, & ! x%var(:) + handle_resetStats, & ! x%var(:) + handle_finalizeStats, & ! x%var(:) + handle_finshTime, & ! x%var(:) -- end time for the model simulation + handle_oldTime, & ! x%var(:) -- time for the previous model time step + err) bind(C, name="prepareOutput") USE globalData,only:structInfo USE globalData,only:startWrite,endWrite @@ -67,79 +66,106 @@ subroutine prepareOutput(& USE outputStrucWrite_module,only:writeParm ! module to write model parameters USE time_utils_module,only:elapsedSec ! calculate the elapsed time USE globalData,only:elapsedWrite - USE var_lookup,only:iLookTIME ! named variables for time data structure - USE var_lookup,only:iLookDIAG ! named variables for local column model diagnostic variables - USE var_lookup,only:iLookPROG ! named variables for local column model prognostic variables - USE var_lookup,only:iLookINDEX ! named variables for local column index variables - USE var_lookup,only:iLookFreq ! named variables for the frequency structure - USE var_lookup,only:maxvarFreq ! maximum number of output files - USE globalData,only:time_meta ! metadata on the model time - USE globalData,only:forc_meta ! metadata on the model forcing data - USE globalData,only:diag_meta ! metadata on the model diagnostic variables - USE globalData,only:prog_meta ! metadata on the model prognostic variables - USE globalData,only:flux_meta ! metadata on the model fluxes - USE globalData,only:indx_meta ! metadata on the model index variables - USE globalData,only:bvar_meta ! metadata on basin-average variables - USE globalData,only:bpar_meta ! basin parameter metadata structure - USE globalData,only:mpar_meta ! local parameter metadata structure - ! child metadata for stats - USE globalData,only:statForc_meta ! child metadata for stats - USE globalData,only:statProg_meta ! child metadata for stats - USE globalData,only:statDiag_meta ! child metadata for stats - USE globalData,only:statFlux_meta ! child metadata for stats - USE globalData,only:statIndx_meta ! child metadata for stats - USE globalData,only:statBvar_meta ! child metadata for stats + USE var_lookup,only:iLookTIME,iLookDIAG,iLookPROG,iLookINDEX, & + iLookFreq,maxvarFreq ! named variables for time data structure + USE globalData,only:time_meta,forc_meta,diag_meta,prog_meta,& + flux_meta,indx_meta,bvar_meta,bpar_meta,mpar_meta ! metadata on the model time + USE globalData,only:statForc_meta,statProg_meta,statDiag_meta,& + statFlux_meta,statIndx_meta,statBvar_meta ! child metadata for stats ! index of the child data structure - USE globalData,only:forcChild_map ! index of the child data structure: stats forc - USE globalData,only:progChild_map ! index of the child data structure: stats prog - USE globalData,only:diagChild_map ! index of the child data structure: stats diag - USE globalData,only:fluxChild_map ! index of the child data structure: stats flux - USE globalData,only:indxChild_map ! index of the child data structure: stats indx - USE globalData,only:bvarChild_map ! index of the child data structure: stats bvar + USE globalData,only:forcChild_map,progChild_map,diagChild_map,& + fluxChild_map,indxChild_map,bvarChild_map ! index of the child data structure: stats forc implicit none integer(i4b),intent(in) :: modelTimeStep ! time step index - type(var_dlength),intent(inout) :: forcStat ! model forcing data - type(var_dlength),intent(inout) :: progStat ! model prognostic (state) variables - type(var_dlength),intent(inout) :: diagStat ! model diagnostic variables - type(var_dlength),intent(inout) :: fluxStat ! model fluxes - type(var_dlength),intent(inout) :: indxStat ! model indices - type(var_dlength),intent(inout) :: bvarStat ! basin-average variabl + type(c_ptr), intent(in), value :: handle_forcStat ! model forcing data + type(c_ptr), intent(in), value :: handle_progStat ! model prognostic (state) variables + type(c_ptr), intent(in), value :: handle_diagStat ! model diagnostic variables + type(c_ptr), intent(in), value :: handle_fluxStat ! model fluxes + type(c_ptr), intent(in), value :: handle_indxStat ! model indices + type(c_ptr), intent(in), value :: handle_bvarStat ! basin-average variables ! primary data structures (scalars) - type(var_i),intent(inout) :: timeStruct ! model time data - type(var_d),intent(inout) :: forcStruct ! model forcing data - type(var_d),intent(inout) :: attrStruct ! local attributes for each HRU - type(var_i),intent(inout) :: typeStruct ! local classification of soil veg etc. for each HRU + type(c_ptr), intent(in), value :: handle_timeStruct ! model time data + type(c_ptr), intent(in), value :: handle_forcStruct ! model forcing data + type(c_ptr), intent(in), value :: handle_attrStruct ! local attributes for each HRU + type(c_ptr), intent(in), value :: handle_typeStruct ! local classification of soil veg etc. for each HRU ! primary data structures (variable length vectors) - type(var_ilength),intent(inout) :: indxStruct ! model indices - type(var_dlength),intent(inout) :: mparStruct ! model parameters - type(var_dlength),intent(inout) :: progStruct ! model prognostic (state) variables - type(var_dlength),intent(inout) :: diagStruct ! model diagnostic variables - type(var_dlength),intent(inout) :: fluxStruct ! model fluxes + type(c_ptr), intent(in), value :: handle_indxStruct ! model indices + type(c_ptr), intent(in), value :: handle_mparStruct ! model parameters + type(c_ptr), intent(in), value :: handle_progStruct ! model prognostic (state) variables + type(c_ptr), intent(in), value :: handle_diagStruct ! model diagnostic variables + type(c_ptr), intent(in), value :: handle_fluxStruct ! model fluxes ! basin-average structures - type(var_d),intent(inout) :: bparStruct ! basin-average parameters - type(var_dlength),intent(inout) :: bvarStruct ! basin-average variables - ! local HRU data - type(var_i),intent(inout) :: statCounter ! time counter for stats - type(var_i),intent(inout) :: outputTimeStep ! timestep in output files - type(flagVec),intent(inout) :: resetStats ! flags to reset statistics - type(flagVec),intent(inout) :: finalizeStats ! flags to finalize statistics - type(var_i),intent(inout) :: finshTime ! end time for the model simulation - type(var_i),intent(inout) :: oldTime ! - integer(i4b),intent(in) :: outputStep ! index into the outputStructure + type(c_ptr), intent(in), value :: handle_bparStruct ! basin-average parameters + type(c_ptr), intent(in), value :: handle_bvarStruct ! basin-average variables + ! local HRU variables + type(c_ptr), intent(in), value :: handle_statCounter + type(c_ptr), intent(in), value :: handle_outputTimeStep + type(c_ptr), intent(in), value :: handle_resetStats + type(c_ptr), intent(in), value :: handle_finalizeStats + type(c_ptr), intent(in), value :: handle_finshTime ! end time for the model simulation + type(c_ptr), intent(in), value :: handle_oldTime ! time for the previous model time step ! run time variables integer(i4b),intent(out) :: err - character(*),intent(out) :: message - + ! local vairiables for pointers + type(var_dlength),pointer :: forcStat ! model forcing data + type(var_dlength),pointer :: progStat ! model prognostic (state) variables + type(var_dlength),pointer :: diagStat ! model diagnostic variables + type(var_dlength),pointer :: fluxStat ! model fluxes + type(var_dlength),pointer :: indxStat ! model indices + type(var_dlength),pointer :: bvarStat ! basin-average variabl + type(var_i),pointer :: timeStruct ! model time data + type(var_d),pointer :: forcStruct ! model forcing data + type(var_d),pointer :: attrStruct ! local attributes for each HRU + type(var_i),pointer :: typeStruct ! local classification of soil veg etc. for each HRU + type(var_ilength),pointer :: indxStruct ! model indices + type(var_dlength),pointer :: mparStruct ! model parameters + type(var_dlength),pointer :: progStruct ! model prognostic (state) variables + type(var_dlength),pointer :: diagStruct ! model diagnostic variables + type(var_dlength),pointer :: fluxStruct ! model fluxes + type(var_d),pointer :: bparStruct ! basin-average parameters + type(var_dlength),pointer :: bvarStruct ! basin-average variables + type(var_i),pointer :: statCounter ! time counter for stats + type(var_i),pointer :: outputTimeStep ! timestep in output files + type(flagVec),pointer :: resetStats ! flags to reset statistics + type(flagVec),pointer :: finalizeStats ! flags to finalize statistics + type(var_i),pointer :: finshTime ! end time for the model simulation + type(var_i),pointer :: oldTime ! + ! local variables + character(len=256) :: message character(len=256) :: cmessage - logical(lgt) :: defNewOutputFile=.false. integer(i4b) :: iFreq ! index of the output frequency integer(i4b) :: iStruct ! index of model structure logical(lgt) :: printProgress=.false. logical(lgt) :: printRestart=.false. - - - + ! --------------------------------------------------------------------------------------- + ! * Convert From C++ to Fortran + ! --------------------------------------------------------------------------------------- + call c_f_pointer(handle_forcStat, forcStat) + call c_f_pointer(handle_progStat, progStat) + call c_f_pointer(handle_diagStat, diagStat) + call c_f_pointer(handle_fluxStat, fluxStat) + call c_f_pointer(handle_indxStat, indxStat) + call c_f_pointer(handle_bvarStat, bvarStat) + call c_f_pointer(handle_timeStruct, timeStruct) + call c_f_pointer(handle_forcStruct, forcStruct) + call c_f_pointer(handle_attrStruct, attrStruct) + call c_f_pointer(handle_typeStruct, typeStruct) + call c_f_pointer(handle_indxStruct, indxStruct) + call c_f_pointer(handle_mparStruct, mparStruct) + call c_f_pointer(handle_progStruct, progStruct) + call c_f_pointer(handle_diagStruct, diagStruct) + call c_f_pointer(handle_fluxStruct, fluxStruct) + call c_f_pointer(handle_bparStruct, bparStruct) + call c_f_pointer(handle_bvarStruct, bvarStruct) + call c_f_pointer(handle_statCounter, statCounter) + call c_f_pointer(handle_outputTimeStep, outputTimeStep) + call c_f_pointer(handle_resetStats, resetStats) + call c_f_pointer(handle_finalizeStats, finalizeStats) + call c_f_pointer(handle_finshTime, finshTime); + call c_f_pointer(handle_oldTime, oldTime) + + ! Start of Subroutine err=0; message='summa_manageOutputFiles/' ! identify the start of the writing call date_and_time(values=startWrite) diff --git a/build/source/netcdf/writeOutput.f90 b/build/source/netcdf/writeOutput.f90 index 5eb8af2cfb71dae6be6fc0bca01d68bcce36c89b..8c3fbaefccdbf7662d54638d74747984c4c80eb9 100644 --- a/build/source/netcdf/writeOutput.f90 +++ b/build/source/netcdf/writeOutput.f90 @@ -78,6 +78,7 @@ public::writeParm public::writeData public::writeBasin public::writeTime +public::writeDataNew private::writeScalar private::writeVector ! define dimension lengths @@ -148,6 +149,34 @@ subroutine writeParm(ncid,ispatial,struct,meta,err,message) end subroutine writeParm +! Change Name to writeData when done +subroutine writeDataNew(ncid, finalize_stats, output_timestep, max_layers, index_gru, num_gru, meta, & + stat, dat, structName, map, indx, err, message) + + USE data_types,only:var_info ! metadata type + + implicit none + type(var_i), intent(in) :: ncid + logical(lgt), intent(in) :: finalize_stats(:) ! flags to finalize statistics + integer(i4b), intent(inout) :: output_timestep(:) ! number of HRUs in the run domain + integer(i4b), intent(in) :: max_layers + integer(i4b), intent(in) :: index_gru + integer(i4b), intent(in) :: num_gru + type(var_info), intent(in) :: meta(:) ! meta data + class(*), intent(in) :: stat ! stats data + class(*), intent(in) :: dat ! timestep data + character(*), intent(in) :: structName + integer(i4b), intent(in) :: map(:) ! map into stats child struct + type(var_ilength),intent(in) :: indx + integer(i4b) ,intent(out) :: err ! error code + character(*) ,intent(out) :: message ! error message + + err=0;message="writeParm/" + + + +end subroutine writeDataNew + ! ************************************************************************************** ! public subroutine writeData: write model time-dependent data ! ************************************************************************************** @@ -205,7 +234,6 @@ subroutine writeData(ncid,outputTimestep,outputTimestepUpdate,maxLayers,nSteps, ! loop through model variables do iVar = 1,size(meta) - stepCounter = 0 if (meta(iVar)%varName=='time' .and. structName == 'forc')then ! get variable index @@ -224,12 +252,6 @@ subroutine writeData(ncid,outputTimestep,outputTimestepUpdate,maxLayers,nSteps, end do endif - do iStep = 1, nSteps - ! check if we want this timestep - if(.not.outputStructure(1)%finalizeStats(1)%gru(verifiedGRUIndex)%hru(1)%tim(iStep)%dat(iFreq)) cycle - stepCounter = stepCounter+1 - timeVec(stepCounter) = outputStructure(1)%forcStruct(1)%gru(verifiedGRUIndex)%hru(1)%var(iVar)%tim(iStep) - end do ! iStep err = nf90_put_var(ncid%var(iFreq),ncVarID,timeVec(1:stepCounter),start=(/outputTimestep(iFreq)/),count=(/stepCounter/)) call netcdf_err(err,message); if (err/=0)then; print*, "err"; return; endif