Я пытаюсь написать программу для решения проблемы диаметра трубы для насосной системы, которую я разработал. Я сделал это на бумаге и понял механику уравнений. Буду признателен за любые рекомендации.Решение осевого метода для диаметра трубы
EDIT: Я обновил код с некоторыми предложениями от пользователей, все еще наблюдая быстрое расхождение. Догадки там слишком высокие. Если я это выясню, я обновлю его на работу.
MODULE Sec
CONTAINS
SUBROUTINE Secant(fx,xold,xnew,xolder)
IMPLICIT NONE
INTEGER,PARAMETER::DP=selected_real_kind(15)
REAL(DP), PARAMETER:: gamma=62.4
REAL(DP)::z,phead,hf,L,Q,mu,rho,rough,eff,pump,nu,ppow,fric,pres,xnew,xold,xolder,D
INTEGER::I,maxit
INTERFACE
omitted
END INTERFACE
Q=0.0353196
Pres=-3600.0
z=-10.0
L=50.0
mu=0.0000273
rho=1.940
nu=0.5
rough=0.000005
ppow=412.50
xold=1.0
xolder=0.90
D=11.0
phead = (pres/gamma)
pump = (nu*ppow)/(gamma*Q)
hf = phead + z + pump
maxit=10
I = 1
DO
xnew=xold-((fx(xold,L,Q,hf,rho,mu,rough)*(xold-xolder))/ &
(fx(xold,L,Q,hf,rho,mu,rough)-fx(xolder,L,Q,hf,rho,mu,rough)))
xolder = xold
xold = xnew
I=I+1
WRITE(*,*) "Diameter = ", xnew
IF (ABS(fx(xnew,L,Q,hf,rho,mu,rough)) <= 1.0d-10) THEN
EXIT
END IF
IF (I >= maxit) THEN
EXIT
END IF
END DO
RETURN
END SUBROUTINE Secant
END MODULE Sec
PROGRAM Pipes
USE Sec
IMPLICIT NONE
INTEGER,PARAMETER::DP=selected_real_kind(15)
REAL(DP)::xold,xolder,xnew
INTERFACE
omitted
END INTERFACE
CALL Secant(f,xold,xnew,xolder)
END PROGRAM Pipes
FUNCTION f(D,L,Q,hf,rho,mu,rough)
IMPLICIT NONE
INTEGER,PARAMETER::DP=selected_real_kind(15)
REAL(DP), PARAMETER::pi=3.14159265d0, g=9.81d0
REAL(DP), INTENT(IN)::L,Q,rough,rho,mu,hf,D
REAL(DP)::f, fric, reynold, coef
fric=(hf/((L/D)*(((4.0*Q)/(pi*D**2))/2*g)))
reynold=((rho*(4.0*Q/pi*D**2)*D)/mu)
coef=(rough/(3.7d0*D))
f=(1/SQRT(fric))+2.0d0*log10(coef+(2.51d0/(reynold*SQRT(fric))))
END FUNCTION
благодарю вас за то, что вы нашли время, чтобы помочь мне. Первоначально я решил эту проблему в excel с помощью решателя и получил 0,799 дюйма, что было разумно для размера этой системы (по словам моего наставника). Что касается решения, я пробовал очистить круглые скобки и получил одинаковые ответы. Единицы также были проверены несколько раз, и я уверен, что они правы. Я переписал функцию, используя мой эмпирический вывод, который взял все факторы помимо D из функции и получил то же самое. Я не хотел жестко прокладывать программу и ограничивать ее полезность. – Jake
@ Jake Хм, я вижу ... и если вы можете вычислить ответ Excel, согласен ли он с решением Fortran выше (например, после некоторого преобразования единицы и т. Д.)? По крайней мере, сам секционирующий код работает правильно. [Также, «предварительно вычисляя постоянные факторы», я имею в виду использование некоторых временных переменных для хранения постоянных факторов в целом, например. 'coeffA = hf/(L * 4 * Q/pi)', чтобы было легко увидеть структуру выражения (не жестко кодируя литературные числа). Это также полезно для читателя этого сайта, потому что для «декодирования» программы требуется время ... – roygvib
Да, на excel ответ сообщается в футах, поэтому число умножается на 12, чтобы добраться до дюймов, что заканчивается тем, что ~ 0,799. Я думал о том, чтобы делать коэффициенты, но думал, что не могу, потому что это испортит функцию, но сейчас я работаю над этим. Я также понял, что забыл несколько терминов из уравнения colebrook, которое объясняло бы многое, что я сейчас работаю с f = (1/SQRT (hf/((L/D) * (((4.0 * Q)/(pi * D ** 2))/2 * g)))) & + 2.0 * log10 ((грубая/(3.7 * D)) + и ((2.51/((rho * (4.0 * Q/pi * D ** 2) * D/mu) & \t * SQRT (hf/((L/D) * (((4.0 * Q)/(pi * D ** 2))/2 * g))))))) Но я собираюсь упростить его. Спасибо за вашу помощь – Jake