- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I can't solve the error of these lines in my code in fortran 77
DO j=1,n
s(j)=0.d0
IF (j==1)THEN
s(j)=s(j)+0.d0
ELSE IF (j==2)THEN
s(j)=s(1)+0.01d0
ELSE IF (j>=3)THEN
g=j-1.d0
s=s(g)+0.01d0
END IF
deltat(j)=s(j)
END DO
these errors appear
error #8093: A do-variable within a DO body shall not appear in a variable definition context.
error #6511: This DO variable has already been used as an outer DO variable in the same nesting structure.
I tried it in different ways, but I can't solve it
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
This is not the entire code - you have an outer DO-loop using the same variable j that you have not shown here. (Moreover: the code contains at least one Fortran 90 feature - DO/ENDDO - but that is not the cause of the errors).
Basically, you seem to have something like:
DO j = 1,10
DO j = 1,10
... do something useful
ENDDO
ENDDO
The repeated use of the variable j in both these DO-loop is what causes the trouble - such variables are more or less protected.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Is the variable g a scalar integer? If so, why do you set g = j - 1.d0, i.e., a real (double precision) expression, rather than the simpler expression j - 1? On the other hand, if g is real, why do you use it as a subscript in s(g)? In fact, the entire code that you presented could be replaced by
s(1) = 0.d0 do j = 2, n s(j) = s(j-1) + 0.01d0 end do delta(1:n) = s(1:n)
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Manfredini Bueno, Guilherme wrote:I can't solve the error of these lines in my code in fortran 77
.. I tried it in different ways, but I can't solve it
@Manfredini Bueno, Guilherme,
If you're using Intel Fortran, you have a very powerful, modern compiler available for your use. Given what you show in the original post, it may help you to review the Fortran language and then try to work on your code and solve the errors. You may want to consider starting with a textbook such as this one: https://www.amazon.com/FORTRAN-SCIENTISTS-ENGINEERS-Stephen-Chapman/dp/0073385891: ;
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
mecej4 (Blackbelt) wrote:Is the variable g a scalar integer? If so, why do you set g = j - 1.d0, i.e., a real (double precision) expression, rather than the simpler expression j - 1? On the other hand, if g is real, why do you use it as a subscript in s(g)? In fact, the entire code that you presented could be replaced by
s(1) = 0.d0 do j = 2, n s(j) = s(j-1) + 0.01d0 end do delta(1:n) = s(1:n)
I should caution in constructing deltas in the manner above. In the above case, in particular, 0.01d0 has a repeating binary fraction (mantissa), and thus cannot be expressed exactly in floating point (even in this case of use of double precision).
Example:
program HelloWorld2 implicit none integer, parameter :: n=100000 real(8) :: s(n), t(n), u(n) integer :: j, i s(1) = 0.d0 do j = 2, n s(j) = s(j-1) + 0.01d0 end do do j = 1, n t(j) = (j-1) * 0.01d0 end do do j = 1, n u(j) = real((j-1),kind(0.0d0)) / 100.d0 end do ! show first difference do j = 1, n if(s(j) /= t(j)) then print *, "s(j) /= t(j)", j, s(j), t(j), s(j)-t(j) exit end if end do do j = 1, n if(t(j) /= u(j)) then print *, "t(j) /= u(j)", j, t(j), u(j), t(j)-u(j) exit end if end do ! show print *, "do something at intervals of every 10.0 for s(j)" i = 0 do j = 1, n, 1000 if(mod(s(j), 10.0d0) == 0.0d0) then i = i + 1 ! something else print *, "mod(s(j), 10.0d0) /= 0.0d0)", j, s(j), mod(s(j), 10.0d0) endif end do print *, i, "intervals" print * print *, "do something at intervals of every 10.0 for t(j)" i = 0 do j = 1, n, 1000 if(mod(t(j), 10.0d0) == 0.0d0) then i = i + 1 ! something else print *, "mod(t(j), 10.0d0) /= 0.0d0)", j, t(j), mod(t(j), 10.0d0) endif end do print *, i, "intervals" print * print *, "do something at intervals of every 10.0 for u(j)" i = 0 do j = 1, n, 1000 if(mod(u(j), 10.0d0) == 0.0d0) then i = i + 1 ! something else print *, "mod(u(j), 10.0d0) /= 0.0d0)", j, u(j), mod(u(j), 10.0d0) endif end do print *, i, "intervals" end program HelloWorld2 =========== output ============= s(j) /= t(j) 7 6.000000000000000E-002 6.000000000000000E-002 6.938893903907228E-018 t(j) /= u(j) 36 0.350000000000000 0.350000000000000 5.551115123125783E-017 do something at intervals of every 10.0 for s(j) mod(s(j), 10.0d0) /= 0.0d0) 1001 9.99999999999983 9.99999999999983 mod(s(j), 10.0d0) /= 0.0d0) 2001 20.0000000000003 3.268496584496461E-013 mod(s(j), 10.0d0) /= 0.0d0) 3001 30.0000000000019 1.890043677121866E-012 mod(s(j), 10.0d0) /= 0.0d0) 4001 40.0000000000006 6.110667527536862E-013 mod(s(j), 10.0d0) /= 0.0d0) 5001 49.9999999999986 9.99999999999862 mod(s(j), 10.0d0) /= 0.0d0) 6001 59.9999999999966 9.99999999999663 mod(s(j), 10.0d0) /= 0.0d0) 7001 69.9999999999989 9.99999999999891 mod(s(j), 10.0d0) /= 0.0d0) 8001 80.0000000000040 4.021671884402167E-012 mod(s(j), 10.0d0) /= 0.0d0) 9001 90.0000000000091 9.137579581874888E-012 mod(s(j), 10.0d0) /= 0.0d0) 10001 100.000000000014 1.425348727934761E-011 mod(s(j), 10.0d0) /= 0.0d0) 11001 110.000000000019 1.936939497682033E-011 mod(s(j), 10.0d0) /= 0.0d0) 12001 120.000000000024 2.448530267429305E-011 mod(s(j), 10.0d0) /= 0.0d0) 13001 130.000000000027 2.674482857401017E-011 mod(s(j), 10.0d0) /= 0.0d0) 14001 140.000000000018 1.764988155628089E-011 mod(s(j), 10.0d0) /= 0.0d0) 15001 150.000000000009 8.554934538551606E-012 mod(s(j), 10.0d0) /= 0.0d0) 16001 159.999999999999 9.99999999999946 mod(s(j), 10.0d0) /= 0.0d0) 17001 169.999999999990 9.99999999999037 mod(s(j), 10.0d0) /= 0.0d0) 18001 179.999999999981 9.99999999998127 mod(s(j), 10.0d0) /= 0.0d0) 19001 189.999999999972 9.99999999997218 mod(s(j), 10.0d0) /= 0.0d0) 20001 199.999999999963 9.99999999996308 mod(s(j), 10.0d0) /= 0.0d0) 21001 209.999999999954 9.99999999995399 mod(s(j), 10.0d0) /= 0.0d0) 22001 219.999999999945 9.99999999994489 mod(s(j), 10.0d0) /= 0.0d0) 23001 229.999999999936 9.99999999993580 mod(s(j), 10.0d0) /= 0.0d0) 24001 239.999999999927 9.99999999992670 mod(s(j), 10.0d0) /= 0.0d0) 25001 249.999999999918 9.99999999991761 mod(s(j), 10.0d0) /= 0.0d0) 26001 259.999999999909 9.99999999990854 mod(s(j), 10.0d0) /= 0.0d0) 27001 269.999999999899 9.99999999989944 mod(s(j), 10.0d0) /= 0.0d0) 28001 279.999999999890 9.99999999989035 mod(s(j), 10.0d0) /= 0.0d0) 29001 289.999999999881 9.99999999988125 mod(s(j), 10.0d0) /= 0.0d0) 30001 299.999999999872 9.99999999987216 mod(s(j), 10.0d0) /= 0.0d0) 31001 309.999999999863 9.99999999986306 mod(s(j), 10.0d0) /= 0.0d0) 32001 319.999999999854 9.99999999985397 mod(s(j), 10.0d0) /= 0.0d0) 33001 329.999999999845 9.99999999984487 mod(s(j), 10.0d0) /= 0.0d0) 34001 339.999999999836 9.99999999983578 mod(s(j), 10.0d0) /= 0.0d0) 35001 349.999999999827 9.99999999982668 mod(s(j), 10.0d0) /= 0.0d0) 36001 359.999999999818 9.99999999981759 mod(s(j), 10.0d0) /= 0.0d0) 37001 369.999999999808 9.99999999980849 mod(s(j), 10.0d0) /= 0.0d0) 38001 379.999999999799 9.99999999979940 mod(s(j), 10.0d0) /= 0.0d0) 39001 389.999999999790 9.99999999979030 mod(s(j), 10.0d0) /= 0.0d0) 40001 399.999999999781 9.99999999978121 mod(s(j), 10.0d0) /= 0.0d0) 41001 409.999999999772 9.99999999977211 mod(s(j), 10.0d0) /= 0.0d0) 42001 419.999999999763 9.99999999976302 mod(s(j), 10.0d0) /= 0.0d0) 43001 429.999999999754 9.99999999975392 mod(s(j), 10.0d0) /= 0.0d0) 44001 439.999999999745 9.99999999974483 mod(s(j), 10.0d0) /= 0.0d0) 45001 449.999999999736 9.99999999973573 mod(s(j), 10.0d0) /= 0.0d0) 46001 459.999999999727 9.99999999972664 mod(s(j), 10.0d0) /= 0.0d0) 47001 469.999999999718 9.99999999971755 mod(s(j), 10.0d0) /= 0.0d0) 48001 479.999999999708 9.99999999970845 mod(s(j), 10.0d0) /= 0.0d0) 49001 489.999999999699 9.99999999969936 mod(s(j), 10.0d0) /= 0.0d0) 50001 499.999999999690 9.99999999969026 mod(s(j), 10.0d0) /= 0.0d0) 51001 509.999999999681 9.99999999968117 mod(s(j), 10.0d0) /= 0.0d0) 52001 519.999999999672 9.99999999967213 mod(s(j), 10.0d0) /= 0.0d0) 53001 529.999999999663 9.99999999966303 mod(s(j), 10.0d0) /= 0.0d0) 54001 539.999999999654 9.99999999965394 mod(s(j), 10.0d0) /= 0.0d0) 55001 549.999999999645 9.99999999964484 mod(s(j), 10.0d0) /= 0.0d0) 56001 559.999999999636 9.99999999963575 mod(s(j), 10.0d0) /= 0.0d0) 57001 569.999999999627 9.99999999962665 mod(s(j), 10.0d0) /= 0.0d0) 58001 579.999999999618 9.99999999961756 mod(s(j), 10.0d0) /= 0.0d0) 59001 589.999999999608 9.99999999960846 mod(s(j), 10.0d0) /= 0.0d0) 60001 599.999999999599 9.99999999959937 mod(s(j), 10.0d0) /= 0.0d0) 61001 609.999999999590 9.99999999959027 mod(s(j), 10.0d0) /= 0.0d0) 62001 619.999999999581 9.99999999958118 mod(s(j), 10.0d0) /= 0.0d0) 63001 629.999999999572 9.99999999957208 mod(s(j), 10.0d0) /= 0.0d0) 64001 639.999999999563 9.99999999956299 mod(s(j), 10.0d0) /= 0.0d0) 65001 649.999999999554 9.99999999955389 mod(s(j), 10.0d0) /= 0.0d0) 66001 659.999999999545 9.99999999954480 mod(s(j), 10.0d0) /= 0.0d0) 67001 669.999999999536 9.99999999953570 mod(s(j), 10.0d0) /= 0.0d0) 68001 679.999999999527 9.99999999952661 mod(s(j), 10.0d0) /= 0.0d0) 69001 689.999999999518 9.99999999951751 mod(s(j), 10.0d0) /= 0.0d0) 70001 699.999999999508 9.99999999950842 mod(s(j), 10.0d0) /= 0.0d0) 71001 709.999999999499 9.99999999949932 mod(s(j), 10.0d0) /= 0.0d0) 72001 719.999999999490 9.99999999949023 mod(s(j), 10.0d0) /= 0.0d0) 73001 729.999999999481 9.99999999948113 mod(s(j), 10.0d0) /= 0.0d0) 74001 739.999999999472 9.99999999947204 mod(s(j), 10.0d0) /= 0.0d0) 75001 749.999999999463 9.99999999946294 mod(s(j), 10.0d0) /= 0.0d0) 76001 759.999999999454 9.99999999945385 mod(s(j), 10.0d0) /= 0.0d0) 77001 769.999999999445 9.99999999944475 mod(s(j), 10.0d0) /= 0.0d0) 78001 779.999999999436 9.99999999943566 mod(s(j), 10.0d0) /= 0.0d0) 79001 789.999999999427 9.99999999942656 mod(s(j), 10.0d0) /= 0.0d0) 80001 799.999999999417 9.99999999941747 mod(s(j), 10.0d0) /= 0.0d0) 81001 809.999999999408 9.99999999940837 mod(s(j), 10.0d0) /= 0.0d0) 82001 819.999999999399 9.99999999939928 mod(s(j), 10.0d0) /= 0.0d0) 83001 829.999999999390 9.99999999939018 mod(s(j), 10.0d0) /= 0.0d0) 84001 839.999999999381 9.99999999938109 mod(s(j), 10.0d0) /= 0.0d0) 85001 849.999999999372 9.99999999937199 mod(s(j), 10.0d0) /= 0.0d0) 86001 859.999999999363 9.99999999936290 mod(s(j), 10.0d0) /= 0.0d0) 87001 869.999999999354 9.99999999935380 mod(s(j), 10.0d0) /= 0.0d0) 88001 879.999999999345 9.99999999934471 mod(s(j), 10.0d0) /= 0.0d0) 89001 889.999999999336 9.99999999933561 mod(s(j), 10.0d0) /= 0.0d0) 90001 899.999999999327 9.99999999932652 mod(s(j), 10.0d0) /= 0.0d0) 91001 909.999999999317 9.99999999931742 mod(s(j), 10.0d0) /= 0.0d0) 92001 919.999999999308 9.99999999930833 mod(s(j), 10.0d0) /= 0.0d0) 93001 929.999999999299 9.99999999929923 mod(s(j), 10.0d0) /= 0.0d0) 94001 939.999999999290 9.99999999929014 mod(s(j), 10.0d0) /= 0.0d0) 95001 949.999999999281 9.99999999928104 mod(s(j), 10.0d0) /= 0.0d0) 96001 959.999999999272 9.99999999927195 mod(s(j), 10.0d0) /= 0.0d0) 97001 969.999999999263 9.99999999926285 mod(s(j), 10.0d0) /= 0.0d0) 98001 979.999999999254 9.99999999925376 mod(s(j), 10.0d0) /= 0.0d0) 99001 989.999999999245 9.99999999924466 1 intervals do something at intervals of every 10.0 for t(j) 100 intervals do something at intervals of every 10.0 for u(j) 100 intervals
While the difference is not large (in fact it is quite tiny), this difference may become significant to the proper running of your program when the iteration count is expected (required) to fall on specific intervals.
The simplified "s(j-1)+ 0.01" is insufficient to meet this requirement.
While the "(j-1) * 0.01d0" is producing expected results, this potentially is by accident, not design.
The "real((j-1),kind(0.0d0)) / 100.d0" assures the computational arguments do not contain repeating fractions (provided the compiler optimization does not turn this into *.01d0.
In the case of computing T from dT the (j-1)*dT is sufficient
However for interval anniversary, it would be best to use integer values. In this example "T" would be expressed in 100ths of seconds and not seconds.
Jim Dempsey
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page