diff --git a/src/framework/mpas_stream_manager.F b/src/framework/mpas_stream_manager.F index 609663ed58..6c4adfeeb4 100644 --- a/src/framework/mpas_stream_manager.F +++ b/src/framework/mpas_stream_manager.F @@ -563,10 +563,96 @@ subroutine MPAS_stream_mgr_validate_streams(manager, streamID, ierr)!{{{ #endif end do + + ! Only check filename_template uniqueness when validating all streams + if (.not. present(streamID)) then + call MPAS_stream_mgr_check_filename_template(manager, ierr=err_local) + if (present(ierr)) ierr = err_local + end if end subroutine MPAS_stream_mgr_validate_streams!}}} + !----------------------------------------------------------------------- + ! routine MPAS_stream_mgr_check_filename_template + ! + !> \brief Check for identical filename templates in active output streams. + !> \author Abishek Gopal + !> \date June 3 2026 + !> \details + !> Checks that there are no identical filename templates among active output + !> streams in the stream manager, which may lead to file conflicts. This + !> routine can be called from within MPAS_stream_mgr_validate_streams or + !> separately as needed. + ! + !----------------------------------------------------------------------- + subroutine MPAS_stream_mgr_check_filename_template(manager, ierr)!{{{ + + implicit none + + type (MPAS_streamManager_type), intent(inout) :: manager + integer, intent(out), optional :: ierr + + integer :: threadNum + character (len=StrKIND) :: message, streamID + type (MPAS_stream_list_type), pointer :: stream1_cursor, stream2_cursor + logical :: stream1_pkg_active, stream2_pkg_active + logical :: stream1_output, stream2_output + + STREAM_DEBUG_WRITE('-- Called MPAS_stream_mgr_check_filename_template() for all streams') + + if (present(ierr)) ierr = MPAS_STREAM_MGR_NOERR + + threadNum = mpas_threading_get_thread_num() + + if ( threadNum == 0 ) then + + streamID = '.*' ! query all streams + + nullify(stream1_cursor) + do while (MPAS_stream_list_query(manager % streams, streamID, stream1_cursor)) + + stream1_pkg_active = stream_active_pkg_check(stream1_cursor) + stream1_output = (stream1_cursor % direction == MPAS_STREAM_OUTPUT) .or. & + (stream1_cursor % direction == MPAS_STREAM_INPUT_OUTPUT) + + if (.not. stream1_cursor % active_stream .or. .not. stream1_output .or. .not. stream1_pkg_active) then + cycle + end if + + nullify(stream2_cursor) + do while (MPAS_stream_list_query(manager % streams, streamID, stream2_cursor)) + + stream2_pkg_active = stream_active_pkg_check(stream2_cursor) + stream2_output = (stream2_cursor % direction == MPAS_STREAM_OUTPUT) .or. & + (stream2_cursor % direction == MPAS_STREAM_INPUT_OUTPUT) + + ! uniqueness_check has already checked that two different streams do not have the same name + if (trim(stream1_cursor % name) == trim(stream2_cursor % name) & + .or. .not. stream2_cursor % active_stream & + .or. .not. stream2_output & + .or. .not. stream2_pkg_active) then + cycle + end if + + if (trim(stream1_cursor % filename_template) == trim(stream2_cursor % filename_template)) then + message = 'Found identical values of the filename_template attribute for multiple active output streams, ' & + // trim(stream1_cursor % name) // ' and ' // trim(stream2_cursor % name) // & + ', in streams.. This may result in file conflicts.' + call mpas_log_write(message, messageType=MPAS_LOG_ERR) + if (present(ierr)) ierr = MPAS_STREAM_MGR_ERROR + return + end if + + end do + + end do + + end if + + end subroutine MPAS_stream_mgr_check_filename_template!}}} + + !----------------------------------------------------------------------- ! routine MPAS_stream_mgr_destroy_stream ! diff --git a/src/framework/xml_stream_parser.c b/src/framework/xml_stream_parser.c index 470cc0fe63..87c0cb8037 100644 --- a/src/framework/xml_stream_parser.c +++ b/src/framework/xml_stream_parser.c @@ -486,13 +486,6 @@ int uniqueness_check(ezxml_t stream1, ezxml_t stream2) fmt_err(msgbuf); return 1; } - if (strstr(type, "output") != NULL || strstr(type2, "output") != NULL){ - if (strcmp(filename, filename2) == 0) { - snprintf(msgbuf, MSGSIZE, "Output streams \"%s\" and \"%s\" cannot share the filename_template \"%s\".", name, name2, filename); - fmt_err(msgbuf); - return 1; - } - } } return 0;