This first code portion is executed every time a frequency has been fully migrated. The frequency number currently being processed iw are looped through. A variable named ifreq_doneX, where `X' is the frequency number is created. Then that frequency is set to to 1 by the sep3d_set_sect_param. In this case the image sep file (the sep3d structure rsep) is potentially a distributed dataset along an aritificial axis corresponding to the number of processes that are computing the image. The sep3d_set_sect_param call will automatically write this parameter to its local portion of the image.
do i=1,size(i_w) par="ifreq_done" call parcat(par,i_w(i)) if(adj) then if(.not. sep3d_set_sect_param(rsep,par,1)) then write(0,*) "trouble writing sect_params" return end if
The second example is from the portion of the code that checks for a restart request. Here, all of the threads are looped over. For each frequency, we check all of the sections of the image tag to see if any of the threads have processed this frequency.
do ifreq=1,wsep%n(6) !loop over frequencies par="ifreq_done" call parcat(par,ifreq) iw=-1; if(.not. sep3d_grab_sect_param(sep,par,iw)) then write(0,*) "trouble grabbing section parameters" return end if if(any(iw==1)) thenOftentimes we need to make a decision whether to proceed based on whether we own a specific element of the axis we spread along. This code fragment is marking whether or not it owns a given frequency.
do i=1,wsep%n(6) iw_own(i)=sep3d_own(dsep,i) end doIn the case of migration, we need to combine all the local images into a global image. This code fragment adds all of the local data (bigc) from the distributed image (big_sep), into the standard SEP dataset (small_sep) buffer bigc2.
if(.not. sep3d_compress_data(big_sep,small_sep,bigc,bigc2)) then write(0,*) "trouble combining data ", fwind return end if