- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I'm working with this code (only for example):
Example 1:
DO I=1, TFACE1
Dtmp2=H(ELFACE2(I))-H(ELFACE1(I))
Dtmp1=DHX(ELFACE2(I))*RPQX(I)+DHY(ELFACE2(I))*RPQY(I)-Dtmp2
!Computing at point D
IF(Dtmp1*Dtmp2>0.0) THEN
HRD(I)=H(ELFACE2(I))-RDQPQ(I)*&
((Dtmp1**2.0+E)*Dtmp2+(Dtmp2**2.0+E)*Dtmp1)/(Dtmp1**2.0+Dtmp2**2.0+2.0*E)
ELSE
HRD(I)=H(ELFACE2(I))
END IF
Dtmp1=DHX(ELFACE1(I))*RPQX(I)+DHY(ELFACE1(I))*RPQY(I)-Dtmp2
!Computing at point D
IF(Dtmp1*Dtmp2>0.0) THEN
HLD(I)=H(ELFACE1(I))+RPDPQ(I)*&
((Dtmp1**2.0+E)*Dtmp2+(Dtmp2**2.0+E)*Dtmp1)/(Dtmp1**2.0+Dtmp2**2.0+2.0*E)
ELSE
HLD(I)=H(ELFACE1(I))
END IF
Dtmp2=ELV(ELFACE2(I))-ELV(ELFACE1(I))
Dtmp1=DELVX(ELFACE2(I))*RPQX(I)+DELVY(ELFACE2(I))*RPQY(I)-Dtmp2
!Computing at point D
IF(Dtmp1*Dtmp2>0.0) THEN
ELVRD(I)=ELV(ELFACE2(I))-RDQPQ(I)*&
((Dtmp1**2.0+E)*Dtmp2+(Dtmp2**2.0+E)*Dtmp1)/(Dtmp1**2.0+Dtmp2**2.0+2.0*E)
ELSE
ELVRD(I)=ELV(ELFACE2(I))
END IF
Dtmp1=DELVX(ELFACE1(I))*RPQX(I)+DELVY(ELFACE1(I))*RPQY(I)-Dtmp2
!Computing at point D
IF(Dtmp1*Dtmp2>0.0) THEN
ELVLD(I)=ELV(ELFACE1(I))+RPDPQ(I)*&
((Dtmp1**2.0+E)*Dtmp2+(Dtmp2**2.0+E)*Dtmp1)/(Dtmp1**2.0+Dtmp2**2.0+2.0*E)
ELSE
ELVLD(I)=ELV(ELFACE1(I))
END IF
!Computing at point M
HR(I)=HRD(I)+DHX(ELFACE2(I))*RDMX(I)+DHY(ELFACE2(I))*RDMY(I)
HL(I)=HLD(I)+DHX(ELFACE1(I))*RDMX(I)+DHY(ELFACE1(I))*RDMY(I)
ELVR(I)=ELVRD(I)+DELVX(ELFACE2(I))*RDMX(I)+DELVY(ELFACE2(I))*RDMY(I)
ELVL(I)=ELVLD(I)+DELVX(ELFACE1(I))*RDMX(I)+DELVY(ELFACE1(I))*RDMY(I)
END DO
Example 2:
DO I=1, TFACE1
FC1=ELFACE1(I)
FC2=ELFACE2(I)
DHC=H(FC2)-H(FC1)
DELVC=ELV(FC2)-ELV(FC1)
DHUPWR=DHX(FC2)*RPQX(I)+DHY(FC2)*RPQY(I)-DHC
DEUPWR=DELVX(FC2)*RPQX(I)+DELVY(FC2)*RPQY(I)-DELVC
DHUPWL=DHX(FC1)*RPQX(I)+DHY(FC1)*RPQY(I)-DHC
DEUPWL=DELVX(FC1)*RPQX(I)+DELVY(FC1)*RPQY(I)-DELVC
!Computing the function
AR=DHUPWR
AL=DHUPWL
B =DHC
IF(AR*B>0.0) THEN
LVAHR=((AR**2+E)*B+(B**2+E)*AR)/(AR**2+B**2+2*E)
ELSE
LVAHR=0.0
END IF
IF(AL*B>0.0) THEN
LVAHL=((AL**2+E)*B+(B**2+E)*AL)/(AL**2+B**2+2*E)
ELSE
LVAHL=0.0
END IF
AR=DEUPWR
AL=DEUPWL
B =DELVC
IF(AR*B>0.0) THEN
LVAER=((AR**2+E)*B+(B**2+E)*AR)/(AR**2+B**2+2*E)
ELSE
LVAER=0.0
END IF
IF(AL*B>0.0) THEN
LVAEL=((AL**2+E)*B+(B**2+E)*AL)/(AL**2+B**2+2*E)
ELSE
LVAEL=0.0
END IF
!Computing at point D
HRD(I)=H(FC2)-RDQPQ(I)*LVAHR
HLD(I)=H(FC1)+RPDPQ(I)*LVAHL
ELVRD(I)=ELV(FC2)-RDQPQ(I)*LVAER
ELVLD(I)=ELV(FC1)+RPDPQ(I)*LVAEL
!Computing at point M
HR(I)=HRD(I)+DHX(FC2)*RDMX(I)+DHY(FC2)*RDMY(I)
HL(I)=HLD(I)+DHX(FC1)*RDMX(I)+DHY(FC1)*RDMY(I)
ELVR(I)=ELVRD(I)+DELVX(FC2)*RDMX(I)+DELVY(FC2)*RDMY(I)
ELVL(I)=ELVLD(I)+DELVX(FC1)*RDMX(I)+DELVY(FC1)*RDMY(I)
END DO
FYI, these are only some parts of our code. I run the program with -O3 flag, and somehow I found that Example 1 gave the infinity results, while Example 2 gave the correct one, even I think (to my knowledge) at first glance they are same.
Does anyone know why it is different?
PS: if it's only just because I wrote any parts wrongly, please also let me know.
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
You are asking a question that is tough to answer, because many important details are missing.
You show two code fragments, each about 80 lines long, both of which contain calls to external functions whose properties you have not informed us about: for example, are the functions pure? Since you did not show any declarations, are we to assume that all variables and functions are implicitly typed? Some variables appear to have been renamed between the two versions, and that imposes an extra burden on the person doing a visual comparison of the two versions.
You said that one version gave infinite 'results'. Which of the numerous variables in the code are the 'results'? Do you obtain infinite values always, regardless of the values of those variables that should have been defined prior to executing the code fragment?
Compiler version, etc.?
Having a complete test case (that can be compiled and run) would facilitate understanding the problem.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
@mecej4: Thanks for the answer. I'm sorry if the code is too bad to see. The final variable results are not written on these codes. I can't post here all parts of codes, but the important thing is that if I used code on example 1 ( keeping all other parts of the codes same when compiling using example 2), the final variable results were infinity, while example 2 gave the correct results.
Example 1: The variable declarations are:
INTEGER::NEM,TFACE1,TFACE3W REAL::ERROR,Dtmp1,Dtmp2 INTEGER, DIMENSION(TFACE3W)::ELFACE1,ELFACE2 INTEGER, DIMENSION(TFACE1)::LMIN,RMIN,INDEKS5 REAL, DIMENSION(NEM)::DHX,DHY,DELVX,DELVY,DUX,DUY,DVX,DVY,H,ELV REAL, DIMENSION(TFACE3W)::RPQX,RPQY,RDMX,RDMY,RPDPQ,RDQPQ,HR,HL,ELVR,ELVL,UR,UL,VR,VL REAL, DIMENSION(TFACE1)::HRD,HLD,ELVRD,ELVLD,URD,ULD,VRD,VLD
Example 2: The variable declarations are:
INTEGER::NEM,TFACE1,TFACE3W,FC1,FC2 REAL::DHC,DELVC,B,E,DHUPWL,DEUPWL,AL,LVAHL,LVAEL,BR,BL,DHUPWR,DEUPWR,AR,LVAHR,LVAER INTEGER, DIMENSION(TFACE3W)::ELFACE1,ELFACE2 INTEGER, DIMENSION(TFACE1)::LMIN,RMIN,INDEKS5 REAL, DIMENSION(NEM)::DHX,DHY,DELVX,DELVY,DUX,DUY,DVX,DVY,H,ELV REAL, DIMENSION(TFACE3W)::RPQX,RPQY,RDMX,RDMY,RPDPQ,RDQPQ,HR,HL,ELVR,ELVL,UR,UL,VR,VL REAL, DIMENSION(TFACE1)::HRD,HLD,ELVRD,ELVLD,URD,ULD,VRD,VLD
In this case the parameters are:
NEM = 8800
TFACE1 = 12500
TFACE3W = 14000
ERROR = 10E-16
E = 10E-16
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I suggest you go back to the code that works, then incrementally introduce your "improvements". Run test at each step. This will inform you when the error was introduced.
Jim Dempsey
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
@Jim: Thanks for your suggestion. I've just done that. I did step by step and so when I changed (for example) this one:
new=old * ((AR**2+ERROR)*B+(B**2+ERROR)*AR)/(AR**2+B**2+2*ERROR)
with this one:
LV= ((AR**2+ERROR)*B+(B**2+ERROR)*AR)/(AR**2+B**2+2*ERROR) new=old * LV
then it worked well.
Do you have any recommendations? Thanks in advance.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
The this seems to indicate that variable LV is used after that statement (iow it is not set in first example).
Also note that if LV is local but SAVE, its prior value may be required upon next call.
Jim Dempsey
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I wrote again some parts of a code and somehow it looks like the following (for simplification)
INTEGER::J,K,TFACE1,TFACE3W,NEM
REAL::Dtmp1,Dtmp2
INTEGER, DIMENSION(TFACE3W)::ELFACE1,ELFACE2
REAL, DIMENSION(TFACE3W)::RDQPQ
REAL, DIMENSION(TFACE1)::HRD
REAL, DIMENSION(NEM)::H
ERROR=10E-16
DO I=1, TFACE1
J=ELFACE2(I)
K=ELFACE1(I)
Dtmp1=H(J)-H(K)
Dtmp2=DHX(J)*RPQX(I)+DHY(J)*RPQY(I)-DHC
IF(Dtmp1*Dtmp2>0.0) THEN
LV=((Dtmp1**2+ERROR)*Dtmp2+(Dtmp2**2+ERROR)*Dtmp1)/(Dtmp1**2+Dtmp2**2+2*ERROR)
HRD(I)=H(J)-RDQPQ(I)*LV
ELSE
HRD(I)=H(J)
END IF
END DO
The problem is,
- When I defined the variable
LVasREAL(KIND=4)orREAL(KIND=8)orREAL(KIND=16), the program gave the infinity results. - But, when I didn't define the variable LV at all, the program gave the correct result. I assume it was because of
ERROR = 10E-16, which is closely to machine accuracy, so the computer just wasn't be able to calculate it. But, why did it give me the correct results when I didn't define the variable at all? -
I have also tried the direct multiply like this:
HRD(I)=H(J)-RDQPQ(I)*((Dtmp1**2+ERROR)*Dtmp2+(Dtmp2**2+ERROR)*Dtmp1)/(Dtmp1**2+Dtmp2**2+2*ERROR)
But also it gave the infinity results. Well, for this case, it could be concluded since I declared variable Dtmp1 and Dtmp2 as REAL before.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
When you do not define LV
... .AND. ...
you are not using IMPLICIT NONE
... THEN ...
LV is of implicit type INTEGER
This will truncate the REAL expression to integer.
When you switched to the locally defined REAL, there is no truncation. So the value differs (when fractional component present in expresson).
Your former convergence code was likely wrong (unless you really need the truncation).
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