Я пишу код в Fortran 2003, который делает много линейной алгебры с разреженными матрицами. Я пытаюсь использовать некоторые из более абстрактных функций нового стандарта, поэтому у меня есть более простые программы без слишком много повторяющегося кода.Политизм во время выполнения в fortran 2003
У меня есть процедура solver
, которая принимает в матрице, некоторые векторы, допуск для используемого итерационного метода и т. Д. Я передаю ему указатель на процедуру, называемую matvec
; matvec
- это подпрограмма, которую мы используем для умножения матричных векторов.
Проблема в том, что иногда matvec
- это процедура, которая принимает дополнительные аргументы colorlist, color1, color2
над обычными, отправленными на эту процедуру. Я могу думать о нескольких способах борьбы с этим.
Первая идея: определить два разных абстрактных интерфейса matvec1
, matvec2
и два разных решателя. Это работает, но это означает дублирование некоторого кода, чего я пытаюсь избежать.
Еще одна идея: сохранить тот же абстрактный интерфейс matvec
, и сделать дополнительные аргументы , color1
, color2
необязательными. Это означает, что они становятся необязательными в каждой процедуре matvec - даже для тех, для которых они не являются необязательными, и для процедур, где они даже не используются вообще. Довольно уверен, что я пойду в ад, если я это сделаю.
Я могу думать о множестве других менее оптимальных решений. Я бы хотел внести свой вклад в это - я уверен, что есть какой-то элегантный способ сделать это, я просто не уверен, что это такое.