Hello,
I have the following piece of code:
subroutine THOMAS_2D_NewType(IJmin, IJmax, & JImin, JImax, & di, dj, & THOMAS, & ANSWER, & ModelName) !Arguments------------------------------------------------------------- integer, intent(IN) :: IJmin, IJmax integer, intent(IN) :: JImin, JImax integer, intent(IN) :: di, dj type(T_THOMAS2D), pointer :: THOMAS real, dimension(:,:), pointer :: ANSWER character (len=*), optional :: ModelName !Local----------------------------------------------------------------- integer :: IJ, JI, II, MM, I, J type(T_VECGW), pointer :: VEC integer :: TID !$ integer :: CHUNK ! real :: AUX !Begin----------------------------------------------------------------- !$ CHUNK = CHUNK_J(IJmin,IJmax) ! !$OMP PARALLEL PRIVATE(TID,VEC,IJ,I,J,JI,II,MM,AUX) TID = 1 !$ TID = 1 + omp_get_thread_num() ! VEC => THOMAS%VEC(TID) !$OMP DO SCHEDULE(DYNAMIC,CHUNK) do2 : do IJ = IJmin, IJmax I = IJmin-1 + IJ*dj + di J = JImin-1 + IJ*di + dj VEC%W(JImin) = -THOMAS%COEF2%F(I, J)/THOMAS%COEF2%E(I, J) VEC%G(JImin) = THOMAS%TI(I, J) /THOMAS%COEF2%E(I, J) do3 : do JI=JImin+1,JImax+1 I = IJ*dj + JI*di J = IJ*di + JI*dj AUX = THOMAS%COEF2%E(I,J) + THOMAS%COEF2%D(I,J) * VEC%W(JI-1) if (abs(AUX) > 0) then VEC%W(JI) = -THOMAS%COEF2%F(I,J) / AUX VEC%G(JI) = (THOMAS%TI(I,J) - THOMAS%COEF2%D(I,J) * VEC%G(JI-1))/ AUX else VEC%W(JI) = 0. VEC%G(JI) = 0. write(*,*) 'ModelName I, J: ', trim(ModelName), '', I, J write(*,*) 'Error: Instability in THOMAS2D - ModuleFunctions - ERR10' end if end do do3 I = IJ * dj + (JImax+1) * di J = IJ * di + (JImax+1) * dj ANSWER(I, J) = VEC%G(JImax+1) do1 : do II = JImin+1, JImax+1 MM = JImax+JImin+1-II I = IJ*dj + MM*di J = IJ*di + MM*dj ANSWER(I,J) = VEC%W(MM) * ANSWER(I+di,J+dj) + VEC%G(MM) end do do1 end do do2 !$OMP END DO NOWAIT !$OMP END PARALLEL end subroutine THOMAS_2D_NewType
It compiles til the fortran version 14.0.3
From version 15 and up (til 16.0.1), this causes an ICE.
The ICE happens only on Linux. On Windows it compiles ok (up to 15.0.4, I do'nt have 16 and 16.0.1 on Windows).
Can you help me figure out if there is something wrong with this code?
Thanks in advance!
Eduardo