From 4c86fec4ba1993eab3b737fe9fe4fdba15c32801 Mon Sep 17 00:00:00 2001 From: Kyle Klenk <kyle.c.klenk@gmail.com> Date: Tue, 26 Mar 2024 20:10:07 +0000 Subject: [PATCH] Can restart HRU from serialized stat --- build/source/global/cppwrap_datatypes.f90 | 347 +++++----------------- 1 file changed, 80 insertions(+), 267 deletions(-) diff --git a/build/source/global/cppwrap_datatypes.f90 b/build/source/global/cppwrap_datatypes.f90 index e673eeb..75e8457 100644 --- a/build/source/global/cppwrap_datatypes.f90 +++ b/build/source/global/cppwrap_datatypes.f90 @@ -1724,9 +1724,65 @@ subroutine get_data_var_dlength_by_indx(handle, struct_indx, dat)& end select end subroutine get_data_var_dlength_by_indx -! TODO: Will need to figure out this index starts at 0 stuff +subroutine set_data_var_dlength_local(metaData, varData_out, num_var, & + varData_in, num_elements, dat_array) + USE var_lookup,only:iLookVarType ! look up structure for variable typed + + type(var_info), intent(in) :: metaData(:) + type(var_dlength), intent(out) :: varData_out + integer(c_int), intent(in) :: num_var + integer(c_int), intent(in) :: varData_in(num_var) + integer(c_int), intent(in) :: num_elements + real(c_double), intent(in) :: dat_array(num_elements) + + integer(c_int) :: iVar,dat_length,j,sum_elem + + if (size(metaData(:)) /= num_var) then + print *, 'ERROR: Number of variables in metaData does not match num_var' + print*, 'Number of variables in metaData:', size(metaData(:)) + print*, 'num_var:', num_var + stop + end if + + if (allocated(varData_out%var)) then + if (size(varData_out%var) /= num_var) then + deallocate(varData_out%var) + allocate(varData_out%var(num_var)) + end if + else + allocate(varData_out%var(num_var)) + end if + + sum_elem = 0 + do iVar=1,num_var + select case(metadata(iVar)%vartype) + case(iLookVarType%ifcSnow, iLookVarType%ifcSoil, iLookVarType%ifcToto) + dat_length = varData_in(iVar) - 1 + allocate(varData_out%var(iVar)%dat(0:dat_length)) + ! set the data + do j=0,dat_length + varData_out%var(iVar)%dat(j) = dat_array(sum_elem + j) + end do + sum_elem = sum_elem + dat_length + 1 + case default + dat_length = varData_in(iVar) + allocate(varData_out%var(iVar)%dat(dat_length)) + ! set the data + do j=1,dat_length + varData_out%var(iVar)%dat(j) = dat_array(sum_elem + j) + end do + sum_elem = sum_elem + dat_length + end select + end do + + +end subroutine + subroutine set_data_var_dlength_by_indx(handle, struct_indx, num_var, var_arr,& num_elements, dat_array) bind(C, name='set_data_var_dlength_by_indx') + USE globalData,only:statForc_meta, statProg_meta, statDiag_meta, & + statFlux_meta, statIndx_meta, statBvar_meta + USE globalData,only:mpar_meta, prog_meta, diag_meta, flux_meta, bvar_meta type(c_ptr), intent(in), value :: handle integer(c_int), intent(in) :: struct_indx @@ -1742,280 +1798,38 @@ subroutine set_data_var_dlength_by_indx(handle, struct_indx, num_var, var_arr,& select case(struct_indx) case(1) ! forcStat - ! create the structure if it doesn't exist - if (allocated(hru_data%forcStat%var)) then - if (size(hru_data%forcStat%var) /= num_var) then - deallocate(hru_data%forcStat%var) - allocate(hru_data%forcStat%var(num_var)) - do i=1,num_var - allocate( hru_data%forcStat%var(i)%dat(var_arr(i)) ) - end do - end if - else - allocate(hru_data%forcStat%var(num_var)) - do i=1,num_var - allocate( hru_data%forcStat%var(i)%dat(var_arr(i)) ) - end do - end if - - ! Set the data - sum_elem = 0 - do i=1,num_var - do j=1,var_arr(i) - hru_data%forcStat%var(i)%dat(j) = dat_array(sum_elem + j) - end do - sum_elem = sum_elem + var_arr(i) - end do + call set_data_var_dlength_local(statForc_meta(:)%var_info, & + hru_data%forcStat, num_var, var_arr, num_elements, dat_array) case(2) ! progStat - ! create the structure if it doesn't exist - if (allocated(hru_data%progStat%var)) then - if (size(hru_data%progStat%var) /= num_var) then - deallocate(hru_data%progStat%var) - allocate(hru_data%progStat%var(num_var)) - do i=1,num_var - allocate( hru_data%progStat%var(i)%dat(var_arr(i)) ) - end do - end if - else - allocate(hru_data%progStat%var(num_var)) - do i=1,num_var - allocate( hru_data%progStat%var(i)%dat(var_arr(i)) ) - end do - end if - - ! Set the data - sum_elem = 0 - do i=1,num_var - do j=1,var_arr(i) - hru_data%progStat%var(i)%dat(j) = dat_array(sum_elem + j) - end do - sum_elem = sum_elem + var_arr(i) - end do + call set_data_var_dlength_local(statProg_meta(:)%var_info, & + hru_data%progStat, num_var, var_arr, num_elements, dat_array) case(3) ! diagStat - ! create the structure if it doesn't exist - if (allocated(hru_data%diagStat%var)) then - if (size(hru_data%diagStat%var) /= num_var) then - deallocate(hru_data%diagStat%var) - allocate(hru_data%diagStat%var(num_var)) - do i=1,num_var - allocate( hru_data%diagStat%var(i)%dat(var_arr(i)) ) - end do - end if - else - allocate(hru_data%diagStat%var(num_var)) - do i=1,num_var - allocate( hru_data%diagStat%var(i)%dat(var_arr(i)) ) - end do - end if - - ! Set the data - sum_elem = 0 - do i=1,num_var - do j=1,var_arr(i) - hru_data%diagStat%var(i)%dat(j) = dat_array(sum_elem + j) - end do - sum_elem = sum_elem + var_arr(i) - end do + call set_data_var_dlength_local(statDiag_meta(:)%var_info, & + hru_data%diagStat, num_var, var_arr, num_elements, dat_array) case(4) ! fluxStat - ! create the structure if it doesn't exist - if (allocated(hru_data%fluxStat%var)) then - if (size(hru_data%fluxStat%var) /= num_var) then - deallocate(hru_data%fluxStat%var) - allocate(hru_data%fluxStat%var(num_var)) - do i=1,num_var - allocate( hru_data%fluxStat%var(i)%dat(var_arr(i)) ) - end do - end if - else - allocate(hru_data%fluxStat%var(num_var)) - do i=1,num_var - allocate( hru_data%fluxStat%var(i)%dat(var_arr(i)) ) - end do - end if - - ! Set the data - sum_elem = 0 - do i=1,num_var - do j=1,var_arr(i) - hru_data%fluxStat%var(i)%dat(j) = dat_array(sum_elem + j) - end do - sum_elem = sum_elem + var_arr(i) - end do + call set_data_var_dlength_local(statFlux_meta(:)%var_info, & + hru_data%fluxStat, num_var, var_arr, num_elements, dat_array) case(5) ! indxStat - ! create the structure if it doesn't exist - if (allocated(hru_data%indxStat%var)) then - if (size(hru_data%indxStat%var) /= num_var) then - deallocate(hru_data%indxStat%var) - allocate(hru_data%indxStat%var(num_var)) - do i=1,num_var - allocate( hru_data%indxStat%var(i)%dat(var_arr(i)) ) - end do - end if - else - allocate(hru_data%indxStat%var(num_var)) - do i=1,num_var - allocate( hru_data%indxStat%var(i)%dat(var_arr(i)) ) - end do - end if - - ! Set the data - sum_elem = 0 - do i=1,num_var - do j=1,var_arr(i) - hru_data%indxStat%var(i)%dat(j) = dat_array(sum_elem + j) - end do - sum_elem = sum_elem + var_arr(i) - end do + call set_data_var_dlength_local(statIndx_meta(:)%var_info, & + hru_data%indxStat, num_var, var_arr, num_elements, dat_array) case(6) ! bvarStat - ! create the structure if it doesn't exist - if (allocated(hru_data%bvarStat%var)) then - if (size(hru_data%bvarStat%var) /= num_var) then - deallocate(hru_data%bvarStat%var) - allocate(hru_data%bvarStat%var(num_var)) - do i=1,num_var - allocate( hru_data%bvarStat%var(i)%dat(var_arr(i)) ) - end do - end if - else - allocate(hru_data%bvarStat%var(num_var)) - do i=1,num_var - allocate( hru_data%bvarStat%var(i)%dat(var_arr(i)) ) - end do - end if - - ! Set the data - sum_elem = 0 - do i=1,num_var - do j=1,var_arr(i) - hru_data%bvarStat%var(i)%dat(j) = dat_array(sum_elem + j) - end do - sum_elem = sum_elem + var_arr(i) - end do + call set_data_var_dlength_local(statBvar_meta(:)%var_info, & + hru_data%bvarStat, num_var, var_arr, num_elements, dat_array) case(7) ! mparStruct - ! create the structure if it doesn't exist - if (allocated(hru_data%mparStruct%var)) then - if (size(hru_data%mparStruct%var) /= num_var) then - deallocate(hru_data%mparStruct%var) - allocate(hru_data%mparStruct%var(num_var)) - do i=1,num_var - allocate( hru_data%mparStruct%var(i)%dat(var_arr(i)) ) - end do - end if - else - allocate(hru_data%mparStruct%var(num_var)) - do i=1,num_var - allocate( hru_data%mparStruct%var(i)%dat(var_arr(i)) ) - end do - end if - - ! Set the data - sum_elem = 0 - do i=1,num_var - do j=1,var_arr(i) - hru_data%mparStruct%var(i)%dat(j) = dat_array(sum_elem + j) - end do - sum_elem = sum_elem + var_arr(i) - end do + call set_data_var_dlength_local(mpar_meta(:),hru_data%mparStruct, & + num_var, var_arr, num_elements, dat_array) case(8) ! progStruct - ! create the structure if it doesn't exist - if (allocated(hru_data%progStruct%var)) then - if (size(hru_data%progStruct%var) /= num_var) then - deallocate(hru_data%progStruct%var) - allocate(hru_data%progStruct%var(num_var)) - do i=1,num_var - allocate( hru_data%progStruct%var(i)%dat(var_arr(i)) ) - end do - end if - else - allocate(hru_data%progStruct%var(num_var)) - do i=1,num_var - allocate( hru_data%progStruct%var(i)%dat(var_arr(i)) ) - end do - end if - - ! Set the data - sum_elem = 0 - do i=1,num_var - do j=1,var_arr(i) - hru_data%progStruct%var(i)%dat(j) = dat_array(sum_elem + j) - end do - sum_elem = sum_elem + var_arr(i) - end do + call set_data_var_dlength_local(prog_meta(:), hru_data%progStruct, & + num_var, var_arr, num_elements, dat_array) case(9) ! diagStruct - ! create the structure if it doesn't exist - if (allocated(hru_data%diagStruct%var)) then - if (size(hru_data%diagStruct%var) /= num_var) then - deallocate(hru_data%diagStruct%var) - allocate(hru_data%diagStruct%var(num_var)) - do i=1,num_var - allocate( hru_data%diagStruct%var(i)%dat(var_arr(i)) ) - end do - end if - else - allocate(hru_data%diagStruct%var(num_var)) - do i=1,num_var - allocate( hru_data%diagStruct%var(i)%dat(var_arr(i)) ) - end do - end if - - ! Set the data - sum_elem = 0 - do i=1,num_var - do j=1,var_arr(i) - hru_data%diagStruct%var(i)%dat(j) = dat_array(sum_elem + j) - end do - sum_elem = sum_elem + var_arr(i) - end do + call set_data_var_dlength_local(diag_meta(:), hru_data%diagStruct, & + num_var, var_arr, num_elements, dat_array) case(10) ! fluxStruct - ! create the structure if it doesn't exist - if (allocated(hru_data%fluxStruct%var)) then - if (size(hru_data%fluxStruct%var) /= num_var) then - deallocate(hru_data%fluxStruct%var) - allocate(hru_data%fluxStruct%var(num_var)) - do i=1,num_var - allocate( hru_data%fluxStruct%var(i)%dat(var_arr(i)) ) - end do - end if - else - allocate(hru_data%fluxStruct%var(num_var)) - do i=1,num_var - allocate( hru_data%fluxStruct%var(i)%dat(var_arr(i)) ) - end do - end if - - ! Set the data - sum_elem = 0 - do i=1,num_var - do j=1,var_arr(i) - hru_data%fluxStruct%var(i)%dat(j) = dat_array(sum_elem + j) - end do - sum_elem = sum_elem + var_arr(i) - end do + call set_data_var_dlength_local(flux_meta, hru_data%fluxStruct, num_var,& + var_arr, num_elements, dat_array) case(11) ! bvarStruct - ! create the structure if it doesn't exist - if (allocated(hru_data%bvarStruct%var)) then - if (size(hru_data%bvarStruct%var) /= num_var) then - deallocate(hru_data%bvarStruct%var) - allocate(hru_data%bvarStruct%var(num_var)) - do i=1,num_var - allocate( hru_data%bvarStruct%var(i)%dat(var_arr(i)) ) - end do - end if - else - allocate(hru_data%bvarStruct%var(num_var)) - do i=1,num_var - allocate( hru_data%bvarStruct%var(i)%dat(var_arr(i)) ) - end do - end if - - ! Set the data - sum_elem = 0 - do i=1,num_var - do j=1,var_arr(i) - hru_data%bvarStruct%var(i)%dat(j) = dat_array(sum_elem + j) - end do - sum_elem = sum_elem + var_arr(i) - end do + call set_data_var_dlength_local(bvar_meta(:), hru_data%bvarStruct, & + num_var, var_arr, num_elements, dat_array) end select end subroutine set_data_var_dlength_by_indx @@ -2042,7 +1856,6 @@ subroutine get_size_var_ilength_by_indx(handle, struct_indx, size_var) & end select end subroutine get_size_var_ilength_by_indx - subroutine get_size_data_var_ilength_by_indx(handle, struct_indx, size_var, & dat_size) bind(C, name='get_size_data_var_ilength_by_indx') @@ -2647,7 +2460,7 @@ subroutine set_data_flagVec_by_indx(handle, struct_indx, num_var, summa_struct)& call c_f_pointer(handle, hru_data) - select case(1) + select case(struct_indx) case(1) ! resetStats ! create the structure if it doesn't exist if (allocated(hru_data%resetStats%dat)) then -- GitLab