! Read metric, lapse, shift and conformal factor from files. ! $Header$ #include "cctk.h" #include "cctk_Parameters.h" #include "cctk_Arguments.h" !This routine reads in the metric (from ADMBase). subroutine EHFinder_Read_Metric(CCTK_ARGUMENTS) use EHFinder_mod implicit none DECLARE_CCTK_PARAMETERS DECLARE_CCTK_ARGUMENTS DECLARE_CCTK_FUNCTIONS character(len=512) :: in_files, in_vars character(len=64), dimension(6) :: var_names character(len=10) :: iteration_string CCTK_INT :: i, nc, ntot, res ! Figure out which iteration number to read, based on the parameters ! last_iteration_number (the last iteration in the numerical evolution ! producing the metric) and saved_iteration_every (how often was the metric ! saved) and the current iteration and save it in a string variable. write(iteration_string,'(i10)') last_iteration_number - & saved_iteration_every * cctk_iteration ! Trim the string variable. iteration_string = adjustl(iteration_string) nc = len_trim(iteration_string) ! Generate a string with the filenames. Note at present the requirement ! therefore is that all iterations of one variable is written in the ! same file. in_files = 'gxx gxy gxz gyy gyz gzz' ! Fill in the string array, used to requesting the metric components at ! the specified iteration number. var_names(1) = 'admbase::gxx[cctk_iteration='//iteration_string(1:nc)//']' var_names(2) = 'admbase::gxy[cctk_iteration='//iteration_string(1:nc)//']' var_names(3) = 'admbase::gxz[cctk_iteration='//iteration_string(1:nc)//']' var_names(4) = 'admbase::gyy[cctk_iteration='//iteration_string(1:nc)//']' var_names(5) = 'admbase::gyz[cctk_iteration='//iteration_string(1:nc)//']' var_names(6) = 'admbase::gzz[cctk_iteration='//iteration_string(1:nc)//']' ! merge all the variable names into a single string. in_vars = ' ' ntot = 0 do i = 1, 6 nc = len_trim(var_names(i)) in_vars(ntot+1:ntot+1+nc+1) = var_names(i)(1:nc+1) ntot = ntot + nc + 1 end do ! Call the routine that actualle does the file access. Note failures are ! just silently ignored. call IOUtil_RecoverVarsFromDatafiles ( res, cctkGH, in_files, in_vars ) end subroutine EHFinder_Read_Metric ! This routine reads in the lapse (from ADMBase). subroutine EHFinder_Read_Lapse(CCTK_ARGUMENTS) use EHFinder_mod implicit none DECLARE_CCTK_PARAMETERS DECLARE_CCTK_ARGUMENTS DECLARE_CCTK_FUNCTIONS character(len=128) :: in_files, in_vars character(len=10) :: iteration_string CCTK_INT :: nc, res ! Figure out which iteration number to read, based on the parameters ! last_iteration_number (the last iteration in the numerical evolution ! producing the metric) and saved_iteration_every (how often was the lapse ! saved) and the current iteration and save it in a string variable. write(iteration_string,'(i10)') last_iteration_number - & saved_iteration_every * cctk_iteration ! Trim the string variable. iteration_string = adjustl(iteration_string) nc = len_trim(iteration_string) ! Generate a string with the filename. Note at present the requirement ! therefore is that all iterations of one variable is written in the ! same file. in_files = 'alp' ! Fill in the string used to requesting the lapse at the specified ! iteration number. in_vars = 'admbase::alp[cctk_iteration='//iteration_string(1:nc)//']' ! Call the routine that actualle does the file access. Note failures are ! just silently ignored. call IOUtil_RecoverVarsFromDatafiles ( res, cctkGH, in_files, in_vars ) end subroutine EHFinder_Read_Lapse ! This routine reads in all the shift components (from ADMBAse). subroutine EHFinder_Read_Shift(CCTK_ARGUMENTS) use EHFinder_mod implicit none DECLARE_CCTK_PARAMETERS DECLARE_CCTK_ARGUMENTS DECLARE_CCTK_FUNCTIONS character(len=256) :: in_files, in_vars character(len=64), dimension(3) :: var_names character(len=10) :: iteration_string CCTK_INT :: i, nc, ntot, res ! Figure out which iteration number to read, based on the parameters ! last_iteration_number (the last iteration in the numerical evolution ! producing the metric) and saved_iteration_every (how often was the metric ! saved) and the current iteration and save it in a string variable. write(iteration_string,'(i10)') last_iteration_number - & saved_iteration_every * cctk_iteration ! Trim the string variable. iteration_string = adjustl(iteration_string) nc = len_trim(iteration_string) ! Generate a string with the filenames. Note at present the requirement ! therefore is that all iterations of one variable is written in the ! same file. in_files = 'betax betay betaz' ! Fill in the string array, used to requesting the shift components at ! the specified iteration number. var_names(1) = 'admbase::betax[cctk_iteration='//iteration_string(1:nc)//']' var_names(2) = 'admbase::betay[cctk_iteration='//iteration_string(1:nc)//']' var_names(3) = 'admbase::betaz[cctk_iteration='//iteration_string(1:nc)//']' ! merge all the variable names into a single string. in_vars = ' ' ntot = 0 do i = 1, 3 nc = len_trim(var_names(i)) in_vars(ntot+1:ntot+1+nc+1) = var_names(i)(1:nc+1) ntot = ntot + nc + 1 end do ! Call the routine that actualle does the file access. Note failures are ! just silently ignored. call IOUtil_RecoverVarsFromDatafiles ( res, cctkGH, in_files, in_vars ) end subroutine EHFinder_Read_Shift ! This routine reads in the conformal factor (from StaticConformal). subroutine EHFinder_Read_Conformal(CCTK_ARGUMENTS) use EHFinder_mod implicit none DECLARE_CCTK_PARAMETERS DECLARE_CCTK_ARGUMENTS DECLARE_CCTK_FUNCTIONS character(len=128) :: in_files, in_vars character(len=10) :: iteration_string CCTK_INT :: nc, res ! Figure out which iteration number to read, based on the parameters ! last_iteration_number (the last iteration in the numerical evolution ! producing the metric) and saved_iteration_every (how often was the metric ! saved) and the current iteration and save it in a string variable. Note ! that for this variable the default option is to only to read it in once at ! the first timestep. if ( read_conformal_factor_once .gt. 0 ) then write(iteration_string,'(i10)') 0 else write(iteration_string,'(i10)') last_iteration_number - & saved_iteration_every * cctk_iteration end if ! Trim the string variable. iteration_string = adjustl(iteration_string) nc = len_trim(iteration_string) ! Generate a string with the filenames. Note at present the requirement ! therefore is that all iterations of one variable is written in the ! same file. in_files = 'psi' ! Fill in the string array, used to requesting the conformal factor at ! the specified iteration number. in_vars = 'staticconformal::psi[cctk_iteration='//iteration_string(1:nc)//']' ! Call the routine that actualle does the file access. Note failures are ! just silently ignored. call IOUtil_RecoverVarsFromDatafiles ( res, cctkGH, in_files, in_vars ) end subroutine EHFinder_Read_Conformal ! This routine reads in the excision mask (from SpaceMask). subroutine EHFinder_Read_Mask(CCTK_ARGUMENTS) use EHFinder_mod implicit none DECLARE_CCTK_PARAMETERS DECLARE_CCTK_ARGUMENTS DECLARE_CCTK_FUNCTIONS character(len=128) :: in_files, in_vars character(len=10) :: iteration_string CCTK_INT :: nc, res ! Figure out which iteration number to read, based on the parameters ! last_iteration_number (the last iteration in the numerical evolution ! producing the metric) and saved_iteration_every (how often was the metric ! saved) and the current iteration and save it in a string variable. write(iteration_string,'(i10)') last_iteration_number - & saved_iteration_every * cctk_iteration ! Trim the string variable. iteration_string = adjustl(iteration_string) nc = len_trim(iteration_string) ! Generate a string with the filename. Note at present the requirement ! therefore is that all iterations of one variable is written in the ! same file. in_files = 'emask' ! Fill in the string array, used to requesting the old style mask at ! the specified iteration number. in_vars = 'spacemask::emask[cctk_iteration='//iteration_string(1:nc)//']' ! Call the routine that actualle does the file access. Note failures are ! just silently ignored. call IOUtil_RecoverVarsFromDatafiles ( res, cctkGH, in_files, in_vars ) end subroutine EHFinder_Read_Mask