Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.149.251.155] |
|
Сообщ.
#1
,
|
|
|
Появилась необходимость перегнать старую прогу написанную на фортране-4 на Delphi
Почти всю программу перевел осталась пару мест в которых не могу разобратся , прошу помочь (хоть чемто: советом в какой книге(на каком сайте) про это можно почитать ) собственно вот эти части кода Type 4,B,B 4 format(2f10.4) Type 3,ul2,am2,psi,d2k 3 format (13) заранее спасибо |
Сообщ.
#2
,
|
|
|
Цитата RealZ @ читай про определение производных типов в фортране. про это можно почитать |
Сообщ.
#3
,
|
|
|
Насколько я помню, производные типы определяются в декларативной части программы, а здесь подразумевается исполняемая.
оператор type (не разу им не пользовался) по применению похож на операторы write и print (или read?) format указывает формат вывода переменных оператором write, print, read... возможно, и type. 2f10.4 означает, что нужно вывести два действительных числа по 10 знаков каждое, причем 4 из них после запятой. Формата l я не знаю. Может, logical, но вероятно должен содержать 3 символа. |
Сообщ.
#4
,
|
|
|
RealZ, если можно, кинь сюда весь исполняемый блок (функция, процедура, ...) с "Type 4,B,B 4 format(2f10.4)" и "Type 3,ul2,am2,psi,d2k 3 format (13)". Тогда можно будет сказать предметнее. Но Type точно используется для определения производных типов данных.
|
Сообщ.
#5
,
|
|
|
вот вся подпрограмма где находятся эти операторы (для удобства выделил type и format )
Подпрограмма выделенное Subroutine STG (AL1,B2,E,G,TN,PO,TO,RT,CP,D1K,RK,BB1,BB2,FDU,DEL,TM,POI,TOI,HO,UL1,UL2,RC,ROI,PN,C2,AL2,DL,DLL) PI=3.141593 POL1=1. FI=0.96 PSI=0.940 AM1=0.97 AM2=0.950 RC=RK 2 UKCF=FI*COS(AL1)/(2.*SQRT(1.-RK)) CF=PI*D1K*TN/UKCF HO=CF**2/2 T1T=TO-1(1.-RC)*HO/CP TYPE 3,PO,TO,TM,RT 3 FORMAT (4F14.4) CALL GAS(PO,TO,TM,RT,T1T,P1,V1T) TYPE 3,P1,V1T,RC,G A=G*V1T/(AM1*CF*PI*SIN(AL1)*SQRT(1.-RC)) TYPE 3,A,D1K,AL1,AL1 UL1=(-D1K+SQRT(D1K**2+4.*A))/2 RCR=1.-(1.-RK)*(((D1K+UL1)/D1K)**(-1.8)) TYPE 4,UL1,RCR 4 FORMAT (2F10.4) FI=0.980-0.009*BB1/UL1 AM1=0.982-0.005*BB1/UL1 RR=RCR-RC RC=RCR TYPE 4,RR,RK IF (ABS(RR)-0.0005) 1,1,2 CONTINUE F1=PI*(D1K+UL1)*UL1*SIN(AL1) C1=FI*CF*SQRT(1.-RC) U1=PI*(D1K+UL1)*TN TYPE 3,F1,C1,U1,AL1 CALL TRK(C1,U1,AL1,C1U,W1,B1) TYPE 3,C1U,W1,B1,B1 W2T=SQRT(W1**2+RC*CF**2) T2T=TO-HO/CP TYPE 4,W2T,T2T CALL GAS (PO,TO,TM,RT,T2T,P2,V2T) TYPE 4,P2,V2T B=G*V2T/(AM2*PI*PSI*SIN(B2)*W2T) TYPE 4,B,B D2K=D1K-0.001 UL2=(-D2K+SQRT(D2K**2+4.*B))/2. AM2=0.965-0.015*BB2/UL2 PSI=0.957-0.011*BB2/UL2 TYPE 3,UL2,AM2,PSI,D2K W2=PSI*W2T U2=PI*(D2K+UL2)*TN CALL TRK (W2,U2,B2,W2U,C2,AL2) TYPE 3,W2,U2,B2,W2U TYPE 4,C2,AL2 POL=U2*(C1U+W2U-U2)/HO TYPE 3,POL,POL1 PP=POL1-POL POL1=POL TYPE 4,PP,PP IF (ABS(PP)-0.001) 5,5,1 5 U2CF=UKCF*(D2K+UL2)/D2K ATP=0.0007*(D2K+UL2)*(U2CF**3)/(PI*UL2*SIN(B2)) ADU=FDU*POL/(AM1*F1) RP=1.-(1.-RK)*((1.+2*UL2/D2K)**(-1.8)) TYPE 3,U2CF,ATP,ADU,RP APU=PI*(D2K+2.*UL2)*DEL*POL*SQRT(RP/(1.-RC))/(AM1*F1) TYPE 4,APU,PP PAUSE ROI=POL-ATP-ADU-APU PN=G*HO*ROI/1000. TOJ=TO-HO*ROI/CP TOOJ=TOJ+(C2**2)/(2.*CP) CALL GAS (P2,TOJ,TM,RT,TOOJ,POOJ,V) POI=POOJ TOI=TOOJ DL=UL2-UL1 DLL=(D2K+UL2)/UL2 RETURN END Просто код Subroutine STG (AL1,B2,E,G,TN,PO,TO,RT,CP,D1K,RK,BB1,BB2,FDU,DEL,TM,POI,TOI,HO,UL1,UL2,RC,ROI,PN,C2,AL2,DL,DLL) PI=3.141593 POL1=1. FI=0.96 PSI=0.940 AM1=0.97 AM2=0.950 RC=RK 2 UKCF=FI*COS(AL1)/(2.*SQRT(1.-RK)) CF=PI*D1K*TN/UKCF HO=CF**2/2 T1T=TO-1(1.-RC)*HO/CP TYPE 3,PO,TO,TM,RT 3 FORMAT (4F14.4) CALL GAS(PO,TO,TM,RT,T1T,P1,V1T) TYPE 3,P1,V1T,RC,G A=G*V1T/(AM1*CF*PI*SIN(AL1)*SQRT(1.-RC)) TYPE 3,A,D1K,AL1,AL1 UL1=(-D1K+SQRT(D1K**2+4.*A))/2 RCR=1.-(1.-RK)*(((D1K+UL1)/D1K)**(-1.8)) TYPE 4,UL1,RCR 4 FORMAT (2F10.4) FI=0.980-0.009*BB1/UL1 AM1=0.982-0.005*BB1/UL1 RR=RCR-RC RC=RCR TYPE 4,RR,RK IF (ABS(RR)-0.0005) 1,1,2 CONTINUE F1=PI*(D1K+UL1)*UL1*SIN(AL1) C1=FI*CF*SQRT(1.-RC) U1=PI*(D1K+UL1)*TN TYPE 3,F1,C1,U1,AL1 CALL TRK(C1,U1,AL1,C1U,W1,B1) TYPE 3,C1U,W1,B1,B1 W2T=SQRT(W1**2+RC*CF**2) T2T=TO-HO/CP TYPE 4,W2T,T2T CALL GAS (PO,TO,TM,RT,T2T,P2,V2T) TYPE 4,P2,V2T B=G*V2T/(AM2*PI*PSI*SIN(B2)*W2T) TYPE 4,B,B D2K=D1K-0.001 UL2=(-D2K+SQRT(D2K**2+4.*B))/2. AM2=0.965-0.015*BB2/UL2 PSI=0.957-0.011*BB2/UL2 TYPE 3,UL2,AM2,PSI,D2K W2=PSI*W2T U2=PI*(D2K+UL2)*TN CALL TRK (W2,U2,B2,W2U,C2,AL2) TYPE 3,W2,U2,B2,W2U TYPE 4,C2,AL2 POL=U2*(C1U+W2U-U2)/HO TYPE 3,POL,POL1 PP=POL1-POL POL1=POL TYPE 4,PP,PP IF (ABS(PP)-0.001) 5,5,1 5 U2CF=UKCF*(D2K+UL2)/D2K ATP=0.0007*(D2K+UL2)*(U2CF**3)/(PI*UL2*SIN(B2)) ADU=FDU*POL/(AM1*F1) RP=1.-(1.-RK)*((1.+2*UL2/D2K)**(-1.8)) TYPE 3,U2CF,ATP,ADU,RP APU=PI*(D2K+2.*UL2)*DEL*POL*SQRT(RP/(1.-RC))/(AM1*F1) TYPE 4,APU,PP PAUSE ROI=POL-ATP-ADU-APU PN=G*HO*ROI/1000. TOJ=TO-HO*ROI/CP TOOJ=TOJ+(C2**2)/(2.*CP) CALL GAS (P2,TOJ,TM,RT,TOOJ,POOJ,V) POI=POOJ TOI=TOOJ DL=UL2-UL1 DLL=(D2K+UL2)/UL2 RETURN END получается ,что format задает формат данных в котором type выведет данные ? я правельно понимаю ? |
Сообщ.
#6
,
|
|
|
FORMAT - это оператор задания формата вывода. TYPE (в данном случае): собственно вывод, в котором первый параметр - метка оператора FORMAT, который требуется использовать для вывода.
P.S. Если не ошибаюсь, такой "диалект" (с TYPE) существовал на VAX'овской реализации Фортрана, формально стандарту языка это противоречит. |
Сообщ.
#7
,
|
|
|
Цитата RealZ @ даformat задает формат данных Получается, что в том фортране, на котором была написана твоя программа, type используется для вывода данных, по аналогии с print. Чесно говоря, с таким использованием оператора первый раз встречаюсь. Век живи ... |
Сообщ.
#8
,
|
|
|
Спасибо всем за помощь
терь осталось разобратся что за формат 13 ( format (13) ), попробую найти сам ) p.s. если не получится вернусь с вопросом в эту тему |
Сообщ.
#9
,
|
|
|
Цитата RealZ @ терь осталось разобратся что за формат 13 ( format (13) ), А где это Вы такое нашли? |
Сообщ.
#10
,
|
|
|
Опс вот это промах =\
иммелось ввижу FORMAT (4F14.4) |
Сообщ.
#11
,
|
|
|
Цитата RealZ @ Опс вот это промах =\ иммелось ввижу FORMAT (4F14.4) 4 числа с плавающей точкой по 14 символов, 4 из которых - после запятой. Похож на паскалевский :14:4 но не расширяет поле вывода, если число не умещается в отведенное число знаков, а заменяет все знаки звездочками. Если оператором print/write выводится больше чисел, то они печатаются по четыре числа в строке. |
Сообщ.
#12
,
|
|
|
Цитата andriano @ 4 числа с плавающей точкой по 14 символов, 4 из которых - после запятой. Похож на паскалевский :14:4 но не расширяет поле вывода, если число не умещается в отведенное число знаков, а заменяет все знаки звездочками. Если оператором print/write выводится больше чисел, то они печатаются по четыре числа в строке. Стоит, наверное, добавить пару деталей. Во-первых, символов будет не более 14 (но может быть и менее - тогда "лишние" позиции слева заменяются пробелами). Во-вторых, если в каждом случае будут заняты все 14 позиций, то между числами не окажется пробелов (или каких-либо других разделителей). |